Expand ItsConfig tests

Test more settings of isEnabled on refs and events, and also check log
output.

Change-Id: Icb8be1fe9b4589c5d51e0ecd78a80875337d37bc
diff --git a/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
index 72d229c..ea3671c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
@@ -15,131 +15,415 @@
 package com.googlesource.gerrit.plugins.hooks.its;
 
 import static org.easymock.EasyMock.expect;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
+import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.FactoryModule;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.data.ChangeAttribute;
 import com.google.gerrit.server.events.PatchSetCreatedEvent;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 
-import org.easymock.EasyMockSupport;
-import org.junit.Before;
-import org.junit.Test;
+import com.googlesource.gerrit.plugins.hooks.testutil.LoggingMockingTestCase;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 
-public class ItsConfigTest {
-  private EasyMockSupport easyMock;
-  private String pluginName = "its-base";
-  private PluginConfig pluginConfig;
-  private PluginConfig pluginConfigWithInheritance;
-  private ItsConfig itsConfig;
-  private PatchSetCreatedEvent pscEvent;
+public class ItsConfigTest extends LoggingMockingTestCase {
+  private Injector injector;
 
-  @Before
-  public void setup() {
-    easyMock = new EasyMockSupport();
-    ProjectCache projectCache = easyMock.createNiceMock(ProjectCache.class);
-    PluginConfigFactory pluginCfgFactory = easyMock.createNiceMock(PluginConfigFactory.class);
-    ProjectState projectState = easyMock.createNiceMock(ProjectState.class);
-    pluginConfig = easyMock.createNiceMock(PluginConfig.class);
-    pluginConfigWithInheritance = easyMock.createNiceMock(PluginConfig.class);
-    itsConfig = new ItsConfig(pluginName, projectCache, pluginCfgFactory);
+  private ProjectCache projectCache;
+  private PluginConfigFactory pluginConfigFactory;
 
-    pscEvent = new PatchSetCreatedEvent();
-    pscEvent.change = new ChangeAttribute();
-    pscEvent.change.project = "testProject";
-    pscEvent.change.branch = "testBranch";
-    ArrayList<ProjectState> listProjectState = new ArrayList<>(1);
-    listProjectState.add(projectState);
+  public void setupIsEnabled(String enabled, String parentEnabled,
+      String[] branches) {
+    ProjectState projectState = createMock(ProjectState.class);
 
-    expect(projectCache.get(new Project.NameKey("testProject"))).andReturn(
-        projectState).once();
-    expect(projectState.treeInOrder()).andReturn(listProjectState);
-    expect(pluginCfgFactory.getFromProjectConfig(projectState, pluginName))
-    .andStubReturn(pluginConfig);
-    expect(
-        pluginCfgFactory.getFromProjectConfigWithInheritance(projectState,
-            pluginName)).andStubReturn(pluginConfigWithInheritance);
+    expect(projectCache.get(new Project.NameKey("testProject")))
+        .andReturn(projectState).anyTimes();
+    expect(projectCache.get(new Project.NameKey("parentProject")))
+        .andReturn(projectState).anyTimes();
+
+    Iterable<ProjectState> parents;
+    if (parentEnabled == null) {
+      parents = Arrays.asList(projectState);
+    } else {
+      ProjectState parentProjectState = createMock(ProjectState.class);
+
+      PluginConfig parentPluginConfig = createMock(PluginConfig.class);
+
+      expect(pluginConfigFactory.getFromProjectConfig(
+          parentProjectState, "ItsTestName")).andReturn(parentPluginConfig);
+
+      expect(parentPluginConfig.getString("enabled")).andReturn(parentEnabled)
+          .anyTimes();
+
+      PluginConfig parentPluginConfigWI = createMock(PluginConfig.class);
+
+      expect(pluginConfigFactory.getFromProjectConfigWithInheritance(
+          parentProjectState, "ItsTestName")).andReturn(parentPluginConfigWI)
+          .anyTimes();
+
+      String[] parentBranches = { "refs/heads/testBranch" };
+      expect(parentPluginConfigWI.getStringList("branch"))
+          .andReturn(parentBranches).anyTimes();
+
+      parents = Arrays.asList(parentProjectState, projectState);
+    }
+    expect(projectState.treeInOrder()).andReturn(parents);
+
+    PluginConfig pluginConfig = createMock(PluginConfig.class);
+
+    expect(pluginConfigFactory.getFromProjectConfig(
+        projectState, "ItsTestName")).andReturn(pluginConfig).anyTimes();
+
+    expect(pluginConfig.getString("enabled")).andReturn(enabled).anyTimes();
+
+    PluginConfig pluginConfigWI = createMock(PluginConfig.class);
+
+    expect(pluginConfigFactory.getFromProjectConfigWithInheritance(
+        projectState, "ItsTestName")).andReturn(pluginConfigWI).anyTimes();
+
+    expect(pluginConfigWI.getBoolean("enabled", false))
+        .andReturn("true".equals(enabled)).anyTimes();
+
+    expect(pluginConfigWI.getStringList("branch")).andReturn(branches)
+        .anyTimes();
   }
 
-  @Test
-  public void testEnforcedWithRegex() {
-    String[] refPatterns = {"^refs/heads/test.*"};
-    setUpEnforced(refPatterns);
+  public void testIsEnabledRefNoParentNoBranchEnabled() {
+    String[] branches = {};
+    setupIsEnabled("true", null, branches);
 
-    assertTrue(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testEnforcedWithExact() {
-    String[] refPatterns = {"refs/heads/testBranch"};
-    setUpEnforced(refPatterns);
+  public void testIsEnabledRefNoParentNoBranchDisabled() {
+    String[] branches = {};
+    setupIsEnabled("false", null, branches);
 
-    assertTrue(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testEnforcedForAll() {
-    String[] refPatterns = new String[0];
-    setUpEnforced(refPatterns);
+  public void testIsEnabledRefNoParentNoBranchEnforced() {
+    String[] branches = {};
+    setupIsEnabled("enforced", null, branches);
 
-    assertTrue(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testEnabledWithRegex() {
-    String[] refPatterns = {"^refs/heads/test.*"};
-    setUpEnabled(refPatterns);
+  public void testIsEnabledRefNoParentMatchingBranchEnabled() {
+    String[] branches = {"^refs/heads/test.*"};
+    setupIsEnabled("true", null, branches);
 
-    assertTrue(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testEnabledWithExact() {
-    String[] refPatterns = {"refs/heads/testBranch"};
-    setUpEnabled(refPatterns);
+  public void testIsEnabledRefNoParentMatchingBranchDisabled() {
+    String[] branches = {"^refs/heads/test.*"};
+    setupIsEnabled("false", null, branches);
 
-    assertTrue(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testDisabled() {
-    String[] refPatterns = {"refs/heads/testBranch1"};
-    setUpEnabled(refPatterns);
+  public void testIsEnabledRefNoParentMatchingBranchEnforced() {
+    String[] branches = {"^refs/heads/test.*"};
+    setupIsEnabled("enforced", null, branches);
 
-    assertFalse(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  @Test
-  public void testInvalidPattern() {
-    String[] refPatterns = {"testBranch"};
-    setUpEnabled(refPatterns);
+  public void testIsEnabledRefNoParentNonMatchingBranchEnabled() {
+    String[] branches = {"^refs/heads/foo.*"};
+    setupIsEnabled("true", null, branches);
 
-    assertFalse(itsConfig.isEnabled(pscEvent));
-    easyMock.verifyAll();
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  private void setUpEnforced(String[] refPatterns) {
-    expect(pluginConfig.getString("enabled")).andReturn("enforced").once();
-    expect(pluginConfigWithInheritance.getStringList("branch")).andReturn(refPatterns);
-    easyMock.replayAll();
+  public void testIsEnabledRefNoParentNonMatchingBranchDisabled() {
+    String[] branches = {"^refs/heads/foo.*"};
+    setupIsEnabled("false", null, branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
   }
 
-  private void setUpEnabled(String[] refPatterns) {
-    expect(pluginConfig.getString("enabled")).andReturn("true");
-    expect(pluginConfigWithInheritance.getBoolean("enabled", false)).andReturn(true);
-    expect(pluginConfigWithInheritance.getStringList("branch")).andReturn(refPatterns);
-    easyMock.replayAll();
+  public void testIsEnabledRefNoParentNonMatchingBranchEnforced() {
+    String[] branches = {"^refs/heads/foo.*"};
+    setupIsEnabled("enforced", null, branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefNoParentMatchingBranchMiddleEnabled() {
+    String[] branches = {"^refs/heads/foo.*", "^refs/heads/test.*", "^refs/heads/baz.*"};
+    setupIsEnabled("true", null, branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefNoParentMatchingBranchMiddleDisabled() {
+    String[] branches = {"^refs/heads/foo.*", "^refs/heads/test.*", "^refs/heads/baz.*"};
+    setupIsEnabled("false", null, branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefNoParentMatchingBranchMiddleEnforced() {
+    String[] branches = {"^refs/heads/foo.*", "^refs/heads/test.*", "^refs/heads/baz.*"};
+    setupIsEnabled("enforced", null, branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefParentNoBranchEnabled() {
+    String[] branches = {};
+    setupIsEnabled("false", "true", branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefParentNoBranchDisabled() {
+    String[] branches = {};
+    setupIsEnabled("false", "false", branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledRefParentNoBranchEnforced() {
+    String[] branches = {};
+    setupIsEnabled("false", "enforced", branches);
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled("testProject", "refs/heads/testBranch"));
+  }
+
+  public void testIsEnabledEventNoBranches() {
+    String[] branches = {};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventSingleBranchExact() {
+    String[] branches = {"refs/heads/testBranch"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventSingleBranchRegExp() {
+    String[] branches = {"^refs/heads/test.*"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventSingleBranchNonMatchingRegExp() {
+    String[] branches = {"^refs/heads/foo.*"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventMultiBranchExact() {
+    String[] branches = {"refs/heads/foo", "refs/heads/testBranch"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventMultiBranchRegExp() {
+    String[] branches = {"^refs/heads/foo.*", "^refs/heads/test.*"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventMultiBranchMixedMatchExact() {
+    String[] branches = {"refs/heads/testBranch", "refs/heads/foo.*"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+public void testIsEnabledEventMultiBranchMixedMatchRegExp() {
+    String[] branches = {"refs/heads/foo", "^refs/heads/test.*"};
+    setupIsEnabled("true", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertTrue(itsConfig.isEnabled(event));
+  }
+
+  public void testIsEnabledEventDisabled() {
+    String[] branches = {"^refs/heads/testBranch"};
+    setupIsEnabled("false", null, branches);
+
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent();
+    event.change = new ChangeAttribute();
+    event.change.project = "testProject";
+    event.change.branch = "testBranch";
+
+    ItsConfig itsConfig = createItsConfig();
+
+    replayMocks();
+
+    assertFalse(itsConfig.isEnabled(event));
+  }
+
+  private ItsConfig createItsConfig() {
+    return injector.getInstance(ItsConfig.class);
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    injector = Guice.createInjector(new TestModule());
+  }
+
+  private class TestModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      projectCache = createMock(ProjectCache.class);
+      bind(ProjectCache.class).toInstance(projectCache);
+
+      pluginConfigFactory = createMock(PluginConfigFactory.class);
+      bind(PluginConfigFactory.class).toInstance(pluginConfigFactory);
+
+      bind(String.class).annotatedWith(PluginName.class)
+        .toInstance("ItsTestName");
+    }
   }
 }