Extract event-filter parts from EventListenersConfig These are used by several parts of the application and keeping them in a global instance makes more sense than passing them around. Solves: Jira GER-1735 Change-Id: I6d090b8e16c53fd26116d4ece67e9f6e3d81e794
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java index 21bc418..cc89f39 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
@@ -16,15 +16,11 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.flogger.FluentLogger; -import com.google.gerrit.entities.AccessSection; import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.server.config.AllProjectsName; import com.google.gerrit.server.config.PluginConfigFactory; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.inject.Inject; -import java.util.Arrays; -import java.util.function.Function; -import java.util.regex.Pattern; import org.eclipse.jgit.lib.Config; public class EventListenersConfig { @@ -32,33 +28,10 @@ private static final FluentLogger logger = FluentLogger.forEnclosingClass(); static final String EVENT_LISTENERS = "EventListeners"; static final String ENABLED = "enabled"; - static final String BLOCKED_REFS = "blockedRef"; - static final String BLOCKED_PROJECTS = "blockedProject"; - static final String BLOCK_LIGHTWEIGHT_TAGS = "blockLightWeightTags"; - - @VisibleForTesting - static boolean filterMatches(String filter, String repoName) { - if (filter.startsWith(AccessSection.REGEX_PREFIX)) { - return Pattern.matches(filter, repoName); - } - if (filter.endsWith("*")) { - return repoName.startsWith(filter.substring(0, filter.length() - 1)); - } - return repoName.equals(filter); - } - - @VisibleForTesting - public static Function<String, Boolean> toCombinedMatcher(String... filters) { - return repoName -> Arrays.stream(filters).anyMatch(f -> filterMatches(f, repoName)); - } @VisibleForTesting static EventListenersConfig fromConfig(Config cfg) { - return new EventListenersConfig( - cfg.getBoolean(EVENT_LISTENERS, ENABLED, true), - toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_PROJECTS)), - toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_REFS)), - cfg.getBoolean(EVENT_LISTENERS, BLOCK_LIGHTWEIGHT_TAGS, false)); + return new EventListenersConfig(cfg.getBoolean(EVENT_LISTENERS, ENABLED, true)); } private final PluginConfigFactory configFactory; @@ -83,41 +56,19 @@ } catch (NoSuchProjectException e) { logger.atSevere().withCause(e).log( "Unable to read project.config, using default EventListenersConfig"); - return new EventListenersConfig(true, toCombinedMatcher(""), toCombinedMatcher(""), false); + return new EventListenersConfig(true); } } } private final boolean enabled; - private final Function<String, Boolean> blockedRefMatcher; - private final Function<String, Boolean> blockedProjectMatcher; - private final boolean blockLightWeightTags; @VisibleForTesting - public EventListenersConfig( - boolean enabled, - Function<String, Boolean> blockedProjectMatcher, - Function<String, Boolean> blockedRefMatcher, - boolean blockLightWeightTags) { + public EventListenersConfig(boolean enabled) { this.enabled = enabled; - this.blockedProjectMatcher = blockedProjectMatcher; - this.blockedRefMatcher = blockedRefMatcher; - this.blockLightWeightTags = blockLightWeightTags; } public boolean isEnabled() { return this.enabled; } - - public boolean refIsBlocked(String ref) { - return blockedRefMatcher.apply(ref); - } - - public boolean projectIsBlocked(String repoName) { - return blockedProjectMatcher.apply(repoName); - } - - public boolean blockLightWeightTags() { - return blockLightWeightTags; - } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilter.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilter.java new file mode 100644 index 0000000..38f3acc --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilter.java
@@ -0,0 +1,114 @@ +// Copyright (C) 2022 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.eventseiffel.config; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.flogger.FluentLogger; +import com.google.gerrit.entities.AccessSection; +import com.google.gerrit.extensions.annotations.PluginName; +import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.config.PluginConfigFactory; +import com.google.gerrit.server.project.NoSuchProjectException; +import com.google.inject.Inject; +import java.util.Arrays; +import java.util.function.Function; +import java.util.regex.Pattern; +import org.eclipse.jgit.lib.Config; + +public class EventsFilter { + + public static class Provider implements com.google.inject.Provider<EventsFilter> { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + static final String EVENTS_FILTER = "EventsFilter"; + static final String BLOCKED_REFS = "blockedRef"; + static final String BLOCKED_PROJECTS = "blockedProject"; + static final String BLOCK_LIGHTWEIGHT_TAGS = "blockLightWeightTags"; + + @VisibleForTesting + static boolean filterMatches(String filter, String repoName) { + if (filter.startsWith(AccessSection.REGEX_PREFIX)) { + return Pattern.matches(filter, repoName); + } + if (filter.endsWith("*")) { + return repoName.startsWith(filter.substring(0, filter.length() - 1)); + } + return repoName.equals(filter); + } + + @VisibleForTesting + public static Function<String, Boolean> toCombinedMatcher(String... filters) { + return repoName -> Arrays.stream(filters).anyMatch(f -> filterMatches(f, repoName)); + } + + @VisibleForTesting + static EventsFilter fromConfig(Config cfg) { + return new EventsFilter( + toCombinedMatcher(cfg.getStringList(EVENTS_FILTER, null, BLOCKED_PROJECTS)), + toCombinedMatcher(cfg.getStringList(EVENTS_FILTER, null, BLOCKED_REFS)), + cfg.getBoolean(EVENTS_FILTER, BLOCK_LIGHTWEIGHT_TAGS, false)); + } + + private final PluginConfigFactory configFactory; + private final String pluginName; + private final AllProjectsName allProjects; + + @Inject + public Provider( + PluginConfigFactory cfgFactory, + @PluginName String pluginName, + AllProjectsName allProjects) { + this.configFactory = cfgFactory; + this.pluginName = pluginName; + this.allProjects = allProjects; + } + + @Override + public EventsFilter get() { + try { + Config cfg = configFactory.getProjectPluginConfig(allProjects, pluginName); + return fromConfig(cfg); + } catch (NoSuchProjectException e) { + logger.atSevere().withCause(e).log( + "Unable to read project.config, using default EventsFilter"); + return new EventsFilter(toCombinedMatcher(""), toCombinedMatcher(""), false); + } + } + } + + private final Function<String, Boolean> blockedRefMatcher; + private final Function<String, Boolean> blockedProjectMatcher; + private final boolean blockLightWeightTags; + + @VisibleForTesting + public EventsFilter( + Function<String, Boolean> blockedProjectMatcher, + Function<String, Boolean> blockedRefMatcher, + boolean blockLightWeightTags) { + this.blockedProjectMatcher = blockedProjectMatcher; + this.blockedRefMatcher = blockedRefMatcher; + this.blockLightWeightTags = blockLightWeightTags; + } + + public boolean refIsBlocked(String ref) { + return blockedRefMatcher.apply(ref); + } + + public boolean projectIsBlocked(String repoName) { + return blockedProjectMatcher.apply(repoName); + } + + public boolean blockLightWeightTags() { + return blockLightWeightTags; + } +}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/PatchsetCreatedListener.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/PatchsetCreatedListener.java index cd4c83f..048f701 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/PatchsetCreatedListener.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/PatchsetCreatedListener.java
@@ -18,30 +18,35 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue; public class PatchsetCreatedListener implements RevisionCreatedListener { private final EiffelEventParsingQueue queue; private final Provider<EventListenersConfig> configProvider; + private final Provider<EventsFilter> eventsFilter; @Inject public PatchsetCreatedListener( - EiffelEventParsingQueue queue, Provider<EventListenersConfig> configProvider) { + EiffelEventParsingQueue queue, + Provider<EventListenersConfig> configProvider, + Provider<EventsFilter> eventsFilter) { this.queue = queue; this.configProvider = configProvider; + this.eventsFilter = eventsFilter; } @Override public void onRevisionCreated(RevisionCreatedListener.Event event) { - EventListenersConfig config = configProvider.get(); - if (!config.isEnabled()) { + if (!configProvider.get().isEnabled()) { return; } /* 'branch' is not the exact reference in this case. * Filtering for startsWith("refs/") to filter out refs/meta/config.*/ if (!event.getChange().branch.startsWith(RefNames.REFS)) { - if (config.refIsBlocked(RefNames.REFS_HEADS + event.getChange().branch) - || config.projectIsBlocked(event.getChange().project)) { + EventsFilter filter = eventsFilter.get(); + if (filter.refIsBlocked(RefNames.REFS_HEADS + event.getChange().branch) + || filter.projectIsBlocked(event.getChange().project)) { return; } queue.scheduleSccCreation(event);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java index 8da4990..3a04f53 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
@@ -18,18 +18,23 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue; public class RefUpdateListener implements GitReferenceUpdatedListener { private final EiffelEventParsingQueue queue; private final Provider<EventListenersConfig> configProvider; + private final Provider<EventsFilter> eventsFilter; @Inject public RefUpdateListener( - EiffelEventParsingQueue queue, Provider<EventListenersConfig> configProvider) { + EiffelEventParsingQueue queue, + Provider<EventListenersConfig> configProvider, + Provider<EventsFilter> eventsFilter) { this.queue = queue; this.configProvider = configProvider; + this.eventsFilter = eventsFilter; } @Override @@ -39,8 +44,10 @@ return; } - if (config.refIsBlocked(event.getRefName()) - || config.projectIsBlocked(event.getProjectName())) { + EventsFilter filter = eventsFilter.get(); + + if (filter.refIsBlocked(event.getRefName()) + || filter.projectIsBlocked(event.getProjectName())) { return; } /* The reference was not deleted. */ @@ -51,7 +58,7 @@ } /* Updated reference is a tag. */ else if (event.getRefName().startsWith(RefNames.REFS_TAGS)) { - queue.scheduleArtcCreation(event, branch -> config.refIsBlocked(branch), config.blockLightWeightTags()); + queue.scheduleArtcCreation(event); } } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java index 6b38d55..d5d3ff0 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -32,8 +32,10 @@ import com.google.gerrit.extensions.events.RevisionCreatedListener.Event; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; +import com.google.inject.Provider; import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventHub; import com.googlesource.gerrit.plugins.eventseiffel.cache.EiffelEventIdLookupException; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.CompositionDefinedEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey; @@ -47,7 +49,6 @@ import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import java.util.function.Function; import java.util.stream.Collectors; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; @@ -71,17 +72,20 @@ private final GitRepositoryManager repoManager; private final UnprocessedCommitsWalker.Factory walkerFactory; private final EiffelEventMapper mapper; + private final Provider<EventsFilter> eventsFilter; @Inject public EiffelEventParser( EiffelEventHub eventQueue, GitRepositoryManager repoManager, EiffelEventMapper mapper, - UnprocessedCommitsWalker.Factory walkerFactory) { + UnprocessedCommitsWalker.Factory walkerFactory, + Provider<EventsFilter> eventsFilter) { this.eventHub = eventQueue; this.repoManager = repoManager; this.walkerFactory = walkerFactory; this.mapper = mapper; + this.eventsFilter = eventsFilter; } public void createAndScheduleSccFromEvent(Event event) { @@ -217,18 +221,13 @@ } public void createAndScheduleArtc( - String projectName, - String tagName, - Long creationTime, - boolean force, - Function<String, Boolean> blockedRefMatcher, - boolean blockLightWeightTags) { + String projectName, String tagName, Long creationTime, boolean force) { try { CompositionDefinedEventKey cd = CompositionDefinedEventKey.create(mapper.tagCompositionName(projectName), tagName); Optional<UUID> oldCdId = eventHub.getExistingId(cd); if (oldCdId.isEmpty() || force) { - createAndScheduleCd(projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags); + createAndScheduleCd(projectName, tagName, creationTime, force); Optional<UUID> cdId = eventHub.getExistingId(cd); if (cdId.isPresent() && !cdId.equals(oldCdId)) { pushToHub(mapper.toArtc(projectName, tagName, creationTime, cdId.get()), force); @@ -251,17 +250,13 @@ } private void createAndScheduleCd( - String projectName, - String tagName, - Long creationTime, - boolean force, - Function<String, Boolean> blockedRefMatcher, - boolean blockLightWeightTags) { + String projectName, String tagName, Long creationTime, boolean force) { Optional<UUID> scsId = Optional.empty(); List<Ref> refs = null; try { - ObjectId objectId = peelTag(projectName, tagName, blockLightWeightTags); + EventsFilter filter = eventsFilter.get(); + ObjectId objectId = peelTag(projectName, tagName, filter.blockLightWeightTags()); if (objectId == null) { return; } @@ -312,7 +307,7 @@ RevWalk rw = new RevWalk(repo); refs = refs.stream() - .filter(ref -> !blockedRefMatcher.apply(ref.getName())) + .filter(ref -> !filter.refIsBlocked(ref.getName())) .collect(Collectors.toList()); branches = RevWalkUtils.findBranchesReachableFrom(rw.parseCommit(objectId), rw, refs); } catch (IOException e) { @@ -351,10 +346,8 @@ Ref tagRef = repo.getRefDatabase().exactRef(Constants.R_TAGS + tagName); if (tagRef != null) { ObjectId peeled = repo.getRefDatabase().peel(tagRef).getPeeledObjectId(); - if (peeled != null) - return peeled; - if (!blockLightWeightTags) - return tagRef.getObjectId(); + if (peeled != null) return peeled; + if (!blockLightWeightTags) return tagRef.getObjectId(); logger.atInfo().log("Creation of CD is blocked for lightweight tags"); return null; }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java index 36e69ca..1fd7ec5 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -32,7 +32,6 @@ import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; -import java.util.function.Function; public class EiffelEventParsingQueue { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); @@ -143,18 +142,15 @@ }); } - public void scheduleArtcCreation( - GitReferenceUpdatedListener.Event event, Function<String, Boolean> blockedRefMatcher, boolean blockLightWeightTags) { + public void scheduleArtcCreation(GitReferenceUpdatedListener.Event event) { scheduleArtcCreation( event.getProjectName(), event.getRefName().substring(RefNames.REFS_TAGS.length()), TimeUtil.nowMs(), - false, - blockedRefMatcher, - blockLightWeightTags); + false); } - public void scheduleArtcCreation(TagResource resource, boolean force, boolean blockLightWeightTags) { + public void scheduleArtcCreation(TagResource resource, boolean force) { String tagRef = resource.getRef(); scheduleArtcCreation( resource.getName(), @@ -162,26 +158,18 @@ ? tagRef.substring(RefNames.REFS_TAGS.length()) : tagRef, resource.getTagInfo().created.getTime(), - force, - branch -> false, - blockLightWeightTags); + force); } public void scheduleArtcCreation( - String projectName, - String tagName, - Long creationTime, - boolean force, - Function<String, Boolean> blockedRefMatcher, - boolean blockLightWeightTags) { + String projectName, String tagName, Long creationTime, boolean force) { schedule( new EventParsingWorker(ARTC, projectName, tagName) { @Override public void doRun() { try { - eventParser.createAndScheduleArtc( - projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags); + eventParser.createAndScheduleArtc(projectName, tagName, creationTime, force); } catch (Exception e) { logger.atSevere().withCause(e).log( "Failed to create ARTC for %s:%s", projectName, tagName);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java index 7c53a2d..9a07c0f 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java +++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
@@ -25,8 +25,6 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue; -import com.google.inject.Provider; -import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig; @Singleton @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @@ -36,18 +34,16 @@ } private final EiffelEventParsingQueue queue; - private final Provider<EventListenersConfig> configProvider; @Inject - CreateArtcs(EiffelEventParsingQueue queue, Provider<EventListenersConfig> configProvider) { + CreateArtcs(EiffelEventParsingQueue queue) { this.queue = queue; - this.configProvider = configProvider; } @Override public Response<?> apply(TagResource resource, CreateArtcs.Input input) throws AuthException, BadRequestException, ResourceConflictException, Exception { - queue.scheduleArtcCreation(resource, input.force, configProvider.get().blockLightWeightTags()); + queue.scheduleArtcCreation(resource, input.force); return EventCreationResponse.artc(resource); } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTest.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTest.java index c847bb0..3652427 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTest.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.eventseiffel; import static com.google.common.truth.Truth.assertThat; +import static com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter.Provider.toCombinedMatcher; import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCC; import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCS; @@ -24,6 +25,7 @@ import com.google.gerrit.entities.RefNames; import com.google.gerrit.extensions.api.projects.TagInput; import com.google.inject.Provider; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.api.EventStorageException; @@ -184,6 +186,39 @@ return gApi.projects().name(project.get()).tag(input.ref).create(input).get().ref; } + public static class TestEventsFilterProvider implements Provider<EventsFilter> { + private static String[] refPatterns; + private static String[] projectPatterns; + private static boolean blockLightweightTags; + + static { + reset(); + } + + public static void reset() { + refPatterns = projectPatterns = new String[0]; + blockLightweightTags = false; + } + + public static void setBlockedRefPatterns(String... patterns) { + refPatterns = patterns; + } + + public static void setBlockedProjectPatterns(String... patterns) { + projectPatterns = patterns; + } + + public static void blockLightWeightTags() { + blockLightweightTags = true; + } + + @Override + public EventsFilter get() { + return new EventsFilter( + toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns), blockLightweightTags); + } + } + public static class TestEventFactoryProvider implements Provider<EiffelEventFactory> { @Override
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java index 3b839dc..f51402a 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java +++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
@@ -20,9 +20,11 @@ import com.google.inject.Singleton; import com.google.inject.internal.UniqueAnnotations; import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventsTest.TestEventFactoryProvider; +import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventsTest.TestEventsFilterProvider; import com.googlesource.gerrit.plugins.eventseiffel.cache.EiffelEventIdCacheImpl; import com.googlesource.gerrit.plugins.eventseiffel.config.EventIdCacheConfig; import com.googlesource.gerrit.plugins.eventseiffel.config.EventMappingConfig; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.api.EventStorage; import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory; import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingExecutor; @@ -43,6 +45,7 @@ bind(TestEventPublisher.class).in(Scopes.SINGLETON); bind(EiffelEventHub.Consumer.class).to(TestEventPublisher.class); + bind(EventsFilter.class).toProvider(TestEventsFilterProvider.class); bind(EiffelEventParsingQueue.class); bind(EiffelEventFactory.class).toProvider(TestEventFactoryProvider.class);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilterTest.java similarity index 66% rename from src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java rename to src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilterTest.java index bee0989..268cc2c 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventsFilterTest.java
@@ -14,9 +14,9 @@ package com.googlesource.gerrit.plugins.eventseiffel.config; -import static com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig.Provider.filterMatches; -import static com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig.Provider.fromConfig; -import static com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig.Provider.toCombinedMatcher; +import static com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter.Provider.filterMatches; +import static com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter.Provider.fromConfig; +import static com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter.Provider.toCombinedMatcher; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -24,51 +24,51 @@ import org.eclipse.jgit.lib.Config; import org.junit.Test; -public class EventListenersConfigTest { +public class EventsFilterTest { @Test public void regexBlockRefPattern() throws Exception { - EventListenersConfig cfg = refsPatterns("^refs/.*/blocked"); - assertTrue(cfg.refIsBlocked("refs/that/are/blocked")); - assertFalse(cfg.refIsBlocked("refs/allowed")); + EventsFilter filter = refsPatterns("^refs/.*/blocked"); + assertTrue(filter.refIsBlocked("refs/that/are/blocked")); + assertFalse(filter.refIsBlocked("refs/allowed")); - cfg = refsPatterns("^refs/(heads|tags)"); - assertTrue(cfg.refIsBlocked("refs/heads")); - assertTrue(cfg.refIsBlocked("refs/tags")); - assertFalse(cfg.refIsBlocked("refs/meta")); + filter = refsPatterns("^refs/(heads|tags)"); + assertTrue(filter.refIsBlocked("refs/heads")); + assertTrue(filter.refIsBlocked("refs/tags")); + assertFalse(filter.refIsBlocked("refs/meta")); } @Test public void wildcardBlockRefPattern() throws Exception { - EventListenersConfig cfg = refsPatterns(""); - assertFalse(cfg.refIsBlocked("refs/blocked/always")); + EventsFilter filter = refsPatterns(""); + assertFalse(filter.refIsBlocked("refs/blocked/always")); - cfg = refsPatterns("refs/blocked/*"); - assertTrue(cfg.refIsBlocked("refs/blocked/always")); - assertFalse(cfg.refIsBlocked("refs/allowed/always")); + filter = refsPatterns("refs/blocked/*"); + assertTrue(filter.refIsBlocked("refs/blocked/always")); + assertFalse(filter.refIsBlocked("refs/allowed/always")); } @Test public void exactBlockRefPattern() throws Exception { - EventListenersConfig cfg = refsPatterns(""); - assertFalse(cfg.refIsBlocked("refs/blocked/exact")); + EventsFilter filter = refsPatterns(""); + assertFalse(filter.refIsBlocked("refs/blocked/exact")); - cfg = refsPatterns("refs/blocked/exact"); - assertTrue(cfg.refIsBlocked("refs/blocked/exact")); - assertFalse(cfg.refIsBlocked("refs/blocked/exact2")); + filter = refsPatterns("refs/blocked/exact"); + assertTrue(filter.refIsBlocked("refs/blocked/exact")); + assertFalse(filter.refIsBlocked("refs/blocked/exact2")); } @Test public void combinedBlockRefPattern() throws Exception { - EventListenersConfig cfg = refsPatterns(""); - assertFalse(cfg.refIsBlocked("refs/certainly/blocked")); - assertFalse(cfg.refIsBlocked("refs/blocked/always")); - assertFalse(cfg.refIsBlocked("refs/not/allowed/at/all")); + EventsFilter filter = refsPatterns(""); + assertFalse(filter.refIsBlocked("refs/certainly/blocked")); + assertFalse(filter.refIsBlocked("refs/blocked/always")); + assertFalse(filter.refIsBlocked("refs/not/allowed/at/all")); - cfg = refsPatterns("refs/blocked/*", "^refs/.*/blocked", "refs/not/allowed/at/all"); - assertTrue(cfg.refIsBlocked("refs/certainly/blocked")); - assertTrue(cfg.refIsBlocked("refs/blocked/always")); - assertTrue(cfg.refIsBlocked("refs/not/allowed/at/all")); + filter = refsPatterns("refs/blocked/*", "^refs/.*/blocked", "refs/not/allowed/at/all"); + assertTrue(filter.refIsBlocked("refs/certainly/blocked")); + assertTrue(filter.refIsBlocked("refs/blocked/always")); + assertTrue(filter.refIsBlocked("refs/not/allowed/at/all")); } @Test @@ -132,26 +132,25 @@ public void configParsedCorrectly() throws Exception { Config cfg = new Config(); cfg.fromText( - "[EventListeners]\n" + "[EventsFilter]\n" + "blockedRef = refs/heads/blocked\n" + "blockedRef = refs/heads/also/blocked\n" + "blockedProject = blocked/project\n" + "blockedProject = blocked/projects/*\n" + "enabled = False\n"); - EventListenersConfig fromText = fromConfig(cfg); + EventsFilter fromText = fromConfig(cfg); assertTrue(fromText.refIsBlocked("refs/heads/blocked")); assertTrue(fromText.refIsBlocked("refs/heads/also/blocked")); assertTrue(fromText.projectIsBlocked("blocked/project")); assertTrue(fromText.projectIsBlocked("blocked/projects/something")); - assertFalse(fromText.isEnabled()); } - private EventListenersConfig refsPatterns(String... patterns) { - return new EventListenersConfig(true, toCombinedMatcher(), toCombinedMatcher(patterns), false); + private EventsFilter refsPatterns(String... patterns) { + return new EventsFilter(toCombinedMatcher(), toCombinedMatcher(patterns), false); } - private EventListenersConfig projectsPatterns(String... patterns) { - return new EventListenersConfig(true, toCombinedMatcher(patterns), toCombinedMatcher(), false); + private EventsFilter projectsPatterns(String... patterns) { + return new EventsFilter(toCombinedMatcher(patterns), toCombinedMatcher(), false); } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java index 93ec6a6..0527b19 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -14,7 +14,6 @@ package com.googlesource.gerrit.plugins.eventseiffel.listeners; -import static com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig.Provider.toCombinedMatcher; import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCC; import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCS; import static org.junit.Assert.assertEquals; @@ -38,6 +37,7 @@ import com.googlesource.gerrit.plugins.eventseiffel.TestEventPublisher; import com.googlesource.gerrit.plugins.eventseiffel.config.EiffelConfig; import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.ArtifactEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.CompositionDefinedEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey; @@ -64,6 +64,7 @@ @Before public void before() { publisher = plugin.getSysInjector().getInstance(TestEventPublisher.class); + TestEventsFilterProvider.reset(); TestEventListenersConfigProvider.reset(); } @@ -175,7 +176,7 @@ @Test public void noEventsCreatedWhenRefIsBlocked() throws Exception { - TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master"); + TestEventsFilterProvider.setBlockedRefPatterns("refs/heads/master"); PushOneCommit.Result res = createChange(); SourceChangeEventKey sccKey = toSccKey(res); EiffelEvent sccEvent = publisher.getPublished(sccKey); @@ -188,7 +189,7 @@ @Test public void noEventsCreatedWhenProjectIsBlocked() throws Exception { - TestEventListenersConfigProvider.setBlockedProjectPatterns(project.get()); + TestEventsFilterProvider.setBlockedProjectPatterns(project.get()); PushOneCommit.Result res = createChange(); SourceChangeEventKey sccKey = toSccKey(res); EiffelEvent sccEvent = publisher.getPublished(sccKey); @@ -232,7 +233,7 @@ @Test public void tagCreatedResultsInNoEventWhenBranchIsBlocked() throws Exception { - TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master"); + TestEventsFilterProvider.setBlockedRefPatterns("refs/heads/master"); String tagName = createTagRef(true).substring(RefNames.REFS_TAGS.length()); EventKey artcKey = ArtifactEventKey.create(tagPURL(project.get(), tagName)); @@ -251,7 +252,7 @@ @Test public void tagCreatedResultsInNoEventWhenBranchIsBlockedSCSHandled() throws Exception { UUID parentEventId = markMasterAsHandled(SCS); - TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master"); + TestEventsFilterProvider.setBlockedRefPatterns("refs/heads/master"); String tagName = createTagRef(true).substring(RefNames.REFS_TAGS.length()); EventKey artcKey = ArtifactEventKey.create(tagPURL(project.get(), tagName)); @@ -309,8 +310,6 @@ public static class TestEventListenersConfigProvider implements Provider<EventListenersConfig> { private static boolean enabled; - private static String[] refPatterns; - private static String[] projectPatterns; static { reset(); @@ -318,15 +317,6 @@ static void reset() { enabled = true; - refPatterns = projectPatterns = new String[0]; - } - - static void setBlockedRefPatterns(String... patterns) { - refPatterns = patterns; - } - - static void setBlockedProjectPatterns(String... patterns) { - projectPatterns = patterns; } static void disable() { @@ -339,8 +329,7 @@ @Override public EventListenersConfig get() { - return new EventListenersConfig( - enabled, toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns), false); + return new EventListenersConfig(enabled); } } @@ -350,6 +339,7 @@ protected void configure() { install(new EiffelEventsTestModule()); bind(EventListenersConfig.class).toProvider(TestEventListenersConfigProvider.class); + bind(EventsFilter.class).toProvider(TestEventsFilterProvider.class); DynamicSet.bind(binder(), RevisionCreatedListener.class).to(PatchsetCreatedListener.class); DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(RefUpdateListener.class); bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java index 9257cb0..cd5c38d 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
@@ -35,6 +35,7 @@ import com.googlesource.gerrit.plugins.eventseiffel.config.EiffelConfig; import com.googlesource.gerrit.plugins.eventseiffel.config.EventIdCacheConfig; import com.googlesource.gerrit.plugins.eventseiffel.config.EventMappingConfig; +import com.googlesource.gerrit.plugins.eventseiffel.config.EventsFilter; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.ArtifactEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.CompositionDefinedEventKey; import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey; @@ -64,6 +65,7 @@ public void setUp() { eventParser = plugin.getSysInjector().getInstance(EiffelEventParser.class); TestEventHub.EVENTS.clear(); + TestEventsFilterProvider.reset(); } @Test @@ -210,7 +212,7 @@ String ref = setCdHandled(); ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref)); markAsHandled(artc); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(0, TestEventHub.EVENTS.size()); } @@ -224,7 +226,7 @@ markAsHandled(cd); ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref)); markAsHandled(artc); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true, branch -> false, false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true); assertEquals(2, TestEventHub.EVENTS.size()); assertCorrectEvent(0, cd); assertCorrectEvent(1, artc); @@ -258,7 +260,7 @@ CompositionDefinedEventKey cd = CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(4, TestEventHub.EVENTS.size()); assertCorrectEvent(0, scc); assertCorrectEvent(1, scs); @@ -268,16 +270,17 @@ @Test public void artcQueuedBlockBranch() throws Exception { + TestEventsFilterProvider.setBlockedRefPatterns("refs/heads/master"); String ref = createTagRef(getHead(repo(), "HEAD").getName(), true).substring(Constants.R_TAGS.length()); - eventParser.createAndScheduleArtc( - project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(0, TestEventHub.EVENTS.size()); } @Test public void artcQueuedBlockBranchButReachableFromOtherBranch() throws Exception { + TestEventsFilterProvider.setBlockedRefPatterns("refs/heads/master"); createBranch(BranchNameKey.create(project, "other-branch")); String ref = createTagRef(getHead(repo(), "HEAD").getName(), true).substring(Constants.R_TAGS.length()); @@ -289,8 +292,7 @@ CompositionDefinedEventKey cd = CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref); - eventParser.createAndScheduleArtc( - project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(4, TestEventHub.EVENTS.size()); assertCorrectEvent(0, scc); assertCorrectEvent(1, scs); @@ -300,34 +302,34 @@ @Test public void artcQueuedNoTagCreated() throws Exception { - eventParser.createAndScheduleArtc( - project.get(), TAG_NAME, EPOCH_MILLIS, false, branch -> false, false); + eventParser.createAndScheduleArtc(project.get(), TAG_NAME, EPOCH_MILLIS, false); assertEquals(0, TestEventHub.EVENTS.size()); } @Test public void annotatedTagArtcQueuedscsHandled() throws Exception { - assertArtcQueuedScsHandled(true, false); + assertArtcQueuedScsHandled(true); } @Test public void lightWeightTagArtcQueuedscsHandled() throws Exception { - assertArtcQueuedScsHandled(false, false); + assertArtcQueuedScsHandled(false); } @Test public void annotatedTagArtcQueuedscsHandledLightWeightBlocked() throws Exception { - assertArtcQueuedScsHandled(true, true); + TestEventsFilterProvider.blockLightWeightTags(); + assertArtcQueuedScsHandled(true); } @Test public void lightWeightTagArtcQueuedscsHandledLightWeightBlocked() throws Exception { setScsHandled(); + TestEventsFilterProvider.blockLightWeightTags(); String ref = - createTagRef(getHead(repo(), "HEAD").getName(), false) - .substring(Constants.R_TAGS.length()); + createTagRef(getHead(repo(), "HEAD").getName(), false).substring(Constants.R_TAGS.length()); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, true); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(0, TestEventHub.EVENTS.size()); } @@ -336,7 +338,7 @@ String ref = setCdHandled(); ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref)); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(0, TestEventHub.EVENTS.size()); } @@ -344,14 +346,14 @@ @UseLocalDisk @GlobalPluginConfig(pluginName = PLUGIN_NAME, name = "EiffelEvent.namespace", value = NAMESPACE) public void artcQueuedscsHandledWithCustomNameSpace() throws Exception { - assertArtcQueuedScsHandled(false, false, NAMESPACE); + assertArtcQueuedScsHandled(false, NAMESPACE); } - private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight) throws Exception { - assertArtcQueuedScsHandled(annotated, blockLightWeight, "localhost"); + private void assertArtcQueuedScsHandled(boolean annotated) throws Exception { + assertArtcQueuedScsHandled(annotated, "localhost"); } - private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight, String namespace) throws Exception { + private void assertArtcQueuedScsHandled(boolean annotated, String namespace) throws Exception { setScsHandled(); String ref = createTagRef(getHead(repo(), "HEAD").getName(), annotated) @@ -360,7 +362,7 @@ CompositionDefinedEventKey cd = CompositionDefinedEventKey.create(tagCompositionName(project.get(), namespace), ref); - eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, blockLightWeight); + eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false); assertEquals(2, TestEventHub.EVENTS.size()); assertCorrectEvent(0, cd); assertCorrectEvent(1, artc); @@ -410,6 +412,7 @@ protected void configure() { bind(EventStorage.class).toProvider(TestEventStorage.Provider.class).in(Singleton.class); bind(EventIdCacheConfig.class).toProvider(EventIdCacheConfig.Provider.class); + bind(EventsFilter.class).toProvider(TestEventsFilterProvider.class); install(EiffelEventIdCacheImpl.module()); bind(EiffelEventHub.class).to(TestEventHub.class); bind(EventMappingConfig.class).toProvider(EventMappingConfig.Provider.class);