diff --git a/java/com/google/gerrit/acceptance/ExtensionRegistry.java b/java/com/google/gerrit/acceptance/ExtensionRegistry.java index ee3b525e8b..69023bf77f 100644 --- a/java/com/google/gerrit/acceptance/ExtensionRegistry.java +++ b/java/com/google/gerrit/acceptance/ExtensionRegistry.java @@ -25,6 +25,7 @@ import com.google.gerrit.server.ExceptionHook; import com.google.gerrit.server.change.ChangeETagComputation; import com.google.gerrit.server.git.ChangeMessageModifier; import com.google.gerrit.server.git.validators.CommitValidationListener; +import com.google.gerrit.server.git.validators.RefOperationValidationListener; import com.google.gerrit.server.logging.PerformanceLogger; import com.google.gerrit.server.rules.SubmitRule; import com.google.gerrit.server.validators.ProjectCreationValidationListener; @@ -44,6 +45,7 @@ public class ExtensionRegistry { private final DynamicSet changeETagComputations; private final DynamicSet actionVisitors; private final DynamicMap downloadSchemes; + private final DynamicSet refOperationValidationListeners; @Inject ExtensionRegistry( @@ -56,7 +58,8 @@ public class ExtensionRegistry { DynamicSet changeMessageModifiers, DynamicSet changeETagComputations, DynamicSet actionVisitors, - DynamicMap downloadSchemes) { + DynamicMap downloadSchemes, + DynamicSet refOperationValidationListeners) { this.changeIndexedListeners = changeIndexedListeners; this.commitValidationListeners = commitValidationListeners; this.exceptionHooks = exceptionHooks; @@ -67,6 +70,7 @@ public class ExtensionRegistry { this.changeETagComputations = changeETagComputations; this.actionVisitors = actionVisitors; this.downloadSchemes = downloadSchemes; + this.refOperationValidationListeners = refOperationValidationListeners; } public Registration newRegistration() { @@ -116,6 +120,10 @@ public class ExtensionRegistry { return add(downloadSchemes, downloadScheme, exportName); } + public Registration add(RefOperationValidationListener refOperationValidationListener) { + return add(refOperationValidationListeners, refOperationValidationListener); + } + private Registration add(DynamicSet dynamicSet, T extension) { RegistrationHandle registrationHandle = dynamicSet.add("gerrit", extension); registrationHandles.add(registrationHandle); diff --git a/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java b/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java index 640f65e5d8..876e34264b 100644 --- a/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java +++ b/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java @@ -26,12 +26,12 @@ import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE; import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE_NONFASTFORWARD; import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.ExtensionRegistry; +import com.google.gerrit.acceptance.ExtensionRegistry.Registration; import com.google.gerrit.acceptance.PushOneCommit; import com.google.gerrit.acceptance.testsuite.project.ProjectOperations; import com.google.gerrit.common.data.Permission; import com.google.gerrit.extensions.api.projects.BranchInput; -import com.google.gerrit.extensions.registration.DynamicSet; -import com.google.gerrit.extensions.registration.RegistrationHandle; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.server.events.RefReceivedEvent; import com.google.gerrit.server.git.validators.RefOperationValidationListener; @@ -50,18 +50,16 @@ import org.junit.Test; public class RefOperationValidationIT extends AbstractDaemonTest { private static final String TEST_REF = "refs/heads/protected"; - @Inject DynamicSet validators; @Inject private ProjectOperations projectOperations; + @Inject private ExtensionRegistry extensionRegistry; - private class TestRefValidator implements RefOperationValidationListener, AutoCloseable { + private static class TestRefValidator implements RefOperationValidationListener { private final ReceiveCommand.Type rejectType; private final String rejectRef; - private final RegistrationHandle handle; public TestRefValidator(ReceiveCommand.Type rejectType) { this.rejectType = rejectType; this.rejectRef = TEST_REF; - this.handle = validators.add("test-" + rejectType.name(), this); } @Override @@ -73,16 +71,15 @@ public class RefOperationValidationIT extends AbstractDaemonTest { } return Collections.emptyList(); } + } - @Override - public void close() throws Exception { - handle.remove(); - } + private Registration testValidator(ReceiveCommand.Type rejectType) { + return extensionRegistry.newRegistration().add(new TestRefValidator(rejectType)); } @Test public void rejectRefCreation() throws Exception { - try (TestRefValidator validator = new TestRefValidator(CREATE)) { + try (Registration registration = testValidator(CREATE)) { RestApiException expected = assertThrows( RestApiException.class, @@ -101,7 +98,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { @Test public void rejectRefCreationByPush() throws Exception { - try (TestRefValidator validator = new TestRefValidator(CREATE)) { + try (Registration registration = testValidator(CREATE)) { grant(Permission.PUSH); PushOneCommit push1 = pushFactory.create(admin.newIdent(), testRepo, "change1", "a.txt", "content"); @@ -115,7 +112,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { @Test public void rejectRefDeletion() throws Exception { gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput()); - try (TestRefValidator validator = new TestRefValidator(DELETE)) { + try (Registration registration = testValidator(DELETE)) { RestApiException expected = assertThrows( RestApiException.class, @@ -128,7 +125,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { public void rejectRefDeletionByPush() throws Exception { gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput()); grant(Permission.DELETE); - try (TestRefValidator validator = new TestRefValidator(DELETE)) { + try (Registration registration = testValidator(DELETE)) { PushResult result = deleteRef(testRepo, TEST_REF); RemoteRefUpdate refUpdate = result.getRemoteUpdate(TEST_REF); assertThat(refUpdate.getMessage()).contains(DELETE.name()); @@ -138,7 +135,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { @Test public void rejectRefUpdateFastForward() throws Exception { gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput()); - try (TestRefValidator validator = new TestRefValidator(UPDATE)) { + try (Registration registration = testValidator(UPDATE)) { grant(Permission.PUSH); PushOneCommit push1 = pushFactory.create(admin.newIdent(), testRepo, "change1", "a.txt", "content"); @@ -150,7 +147,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { @Test public void rejectRefUpdateNonFastForward() throws Exception { gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput()); - try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) { + try (Registration registration = testValidator(UPDATE_NONFASTFORWARD)) { ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId(); grant(Permission.PUSH); PushOneCommit push1 = @@ -175,7 +172,7 @@ public class RefOperationValidationIT extends AbstractDaemonTest { public void rejectRefUpdateNonFastForwardToExistingCommit() throws Exception { gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput()); - try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) { + try (Registration registration = testValidator(UPDATE_NONFASTFORWARD)) { grant(Permission.PUSH); PushOneCommit push1 = pushFactory.create(admin.newIdent(), testRepo, "change1", "a.txt", "content");