Allow ignore refs set to be null

Plugins which uses global-refdb doesn't have to provide set of refs to
ignore.
Guice @Nullable and @Named annotation cannot be combined
together. If plugin will not provide list of refs to be ignored
exception will be thrown.

Make also all ignoredRefs ImmutableSet.

Bug: Issue 13971
Change-Id: I70f03090fe8c32155d18b2a99df65d3de2d21314
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
index 8788837..6c258ae 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidator.java
@@ -17,13 +17,13 @@
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.OutOfSyncException;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.eclipse.jgit.lib.BatchRefUpdate;
@@ -37,7 +37,8 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public interface Factory {
-    BatchRefUpdateValidator create(String projectName, RefDatabase refDb, Set<String> ignoredRefs);
+    BatchRefUpdateValidator create(
+        String projectName, RefDatabase refDb, ImmutableSet<String> ignoredRefs);
   }
 
   public interface BatchValidationWrapper {
@@ -53,7 +54,7 @@
       ProjectsFilter projectsFilter,
       @Assisted String projectName,
       @Assisted RefDatabase refDb,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     super(
         sharedRefDb,
         validationMetrics,
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
index 21bca40..cf93e1d 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidator.java
@@ -21,13 +21,13 @@
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.Set;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.Ref;
@@ -45,10 +45,11 @@
   protected final RefDatabase refDb;
   protected final SharedRefEnforcement refEnforcement;
   protected final ProjectsFilter projectsFilter;
-  private final Set<String> ignoredRefs;
+  private final ImmutableSet<String> ignoredRefs;
 
   public interface Factory {
-    RefUpdateValidator create(String projectName, RefDatabase refDb, Set<String> ignoredRefs);
+    RefUpdateValidator create(
+        String projectName, RefDatabase refDb, ImmutableSet<String> ignoredRefs);
   }
 
   public interface ExceptionThrowingSupplier<T, E extends Exception> {
@@ -77,7 +78,7 @@
       ProjectsFilter projectsFilter,
       @Assisted String projectName,
       @Assisted RefDatabase refDb,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     this.sharedRefDb = sharedRefDb;
     this.validationMetrics = validationMetrics;
     this.lockWrapperFactory = lockWrapperFactory;
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdate.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdate.java
index 4e1aeb1..8065fe8 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdate.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdate.java
@@ -14,12 +14,12 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 import org.eclipse.jgit.lib.BatchRefUpdate;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.ProgressMonitor;
@@ -35,10 +35,11 @@
   private final String project;
   private final BatchRefUpdateValidator.Factory batchRefValidatorFactory;
   private final RefDatabase refDb;
-  private final Set<String> ignoredRefs;
+  private final ImmutableSet<String> ignoredRefs;
 
   public interface Factory {
-    SharedRefDbBatchRefUpdate create(String project, RefDatabase refDb, Set<String> ignoredRefs);
+    SharedRefDbBatchRefUpdate create(
+        String project, RefDatabase refDb, ImmutableSet<String> ignoredRefs);
   }
 
   @Inject
@@ -46,7 +47,7 @@
       BatchRefUpdateValidator.Factory batchRefValidatorFactory,
       @Assisted String project,
       @Assisted RefDatabase refDb,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     super(refDb);
     this.refDb = refDb;
     this.project = project;
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
index 60d2d2f..c8e7053 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
@@ -14,9 +14,7 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
-import static java.util.Collections.EMPTY_SET;
-
-import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
@@ -25,9 +23,7 @@
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 import java.io.IOException;
-import java.util.Set;
 import java.util.SortedSet;
-import javax.annotation.Nullable;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Repository;
 
@@ -36,16 +32,17 @@
   public static final String IGNORED_REFS = "ignored_refs";
   private final GitRepositoryManager gitRepositoryManager;
   private final SharedRefDbRepository.Factory sharedRefDbRepoFactory;
-  private final Set<String> ignoredRefs;
+
+  @Inject(optional = true)
+  @Named(IGNORED_REFS)
+  private ImmutableSet<String> ignoredRefs = ImmutableSet.of();
 
   @Inject
   public SharedRefDbGitRepositoryManager(
       SharedRefDbRepository.Factory sharedRefDbRepoFactory,
-      LocalDiskRepositoryManager localDiskRepositoryManager,
-      @Nullable @Named(IGNORED_REFS) Set<String> ignoredRefs) {
+      LocalDiskRepositoryManager localDiskRepositoryManager) {
     this.sharedRefDbRepoFactory = sharedRefDbRepoFactory;
     this.gitRepositoryManager = localDiskRepositoryManager;
-    this.ignoredRefs = MoreObjects.firstNonNull(ignoredRefs, EMPTY_SET);
   }
 
   @Override
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabase.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabase.java
index 1f37ab2..e3fde9c 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabase.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabase.java
@@ -14,13 +14,13 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import org.eclipse.jgit.lib.BatchRefUpdate;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
@@ -32,11 +32,11 @@
   private final SharedRefDbBatchRefUpdate.Factory batchRefUpdateFactory;
   private final String projectName;
   private final RefDatabase refDatabase;
-  private final Set<String> ignoredRefs;
+  private final ImmutableSet<String> ignoredRefs;
 
   public interface Factory {
     SharedRefDbRefDatabase create(
-        String projectName, RefDatabase refDatabase, Set<String> ignoredRefs);
+        String projectName, RefDatabase refDatabase, ImmutableSet<String> ignoredRefs);
   }
 
   @Inject
@@ -45,7 +45,7 @@
       SharedRefDbBatchRefUpdate.Factory batchRefUpdateFactory,
       @Assisted String projectName,
       @Assisted RefDatabase refDatabase,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     this.refUpdateFactory = refUpdateFactory;
     this.batchRefUpdateFactory = batchRefUpdateFactory;
     this.projectName = projectName;
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefUpdate.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefUpdate.java
index 83ca308..a461d83 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefUpdate.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefUpdate.java
@@ -14,10 +14,10 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
-import java.util.Set;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -37,7 +37,10 @@
 
   public interface Factory {
     SharedRefDbRefUpdate create(
-        String projectName, RefUpdate refUpdate, RefDatabase refDb, Set<String> ignoredRefs);
+        String projectName,
+        RefUpdate refUpdate,
+        RefDatabase refDb,
+        ImmutableSet<String> ignoredRefs);
   }
 
   @Inject
@@ -46,7 +49,7 @@
       @Assisted String projectName,
       @Assisted RefUpdate refUpdate,
       @Assisted RefDatabase refDb,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     super(refUpdate.getRef());
     refUpdateBase = refUpdate;
     this.projectName = projectName;
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
index fa2467e..0e428fe 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
@@ -14,11 +14,11 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.server.git.DelegateRepository;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import java.io.IOException;
-import java.util.Set;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.Repository;
@@ -29,7 +29,7 @@
 
   public interface Factory {
     SharedRefDbRepository create(
-        String projectName, Repository repository, Set<String> ignoredRefs);
+        String projectName, Repository repository, ImmutableSet<String> ignoredRefs);
   }
 
   @Inject
@@ -37,7 +37,7 @@
       SharedRefDbRefDatabase.Factory refDbFactory,
       @Assisted String projectName,
       @Assisted Repository repository,
-      @Assisted Set<String> ignoredRefs) {
+      @Assisted ImmutableSet<String> ignoredRefs) {
     super(repository);
     this.sharedRefDatabase =
         refDbFactory.create(projectName, repository.getRefDatabase(), ignoredRefs);
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
index bcd0087..d90f45a 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/BatchRefUpdateValidatorTest.java
@@ -15,7 +15,6 @@
 package com.gerritforge.gerrit.globalrefdb.validation;
 
 import static com.google.common.truth.Truth.assertThat;
-import static java.util.Collections.EMPTY_SET;
 import static java.util.Collections.singletonList;
 import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE;
 import static org.mockito.ArgumentMatchers.any;
@@ -29,6 +28,7 @@
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement;
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.metrics.DisabledMetricMaker;
 import java.io.IOException;
@@ -172,7 +172,7 @@
         projectsFilter,
         projectName,
         diskRepo.getRefDatabase(),
-        EMPTY_SET);
+        ImmutableSet.of());
   }
 
   private Void execute(BatchRefUpdate u) throws IOException {
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
index f1405f6..268eb2d 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/RefUpdateValidatorTest.java
@@ -15,7 +15,6 @@
 package com.gerritforge.gerrit.globalrefdb.validation;
 
 import static com.google.common.truth.Truth.assertThat;
-import static java.util.Collections.EMPTY_SET;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
@@ -27,6 +26,7 @@
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedDbSplitBrainException;
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.entities.Project;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
@@ -215,6 +215,6 @@
         projectsFilter,
         A_TEST_PROJECT_NAME,
         localRefDb,
-        EMPTY_SET);
+        ImmutableSet.of());
   }
 }
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
index 01341bd..576e92e 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbBatchRefUpdateTest.java
@@ -16,7 +16,6 @@
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.EMPTY_LIST;
-import static java.util.Collections.EMPTY_SET;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
@@ -29,8 +28,8 @@
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
+import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
-import java.util.Set;
 import org.eclipse.jgit.lib.BatchRefUpdate;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectIdRef;
@@ -171,7 +170,7 @@
         new BatchRefUpdateValidator.Factory() {
           @Override
           public BatchRefUpdateValidator create(
-              String projectName, RefDatabase refDb, Set<String> ignoredRefs) {
+              String projectName, RefDatabase refDb, ImmutableSet<String> ignoredRefs) {
             return new BatchRefUpdateValidator(
                 sharedRefDb,
                 validationMetrics,
@@ -184,20 +183,14 @@
           }
         };
     return new SharedRefDbBatchRefUpdate(
-        batchRefValidatorFactory, A_TEST_PROJECT_NAME, refDatabase, EMPTY_SET);
+        batchRefValidatorFactory, A_TEST_PROJECT_NAME, refDatabase, ImmutableSet.of());
   }
 
   private SharedRefDbBatchRefUpdate getSharedRefDbBatchRefUpdateWithMockedValidator() {
     BatchRefUpdateValidator.Factory batchRefValidatorFactory =
-        new BatchRefUpdateValidator.Factory() {
-          @Override
-          public BatchRefUpdateValidator create(
-              String projectName, RefDatabase refDb, Set<String> ignoredRefs) {
-            return batchRefUpdateValidator;
-          }
-        };
+        (projectName, refDb, ignoredRefs) -> batchRefUpdateValidator;
     return new SharedRefDbBatchRefUpdate(
-        batchRefValidatorFactory, A_TEST_PROJECT_NAME, refDatabase, EMPTY_SET);
+        batchRefValidatorFactory, A_TEST_PROJECT_NAME, refDatabase, ImmutableSet.of());
   }
 
   protected static class RefMatcher implements ArgumentMatcher<Ref> {
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
index 14cee6d..a6c7667 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
@@ -14,12 +14,17 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
-import static java.util.Collections.EMPTY_SET;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
+import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
 import org.eclipse.jgit.lib.Repository;
 import org.junit.Before;
 import org.junit.Test;
@@ -29,6 +34,8 @@
 
 @RunWith(MockitoJUnitRunner.class)
 public class SharedRefDbGitRepositoryManagerTest implements RefFixture {
+  private static final ImmutableSet<String> IGNORED_REFS =
+      ImmutableSet.of("refs/heads/foo", "refs/heads/bar");
 
   @Mock LocalDiskRepositoryManager localDiskRepositoryManagerMock;
 
@@ -49,10 +56,8 @@
   public void setUp() throws Exception {
     doReturn(sharedRefDbRepositoryMock)
         .when(sharedRefDbRepositoryFactoryMock)
-        .create(A_TEST_PROJECT_NAME, repositoryMock, EMPTY_SET);
-    msRepoMgr =
-        new SharedRefDbGitRepositoryManager(
-            sharedRefDbRepositoryFactoryMock, localDiskRepositoryManagerMock, null);
+        .create(A_TEST_PROJECT_NAME, repositoryMock, ImmutableSet.of());
+    msRepoMgr = getInjector(ImmutableSet.of()).getInstance(SharedRefDbGitRepositoryManager.class);
   }
 
   @Test
@@ -63,7 +68,21 @@
 
     msRepoMgr.openRepository(A_TEST_PROJECT_NAME_KEY);
 
-    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated();
+    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(ImmutableSet.of());
+  }
+
+  @Test
+  public void openRepositoryShouldCreateSharedRefDbRepositoryWrapperWithIgnoredRefs()
+      throws Exception {
+    doReturn(repositoryMock)
+        .when(localDiskRepositoryManagerMock)
+        .openRepository(A_TEST_PROJECT_NAME_KEY);
+
+    getInjector(IGNORED_REFS)
+        .getInstance(SharedRefDbGitRepositoryManager.class)
+        .openRepository(A_TEST_PROJECT_NAME_KEY);
+
+    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(IGNORED_REFS);
   }
 
   @Test
@@ -74,10 +93,41 @@
 
     msRepoMgr.createRepository(A_TEST_PROJECT_NAME_KEY);
 
-    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated();
+    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(ImmutableSet.of());
   }
 
-  private void verifyThatSharedRefDbRepositoryWrapperHasBeenCreated() {
-    verify(sharedRefDbRepositoryFactoryMock).create(A_TEST_PROJECT_NAME, repositoryMock, EMPTY_SET);
+  @Test
+  public void createRepositoryShouldCreateSharedRefDbRepositoryWrapperWithIgnoredRefs()
+      throws Exception {
+    doReturn(repositoryMock)
+        .when(localDiskRepositoryManagerMock)
+        .createRepository(A_TEST_PROJECT_NAME_KEY);
+
+    getInjector(IGNORED_REFS)
+        .getInstance(SharedRefDbGitRepositoryManager.class)
+        .createRepository(A_TEST_PROJECT_NAME_KEY);
+
+    verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(IGNORED_REFS);
+  }
+
+  private Injector getInjector(ImmutableSet<String> ignoredRefs) {
+    return Guice.createInjector(
+        new AbstractModule() {
+
+          @Override
+          protected void configure() {
+            bind(new TypeLiteral<ImmutableSet<String>>() {})
+                .annotatedWith(Names.named(SharedRefDbGitRepositoryManager.IGNORED_REFS))
+                .toInstance(ignoredRefs);
+            bind(SharedRefDbRepository.Factory.class).toInstance(sharedRefDbRepositoryFactoryMock);
+            bind(LocalDiskRepositoryManager.class).toInstance(localDiskRepositoryManagerMock);
+          }
+        });
+  }
+
+  private void verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(
+      ImmutableSet<String> ignoredRefs) {
+    verify(sharedRefDbRepositoryFactoryMock)
+        .create(A_TEST_PROJECT_NAME, repositoryMock, ignoredRefs);
   }
 }
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabaseTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabaseTest.java
index f79435c..771e04d 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabaseTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRefDatabaseTest.java
@@ -14,11 +14,11 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
-import static java.util.Collections.EMPTY_SET;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
+import com.google.common.collect.ImmutableSet;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.junit.Rule;
@@ -54,12 +54,12 @@
             refBatchUpdateFactoryMock,
             A_TEST_PROJECT_NAME,
             refDatabaseMock,
-            EMPTY_SET);
+            ImmutableSet.of());
     doReturn(refUpdateMock).when(refDatabaseMock).newUpdate(refName, false);
 
     sharedRefDbRefDb.newUpdate(refName, false);
 
     verify(refUpdateFactoryMock)
-        .create(A_TEST_PROJECT_NAME, refUpdateMock, refDatabaseMock, EMPTY_SET);
+        .create(A_TEST_PROJECT_NAME, refUpdateMock, refDatabaseMock, ImmutableSet.of());
   }
 }
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
index 56fe785..39a57d2 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
@@ -15,11 +15,11 @@
 package com.gerritforge.gerrit.globalrefdb.validation;
 
 import static com.google.common.truth.Truth.assertThat;
-import static java.util.Collections.EMPTY_SET;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
+import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
 import org.eclipse.jgit.lib.ObjectDatabase;
 import org.eclipse.jgit.lib.RefDatabase;
@@ -55,17 +55,18 @@
     doReturn(genericRefDb).when(repository).getRefDatabase();
     doReturn(sharedRefDb)
         .when(sharedRefDbRefDbFactory)
-        .create(PROJECT_NAME, genericRefDb, EMPTY_SET);
+        .create(PROJECT_NAME, genericRefDb, ImmutableSet.of());
   }
 
   @Test
   public void shouldInvokeSharedRefDbRefDbFactoryCreate() {
     setMockitoCommon();
     try (SharedRefDbRepository sharedRefDbRepository =
-        new SharedRefDbRepository(sharedRefDbRefDbFactory, PROJECT_NAME, repository, EMPTY_SET)) {
+        new SharedRefDbRepository(
+            sharedRefDbRefDbFactory, PROJECT_NAME, repository, ImmutableSet.of())) {
 
       sharedRefDbRepository.getRefDatabase();
-      verify(sharedRefDbRefDbFactory).create(PROJECT_NAME, genericRefDb, EMPTY_SET);
+      verify(sharedRefDbRefDbFactory).create(PROJECT_NAME, genericRefDb, ImmutableSet.of());
     }
   }
 
@@ -73,7 +74,8 @@
   public void shouldInvokeNewUpdateInSharedRefDbRefDatabase() throws IOException {
     setMockitoCommon();
     try (SharedRefDbRepository sharedRefDbRepository =
-        new SharedRefDbRepository(sharedRefDbRefDbFactory, PROJECT_NAME, repository, EMPTY_SET)) {
+        new SharedRefDbRepository(
+            sharedRefDbRefDbFactory, PROJECT_NAME, repository, ImmutableSet.of())) {
       sharedRefDbRepository.getRefDatabase().newUpdate(REFS_HEADS_MASTER, false);
 
       verify(sharedRefDb).newUpdate(REFS_HEADS_MASTER, false);
@@ -87,7 +89,8 @@
     doReturn(sharedRefDbRefUpdate).when(sharedRefDb).newUpdate(REFS_HEADS_MASTER, false);
 
     try (SharedRefDbRepository sharedRefDbRepository =
-        new SharedRefDbRepository(sharedRefDbRefDbFactory, PROJECT_NAME, repository, EMPTY_SET)) {
+        new SharedRefDbRepository(
+            sharedRefDbRefDbFactory, PROJECT_NAME, repository, ImmutableSet.of())) {
 
       Result updateResult =
           sharedRefDbRepository.getRefDatabase().newUpdate(REFS_HEADS_MASTER, false).update();
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java
new file mode 100644
index 0000000..b1af798
--- /dev/null
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/ValidationModuleTest.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2020 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.gerritforge.gerrit.globalrefdb.validation;
+
+import static java.util.Collections.EMPTY_SET;
+
+import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
+import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
+import com.google.gerrit.acceptance.TestPlugin;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.*;
+import com.google.inject.name.Names;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+@TestPlugin(name = "test-plugin")
+public class ValidationModuleTest extends LightweightPluginDaemonTest {
+
+  @Override
+  public void setUpTestPlugin() {}
+
+  @Test
+  public void shouldSetupValidationWithEmptyIgnoredRefs() throws Exception {
+    installPlugin("test-plugin", ValidationModuleWithEmptyIgnoredRefs.class);
+  }
+
+  @Test
+  public void shouldSetupValidationWithNonEmptyIgnoredRefs() throws Exception {
+    installPlugin("test-plugin", ValidationModuleWithNonEmptyIgnoredRefs.class);
+  }
+
+  @Test
+  public void shouldSetupValidationWithoutIgnoredRefs() throws Exception {
+    installPlugin("test-plugin", ValidationModuleWithoutIgnoredRefs.class);
+  }
+
+  public static class ValidationModuleWithNonEmptyIgnoredRefs extends ValidationModule {
+    @Inject
+    public ValidationModuleWithNonEmptyIgnoredRefs(@GerritServerConfig Config config) {
+      super(config, Optional.of(ImmutableSet.of("foo", "bar")));
+    }
+  }
+
+  public static class ValidationModuleWithEmptyIgnoredRefs extends ValidationModule {
+    @Inject
+    public ValidationModuleWithEmptyIgnoredRefs(@GerritServerConfig Config config) {
+      super(config, Optional.of(EMPTY_SET));
+    }
+  }
+
+  public static class ValidationModuleWithoutIgnoredRefs extends ValidationModule {
+    @Inject
+    public ValidationModuleWithoutIgnoredRefs(@GerritServerConfig Config config) {
+      super(config, Optional.empty());
+    }
+  }
+
+  abstract static class ValidationModule extends FactoryModule {
+    private final Config config;
+    private final Optional<Set<String>> ignoredRefs;
+
+    public ValidationModule(@GerritServerConfig Config config, Optional<Set<String>> ignoredRefs) {
+      this.config = config;
+      this.ignoredRefs = ignoredRefs;
+    }
+
+    @Override
+    protected void configure() {
+      ignoredRefs.ifPresent(
+          ir ->
+              bind(new TypeLiteral<Set<String>>() {})
+                  .annotatedWith(Names.named(SharedRefDbGitRepositoryManager.IGNORED_REFS))
+                  .toInstance(ir));
+
+      bind(SharedRefDatabaseWrapper.class).in(Scopes.SINGLETON);
+      bind(SharedRefLogger.class).to(Log4jSharedRefLogger.class);
+      factory(LockWrapper.Factory.class);
+
+      factory(SharedRefDbRepository.Factory.class);
+      factory(SharedRefDbRefDatabase.Factory.class);
+      factory(SharedRefDbRefUpdate.Factory.class);
+      factory(SharedRefDbBatchRefUpdate.Factory.class);
+      factory(RefUpdateValidator.Factory.class);
+      factory(BatchRefUpdateValidator.Factory.class);
+
+      SharedRefDbConfiguration cfg = new SharedRefDbConfiguration(config, "test");
+
+      bind(SharedRefDbConfiguration.class).toInstance(cfg);
+      bind(ValidationMetrics.class);
+
+      bind(SharedRefDbGitRepositoryManager.class);
+      bind(SharedRefEnforcement.class).to(DefaultSharedRefEnforcement.class).in(Scopes.SINGLETON);
+    }
+  }
+}