Fix NPE when accessing optional gitRepositoryManager
Change I95ca0c2f9 introduced the concept of GitRepositoryManager
annotated by LocalDiskRepositoryManager, optionally injected via Guice
only when a named binding was provided.
This was merged fine into stable-3.4, however it was mismerged when
brought up to stable-3.5, since additional calls (`canPerformGC()` and
`getRepositoryStatus()`) were not adapted and kept calling the optional
`gitRepositoryManager` directly, causing a NPE:
Caused by: NullPointerException at
SharedRefDbGitRepositoryManager.canPerformGC(SharedRefDbGitRepositoryManager.java:119)
Always access the repository manager via the `repositoryManager()`
getter instead.
Bug: Issue 16527
Change-Id: I34b780043acc22db9160db1e1dbf0c194f39c4d7
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 aa56889..763aeb4 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManager.java
@@ -116,12 +116,12 @@
@Override
public Boolean canPerformGC() {
- return gitRepositoryManager.canPerformGC();
+ return repositoryManager().canPerformGC();
}
@Override
public Status getRepositoryStatus(NameKey name) {
- return gitRepositoryManager.getRepositoryStatus(name);
+ return repositoryManager().getRepositoryStatus(name);
}
private Repository wrap(Project.NameKey projectName, Repository projectRepo) {
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 a6c7667..d31aac0 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbGitRepositoryManagerTest.java
@@ -14,17 +14,20 @@
package com.gerritforge.gerrit.globalrefdb.validation;
+import static com.google.common.truth.Truth.assertThat;
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.GitRepositoryManager;
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 java.util.Collections;
import org.eclipse.jgit.lib.Repository;
import org.junit.Before;
import org.junit.Test;
@@ -110,6 +113,33 @@
verifyThatSharedRefDbRepositoryWrapperHasBeenCreated(IGNORED_REFS);
}
+ @Test
+ public void canPerformGCShouldDelegateToLocalDiskRepositoryManager() {
+ doReturn(true).when(localDiskRepositoryManagerMock).canPerformGC();
+
+ assertThat(msRepoMgr.canPerformGC()).isTrue();
+ verify(localDiskRepositoryManagerMock).canPerformGC();
+ }
+
+ @Test
+ public void getRepositoryStatusShouldDelegateToLocalDiskRepositoryManager() {
+ doReturn(GitRepositoryManager.Status.ACTIVE)
+ .when(localDiskRepositoryManagerMock)
+ .getRepositoryStatus(A_TEST_PROJECT_NAME_KEY);
+
+ assertThat(msRepoMgr.getRepositoryStatus(A_TEST_PROJECT_NAME_KEY))
+ .isEqualTo(GitRepositoryManager.Status.ACTIVE);
+ verify(localDiskRepositoryManagerMock).getRepositoryStatus(A_TEST_PROJECT_NAME_KEY);
+ }
+
+ @Test
+ public void listShouldDelegateToLocalDiskRepositoryManager() {
+ doReturn(Collections.emptySortedSet()).when(localDiskRepositoryManagerMock).list();
+
+ assertThat(msRepoMgr.list()).isEqualTo(Collections.emptySortedSet());
+ verify(localDiskRepositoryManagerMock).list();
+ }
+
private Injector getInjector(ImmutableSet<String> ignoredRefs) {
return Guice.createInjector(
new AbstractModule() {