// 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.easymock.EasyMock.expect;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.PatchSetAccess;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gwtorm.server.OrmException;
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 java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({PatchSet.class, RevId.class})
public class IssueExtractorTest extends LoggingMockingTestCase {
  private Injector injector;
  private ItsConfig itsConfig;
  private CommitMessageFetcher commitMessageFetcher;
  private ReviewDb db;

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

    expect(itsConfig.getIssuePattern()).andReturn(null).atLeastOnce();

    replayMocks();

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

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

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

    assertLogMessageContains("Matching");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(X*)(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

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

    assertLogMessageContains("Matching");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#\\d+")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(0).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d)(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d)(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(2).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

    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");
  }

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

    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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");

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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");

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

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

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn("");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn("\n");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn("\n\n");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn("\n\n\n");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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");

    replayMocks();

    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");
  }

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

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn("");

    replayMocks();

    PatchSet.Id patchSetId = new PatchSet.Id(new 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");
  }

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

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

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

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(1).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondEmpty() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

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

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

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

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondSame() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

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

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "9876543211987654321298765432139876543214"))
        .andReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondBody() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

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

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "9876543211987654321298765432139876543214"))
        .andReturn(
            "subject\n"
                + "bug#42\n"
                + "\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedSingleSubjectIssueSecondFooter() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

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

    // Call for previous patch set
    PatchSet.Id previousPatchSetId = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "9876543211987654321298765432139876543214"))
        .andReturn("bug#42\n" + "\n" + "Change-Id: I9876543211987654321298765432139876543214");

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedSubjectFooter() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

    // Call for current patch set
    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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 = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "9876543211987654321298765432139876543214"))
        .andReturn(
            "subject\n"
                + "bug#42\n"
                + "\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

  public void testIssueIdsCommitWAddedMultiple() throws OrmException {
    expect(itsConfig.getIssuePattern()).andReturn(Pattern.compile("bug#(\\d+)")).atLeastOnce();
    expect(itsConfig.getIssuePatternGroupIndex()).andReturn(1).atLeastOnce();

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

    // Call for current patch set
    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "1234567891123456789212345678931234567894"))
        .andReturn(
            "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 = new PatchSet.Id(changeId, 1);
    RevId previousRevId = createMock(RevId.class);
    expect(previousRevId.get()).andReturn("9876543211987654321298765432139876543214").anyTimes();

    PatchSet previousPatchSet = createMock(PatchSet.class);
    expect(previousPatchSet.getRevision()).andReturn(previousRevId).anyTimes();

    PatchSetAccess patchSetAccess = createMock(PatchSetAccess.class);
    expect(patchSetAccess.get(previousPatchSetId)).andReturn(previousPatchSet);

    expect(
            commitMessageFetcher.fetchGuarded(
                "testProject", "9876543211987654321298765432139876543214"))
        .andReturn(
            "subject\n"
                + "bug#42 bug#4711\n"
                + "\n"
                + "Bug: bug#16\n"
                + "Change-Id: I9876543211987654321298765432139876543214");

    expect(db.patchSets()).andReturn(patchSetAccess);

    PatchSet.Id currentPatchSetId = createMock(PatchSet.Id.class);
    expect(currentPatchSetId.get()).andReturn(2).anyTimes();
    expect(currentPatchSetId.getParentKey()).andReturn(changeId).anyTimes();

    replayMocks();

    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");
  }

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

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

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

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

      db = createMock(ReviewDb.class);
      bind(ReviewDb.class).toInstance(db);
    }
  }
}
