diff options
Diffstat (limited to 'javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java')
-rw-r--r-- | javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java new file mode 100644 index 0000000000..e848fa3248 --- /dev/null +++ b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java @@ -0,0 +1,163 @@ +// 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.google.gerrit.server.git; + +import static com.google.common.truth.Truth.assertThat; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; + +import com.google.common.collect.ImmutableList; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.config.RepositoryConfig; +import com.google.gerrit.server.config.SitePaths; +import com.google.gerrit.testing.GerritBaseTests; +import com.google.gerrit.testing.TempFileUtil; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.SortedSet; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache; +import org.eclipse.jgit.lib.RepositoryCache.FileKey; +import org.eclipse.jgit.util.FS; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests { + private Config cfg; + private SitePaths site; + private MultiBaseLocalDiskRepositoryManager repoManager; + private RepositoryConfig configMock; + + @Before + public void setUp() throws IOException { + site = new SitePaths(TempFileUtil.createTempDirectory().toPath()); + site.resolve("git").toFile().mkdir(); + cfg = new Config(); + cfg.setString("gerrit", null, "basePath", "git"); + configMock = createNiceMock(RepositoryConfig.class); + expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of()).anyTimes(); + replay(configMock); + repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); + } + + @After + public void tearDown() throws IOException { + TempFileUtil.cleanup(); + } + + @Test + public void defaultRepositoryLocation() + throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException { + Project.NameKey someProjectKey = new Project.NameKey("someProject"); + Repository repo = repoManager.createRepository(someProjectKey); + assertThat(repo.getDirectory()).isNotNull(); + assertThat(repo.getDirectory().exists()).isTrue(); + assertThat(repo.getDirectory().getParent()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + + repo = repoManager.openRepository(someProjectKey); + assertThat(repo.getDirectory()).isNotNull(); + assertThat(repo.getDirectory().exists()).isTrue(); + assertThat(repo.getDirectory().getParent()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + + assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) + .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()); + + SortedSet<Project.NameKey> repoList = repoManager.list(); + assertThat(repoList).hasSize(1); + assertThat(repoList.toArray(new Project.NameKey[repoList.size()])) + .isEqualTo(new Project.NameKey[] {someProjectKey}); + } + + @Test + public void alternateRepositoryLocation() throws IOException { + Path alternateBasePath = TempFileUtil.createTempDirectory().toPath(); + Project.NameKey someProjectKey = new Project.NameKey("someProject"); + reset(configMock); + expect(configMock.getBasePath(someProjectKey)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(alternateBasePath)).anyTimes(); + replay(configMock); + + Repository repo = repoManager.createRepository(someProjectKey); + assertThat(repo.getDirectory()).isNotNull(); + assertThat(repo.getDirectory().exists()).isTrue(); + assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString()); + + repo = repoManager.openRepository(someProjectKey); + assertThat(repo.getDirectory()).isNotNull(); + assertThat(repo.getDirectory().exists()).isTrue(); + assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString()); + + assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString()) + .isEqualTo(alternateBasePath.toString()); + + SortedSet<Project.NameKey> repoList = repoManager.list(); + assertThat(repoList).hasSize(1); + assertThat(repoList.toArray(new Project.NameKey[repoList.size()])) + .isEqualTo(new Project.NameKey[] {someProjectKey}); + } + + @Test + public void listReturnRepoFromProperLocation() throws IOException { + Project.NameKey basePathProject = new Project.NameKey("basePathProject"); + Project.NameKey altPathProject = new Project.NameKey("altPathProject"); + Project.NameKey misplacedProject1 = new Project.NameKey("misplacedProject1"); + Project.NameKey misplacedProject2 = new Project.NameKey("misplacedProject2"); + + Path alternateBasePath = TempFileUtil.createTempDirectory().toPath(); + + reset(configMock); + expect(configMock.getBasePath(altPathProject)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getBasePath(misplacedProject2)).andReturn(alternateBasePath).anyTimes(); + expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(alternateBasePath)).anyTimes(); + replay(configMock); + + repoManager.createRepository(basePathProject); + repoManager.createRepository(altPathProject); + // create the misplaced ones without the repomanager otherwise they would + // end up at the proper place. + createRepository(repoManager.getBasePath(basePathProject), misplacedProject2); + createRepository(alternateBasePath, misplacedProject1); + + SortedSet<Project.NameKey> repoList = repoManager.list(); + assertThat(repoList).hasSize(2); + assertThat(repoList.toArray(new Project.NameKey[repoList.size()])) + .isEqualTo(new Project.NameKey[] {altPathProject, basePathProject}); + } + + private void createRepository(Path directory, Project.NameKey projectName) throws IOException { + String n = projectName.get() + Constants.DOT_GIT_EXT; + FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED); + try (Repository db = RepositoryCache.open(loc, false)) { + db.create(true /* bare */); + } + } + + @Test(expected = IllegalStateException.class) + public void testRelativeAlternateLocation() { + configMock = createNiceMock(RepositoryConfig.class); + expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(Paths.get("repos"))).anyTimes(); + replay(configMock); + repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock); + } +} |