// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.googlesource.gerrit.plugins.its.base.util;

import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.googlesource.gerrit.plugins.its.base.its.ItsConfig;
import com.googlesource.gerrit.plugins.its.base.testutil.LoggingMockingTestCase;
import com.googlesource.gerrit.plugins.its.base.util.IssueExtractor.PatchSetDb;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

public class IssueExtractorTest extends LoggingMockingTestCase {
  private Injector injector;
  private ItsConfig itsConfig;
  private CommitMessageFetcher commitMessageFetcher;
  private PatchSetDb db;

  public void testIssueIdsNullPattern() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    String[] ret = issueExtractor.getIssueIds("Test");
    assertEquals("Number of found ids do not match", 0, ret.length);

    verifyOneOrMore(itsConfig).getIssuePattern();
  }

  public void testIssueIdsNoMatch() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("Test");
    assertEquals("Number of found ids do not match", 0, ret.length);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsEmptyGroup() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(X*)(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("bug#4711");
    assertEquals("Number of found ids do not match", 0, ret.length);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsFullMatch() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("bug#4711");
    assertEquals("Number of found ids do not match", 1, ret.length);
    assertEquals("First found issue id do not match", "4711", ret[0]);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsMatch() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
    assertEquals("Number of found ids do not match", 1, ret.length);
    assertEquals("Found issue id does not match", "4711", ret[0]);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsGrouplessMatch() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#\\d+"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(0);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
    assertEquals("Number of found ids do not match", 1, ret.length);
    assertEquals("Found issue id does not match", "bug#4711", ret[0]);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsMultiGroupMatchGroup1() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d)(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
    assertEquals("Number of found ids do not match", 1, ret.length);
    assertEquals("Found issue id does not match", "4", ret[0]);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsMultiGroupMatchGroup2() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d)(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(2);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bar");
    assertEquals("Number of found ids do not match", 1, ret.length);
    assertEquals("Found issue id does not match", "711", ret[0]);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsMulipleMatches() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar bug#123");
    assertEquals("Number of found ids do not match", 3, ret.length);
    List<String> retList = Arrays.asList(ret);
    assertTrue("4711 not among the extracted ids", retList.contains("4711"));
    assertTrue("42 not among the extracted ids", retList.contains("42"));
    assertTrue("123 not among the extracted ids", retList.contains("123"));

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsMulipleMatchesWithDuplicates() {
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);

    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    String[] ret = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar\n" + "bug#123 baz bug#42");
    assertEquals("Number of found ids do not match", 3, ret.length);
    List<String> retList = Arrays.asList(ret);
    assertTrue("4711 not among the extracted ids", retList.contains("4711"));
    assertTrue("42 not among the extracted ids", retList.contains("42"));
    assertTrue("123 not among the extracted ids", retList.contains("123"));

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitSingleIssue() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitMultipleIssues() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "bug#42, and bug#4711\n"
                + "\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("4711", Sets.newHashSet("somewhere", "subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitMultipleIssuesMultipleTimes() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "bug#42, bug#4711, bug#4711, bug#42, and bug#4711\n"
                + "\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("4711", Sets.newHashSet("somewhere", "subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitSingleIssueBody() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject does not reference a bug\n"
                + "Body references bug#42\n"
                + "\n"
                + "Footer: does not reference a bug\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "body"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitSingleIssueFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject does not reference a bug\n"
                + "Body does not reference a bug\n"
                + "\n"
                + "Footer: references bug#42\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "footer", "footer-Footer"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitMultipleIssuesFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject does not reference a bug\n"
                + "Body does not reference a bug\n"
                + "\n"
                + "KeyA: references bug#42\n"
                + "KeyB: does not reference bug\n"
                + "KeyC: references bug#176\n"
                + "Unkeyed reference to bug#4711\n"
                + "Change-Id: I1234567891123456789212345678931234567894\n"
                + "KeyZ: references bug#256");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "footer", "footer-KeyA"));
    expected.put("176", Sets.newHashSet("somewhere", "footer", "footer-KeyC"));
    expected.put("256", Sets.newHashSet("somewhere", "footer", "footer-KeyZ"));
    expected.put("4711", Sets.newHashSet("somewhere", "footer"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentParts() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n"
                + "\n"
                + "Bug: bug#4711 in footer\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsEmptySubject() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n"
                + "\n"
                + "Bug: bug#4711 in footer\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsLinePastFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n"
                + "\n"
                + "Bug: bug#4711 in footer\n"
                + "Change-Id: I1234567891123456789212345678931234567894\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsLinesPastFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n"
                + "\n"
                + "Bug: bug#4711 in footer\n"
                + "Change-Id: I1234567891123456789212345678931234567894\n"
                + "\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsNoFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsNoFooterTrailingLine() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitDifferentPartsNoFooterTrailingLines() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject references bug#42.\n"
                + "Body references bug#16.\n"
                + "Body also references bug#176.\n"
                + "\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "body"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitEmpty() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitBlankLine() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitBlankLines() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("\n\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitMoreBlankLines() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("\n\n\n");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitMixed() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "Subject bug#42, bug#1984, and bug#16\n"
                + "\n"
                + "bug#4711 in body,\n"
                + "along with bug#1984, and bug#5150.\n"
                + "bug#4711 in body again, along with bug#16\n"
                + "\n"
                + "Bug: bug#176, bug#1984, and bug#5150\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds("testProject", "1234567891123456789212345678931234567894");

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "subject", "body"));
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    expected.put("176", Sets.newHashSet("somewhere", "footer", "footer-Bug"));
    expected.put("1984", Sets.newHashSet("somewhere", "subject", "body", "footer", "footer-Bug"));
    expected.put("4711", Sets.newHashSet("somewhere", "body"));
    expected.put("5150", Sets.newHashSet("somewhere", "body", "footer", "footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedEmptyFirst() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("");

    PatchSet.Id patchSetId = PatchSet.id(Change.id(4), 1);
    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", patchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueFirst() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(1);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject", "added@somewhere", "added@subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondEmpty() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn("subject\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject", "added@somewhere", "added@subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondSame() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");

    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondBody() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn(
            "subject\n"
                + "bug#42\n"
                + "\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("42", Sets.newHashSet("somewhere", "subject", "added@subject"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "subject\n"
                + "\n"
                + "Bug: bug#42\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");

    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put(
        "42",
        Sets.newHashSet("somewhere", "footer", "added@footer", "footer-Bug", "added@footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedSubjectFooter() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "subject bug#42\n"
                + "\n"
                + "body bug#42\n"
                + "\n"
                + "Bug: bug#42\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn(
            "subject\n"
                + "bug#42\n"
                + "\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put(
        "42",
        Sets.newHashSet(
            "somewhere",
            "subject",
            "added@subject",
            "body",
            "footer",
            "added@footer",
            "footer-Bug",
            "added@footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  public void testIssueIdsCommitWAddedMultiple() {
    when(itsConfig.getIssuePattern()).thenReturn(Pattern.compile("bug#(\\d+)"));
    when(itsConfig.getIssuePatternGroupIndex()).thenReturn(1);

    Change.Id changeId = mock(Change.Id.class);

    // Call for current patch set
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "1234567891123456789212345678931234567894"))
        .thenReturn(
            "subject bug#42\n"
                + "\n"
                + "body bug#42 bug#16\n"
                + "\n"
                + "Bug: bug#42\n"
                + "Change-Id: I1234567891123456789212345678931234567894");

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = PatchSet.id(changeId, 1);
    when(commitMessageFetcher.fetchGuarded(
            "testProject", "9876543211987654321298765432139876543214"))
        .thenReturn(
            "subject\n"
                + "bug#42 bug#4711\n"
                + "\n"
                + "Bug: bug#16\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    when(db.getRevision(previousPatchSetId)).thenReturn("9876543211987654321298765432139876543214");

    PatchSet.Id currentPatchSetId = mock(PatchSet.Id.class);
    when(currentPatchSetId.get()).thenReturn(2);
    when(currentPatchSetId.changeId()).thenReturn(changeId);

    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
    Map<String, Set<String>> actual =
        issueExtractor.getIssueIds(
            "testProject", "1234567891123456789212345678931234567894", currentPatchSetId);

    Map<String, Set<String>> expected = Maps.newHashMap();
    expected.put("16", Sets.newHashSet("somewhere", "body", "added@body"));
    expected.put(
        "42",
        Sets.newHashSet(
            "somewhere",
            "subject",
            "added@subject",
            "body",
            "footer",
            "added@footer",
            "footer-Bug",
            "added@footer-Bug"));
    assertEquals("Extracted issues do not match", expected, actual);

    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");
    assertLogMessageContains("Matching");

    verifyOneOrMore(itsConfig).getIssuePattern();
    verifyOneOrMore(itsConfig).getIssuePatternGroupIndex();
  }

  private <T> T verifyOneOrMore(T mock) {
    return verify(mock, atLeastOnce());
  }

  @Override
  public void setUp() throws Exception {
    super.setUp();

    injector = Guice.createInjector(new TestModule());
  }

  private class TestModule extends FactoryModule {
    @Override
    protected void configure() {
      itsConfig = mock(ItsConfig.class);
      bind(ItsConfig.class).toInstance(itsConfig);

      commitMessageFetcher = mock(CommitMessageFetcher.class);
      bind(CommitMessageFetcher.class).toInstance(commitMessageFetcher);

      db = mock(PatchSetDb.class);
      bind(PatchSetDb.class).toInstance(db);
    }
  }
}
