Fix check for branch enablement on event
When checking if an event is enabled for a specific branch, the wrong
name was being used. For example, branch "master" would fail when
checking against refPattern "refs/heads/master". Instead of using the
branch name, use the full refName to match.
Bug: issue 3099
Change-Id: I29a1b051e4cf7ddc944f0b1dc4111d81f8eb893e
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
index 83ed535..89bccf4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
@@ -52,19 +52,19 @@
public boolean isEnabled(Event event) {
if (event instanceof PatchSetCreatedEvent) {
PatchSetCreatedEvent e = (PatchSetCreatedEvent) event;
- return isEnabled(e.change.project, e.change.branch);
+ return isEnabled(e.change.project, e.getRefName());
} else if (event instanceof CommentAddedEvent) {
CommentAddedEvent e = (CommentAddedEvent) event;
- return isEnabled(e.change.project, e.change.branch);
+ return isEnabled(e.change.project, e.getRefName());
} else if (event instanceof ChangeMergedEvent) {
ChangeMergedEvent e = (ChangeMergedEvent) event;
- return isEnabled(e.change.project, e.change.branch);
+ return isEnabled(e.change.project, e.getRefName());
} else if (event instanceof ChangeAbandonedEvent) {
ChangeAbandonedEvent e = (ChangeAbandonedEvent) event;
- return isEnabled(e.change.project, e.change.branch);
+ return isEnabled(e.change.project, e.getRefName());
} else if (event instanceof ChangeRestoredEvent) {
ChangeRestoredEvent e = (ChangeRestoredEvent) event;
- return isEnabled(e.change.project, e.change.branch);
+ return isEnabled(e.change.project, e.getRefName());
} else if (event instanceof RefUpdatedEvent) {
RefUpdatedEvent e = (RefUpdatedEvent) event;
return isEnabled(e.refUpdate.project, e.refUpdate.refName);
@@ -74,7 +74,7 @@
}
}
- public boolean isEnabled(String project, String branch) {
+ public boolean isEnabled(String project, String refName) {
ProjectState projectState = projectCache.get(new Project.NameKey(project));
if (projectState == null) {
log.error("Failed to check if " + pluginName + " is enabled for project "
@@ -86,17 +86,17 @@
PluginConfig parentCfg =
pluginCfgFactory.getFromProjectConfig(parentState, pluginName);
if ("enforced".equals(parentCfg.getString("enabled"))
- && isEnabledForBranch(parentState, branch)) {
+ && isEnabledForBranch(parentState, refName)) {
return true;
}
}
return pluginCfgFactory.getFromProjectConfigWithInheritance(
projectState, pluginName).getBoolean("enabled", false)
- && isEnabledForBranch(projectState, branch);
+ && isEnabledForBranch(projectState, refName);
}
- private boolean isEnabledForBranch(ProjectState project, String branch) {
+ private boolean isEnabledForBranch(ProjectState project, String refName) {
String[] refPatterns =
pluginCfgFactory.getFromProjectConfigWithInheritance(project,
pluginName).getStringList("branch");
@@ -104,14 +104,14 @@
return true;
}
for (String refPattern : refPatterns) {
- if (RefConfigSection.isValid(refPattern) && match(branch, refPattern)) {
+ if (RefConfigSection.isValid(refPattern) && match(refName, refPattern)) {
return true;
}
}
return false;
}
- private boolean match(String branch, String refPattern) {
- return RefPatternMatcher.getMatcher(refPattern).match(branch, null);
+ private boolean match(String refName, String refPattern) {
+ return RefPatternMatcher.getMatcher(refPattern).match(refName, null);
}
}
diff --git a/src/main/resources/Documentation/config-common.md b/src/main/resources/Documentation/config-common.md
index 4ad3c97..13720b4 100644
--- a/src/main/resources/Documentation/config-common.md
+++ b/src/main/resources/Documentation/config-common.md
@@ -90,7 +90,7 @@
The issue tracker system integration can be limited to specific
branches by setting `plugin.@PLUGIN@.branch`. The branches may be
-configured using explicit branch names, ref patterns, or regular
+configured using explicit ref names, ref patterns, or regular
expressions. Multiple branches may be specified.
E.g. to limit the issue tracker system integration to the `master`
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
new file mode 100644
index 0000000..72d229c
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2015 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.its;
+
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.reviewdb.client.Project;
+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 org.easymock.EasyMockSupport;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class ItsConfigTest {
+ private EasyMockSupport easyMock;
+ private String pluginName = "its-base";
+ private PluginConfig pluginConfig;
+ private PluginConfig pluginConfigWithInheritance;
+ private ItsConfig itsConfig;
+ private PatchSetCreatedEvent pscEvent;
+
+ @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);
+
+ pscEvent = new PatchSetCreatedEvent();
+ pscEvent.change = new ChangeAttribute();
+ pscEvent.change.project = "testProject";
+ pscEvent.change.branch = "testBranch";
+ ArrayList<ProjectState> listProjectState = new ArrayList<>(1);
+ listProjectState.add(projectState);
+
+ 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);
+ }
+
+ @Test
+ public void testEnforcedWithRegex() {
+ String[] refPatterns = {"^refs/heads/test.*"};
+ setUpEnforced(refPatterns);
+
+ assertTrue(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testEnforcedWithExact() {
+ String[] refPatterns = {"refs/heads/testBranch"};
+ setUpEnforced(refPatterns);
+
+ assertTrue(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testEnforcedForAll() {
+ String[] refPatterns = new String[0];
+ setUpEnforced(refPatterns);
+
+ assertTrue(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testEnabledWithRegex() {
+ String[] refPatterns = {"^refs/heads/test.*"};
+ setUpEnabled(refPatterns);
+
+ assertTrue(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testEnabledWithExact() {
+ String[] refPatterns = {"refs/heads/testBranch"};
+ setUpEnabled(refPatterns);
+
+ assertTrue(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testDisabled() {
+ String[] refPatterns = {"refs/heads/testBranch1"};
+ setUpEnabled(refPatterns);
+
+ assertFalse(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ @Test
+ public void testInvalidPattern() {
+ String[] refPatterns = {"testBranch"};
+ setUpEnabled(refPatterns);
+
+ assertFalse(itsConfig.isEnabled(pscEvent));
+ easyMock.verifyAll();
+ }
+
+ private void setUpEnforced(String[] refPatterns) {
+ expect(pluginConfig.getString("enabled")).andReturn("enforced").once();
+ expect(pluginConfigWithInheritance.getStringList("branch")).andReturn(refPatterns);
+ easyMock.replayAll();
+ }
+
+ 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();
+ }
+}