Add tests for IssueExtractor

Change-Id: Ie62cba8382880e4b7aad4de38a21d6acea7dcdbe
diff --git a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java
new file mode 100644
index 0000000..f1290ea
--- /dev/null
+++ b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java
@@ -0,0 +1,192 @@
+// 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.hooks.util;
+
+import static org.easymock.EasyMock.expect;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jgit.lib.Config;
+
+import com.google.gerrit.server.config.FactoryModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.googlesource.gerrit.plugins.hooks.its.ItsName;
+import com.googlesource.gerrit.plugins.hooks.testutil.LoggingMockingTestCase;
+
+public class IssueExtractorTest extends LoggingMockingTestCase {
+  private Injector injector;
+  private Config serverConfig;
+
+  public void testPatternNullMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn(null).atLeastOnce();
+
+    replayMocks();
+
+    assertNull("Pattern for null match is not null",
+        issueExtractor.getPattern());
+  }
+
+  public void testPattern() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("TestPattern").atLeastOnce();
+
+    replayMocks();
+
+    assertEquals("Expected and generated pattern are not equal",
+        "TestPattern", issueExtractor.getPattern().pattern());
+  }
+
+  public void testIssueIdsNullPattern() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .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(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Test");
+    assertEquals("Number of found ids do not match", 0, ret.length);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsFullMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").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(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").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(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#\\d+").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 testIssueIdsMultiGroupMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d)(\\d+)").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 testIssueIdsMulipleMatches() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").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(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").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");
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+
+    injector = Guice.createInjector(new TestModule());
+  }
+
+  private class TestModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      bind(String.class).annotatedWith(ItsName.class)
+          .toInstance("ItsTestName");
+
+      serverConfig = createMock(Config.class);
+      bind(Config.class).annotatedWith(GerritServerConfig.class)
+          .toInstance(serverConfig);
+    }
+  }
+}
\ No newline at end of file