From 68110ee6b349bc62b8c5c213cd86553eda430227 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 22 Mar 2023 06:24:33 +0100 Subject: [PATCH] Retry failing integration tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This uses 'RetryingTest' from junit jupiter to retry integration tests that are known to fail from time to time. We explicitly mark single tests in contrast to set a global retry to be able to trace those, whenever this is intended. To do so, we have to update to the latest version of JUnit. Unfortunately, this brought a new behaviour for the @TempDir annotation: In contrast to the former behaviour where for one test all annotated parameters got the same directory, in the new version the parameters get different directories assigned. This led to the need of some consolidation between @BeforeEach methods and the related tests. Committed-by: Eduard Heimbuch Co-authored-by: René Pfeuffer --- gradle/dependencies.gradle | 4 +- .../scm/store/JAXBPropertyFileAccessTest.java | 21 ++++--- scm-it/build.gradle | 2 + .../test/java/sonia/scm/it/DiffITCase.java | 57 +++++++++---------- .../sonia/scm/it/GitNonFastForwardITCase.java | 43 +++++++------- .../sonia/scm/it/MergeDetectionITCase.java | 4 +- .../git/GitRepositoryContextResolverTest.java | 10 ++-- .../update/GitV2UpdateStepTest.java | 11 ++-- scm-server/build.gradle | 2 +- .../sonia/scm/server/HealthCheckTest.java | 4 +- .../repository/CopyMigrationStrategyTest.java | 12 ++-- .../InlineMigrationStrategyTest.java | 10 ++-- .../MigrateVerbsToPermissionRolesTest.java | 7 ++- .../repository/MoveMigrationStrategyTest.java | 12 ++-- .../XmlRepositoryFileNameUpdateStepTest.java | 7 ++- .../XmlRepositoryV1UpdateStepTest.java | 26 +++++---- .../security/XmlSecurityV1UpdateStepTest.java | 9 ++- 17 files changed, 133 insertions(+), 108 deletions(-) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 9162b388ec..3114e02a1a 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -16,7 +16,7 @@ ext { jettyVersion = '9.4.44.v20210927' luceneVersion = '8.9.0' - junitJupiterVersion = '5.7.0' + junitJupiterVersion = '5.9.2' hamcrestVersion = '2.1' mockitoVersion = '3.6.28' jerseyClientVersion = '1.19.4' @@ -167,7 +167,7 @@ ext { junit: 'junit:junit:4.13.1', // junit 5 extensions - junitPioneer: 'org.junit-pioneer:junit-pioneer:1.6.2', + junitPioneer: 'org.junit-pioneer:junit-pioneer:2.0.0', // assertions hamcrestCore: "org.hamcrest:hamcrest-core:${hamcrestVersion}", diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java index 0c6f4ac982..6eafabdd95 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java @@ -61,8 +61,11 @@ class JAXBPropertyFileAccessTest { JAXBPropertyFileAccess fileAccess; + @TempDir + private Path tempDir; + @BeforeEach - void initTempDir(@TempDir Path tempDir) { + void initTempDir() { lenient().when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); lenient().when(contextProvider.resolve(any())).thenAnswer(invocation -> tempDir.resolve(invocation.getArgument(0).toString())); @@ -98,8 +101,8 @@ class JAXBPropertyFileAccessTest { } @Test - void shouldMoveStoreFileToRepositoryBasedLocation(@TempDir Path tempDir) throws IOException { - createV1StoreFile(tempDir, "myStore.xml"); + void shouldMoveStoreFileToRepositoryBasedLocation() throws IOException { + createV1StoreFile("myStore.xml"); fileAccess.forStoreName(STORE_NAME).moveAsRepositoryStore(Paths.get("myStore.xml"), REPOSITORY_ID); @@ -107,11 +110,11 @@ class JAXBPropertyFileAccessTest { } @Test - void shouldMoveAllStoreFilesToRepositoryBasedLocations(@TempDir Path tempDir) throws IOException { + void shouldMoveAllStoreFilesToRepositoryBasedLocations() throws IOException { locationResolver.forClass(Path.class).createLocation("repoId2"); - createV1StoreFile(tempDir, REPOSITORY_ID + ".xml"); - createV1StoreFile(tempDir, "repoId2.xml"); + createV1StoreFile(REPOSITORY_ID + ".xml"); + createV1StoreFile("repoId2.xml"); PropertyFileAccess.StoreFileTools statisticStoreAccess = fileAccess.forStoreName(STORE_NAME); statisticStoreAccess.forStoreFiles(statisticStoreAccess::moveAsRepositoryStore); @@ -121,7 +124,7 @@ class JAXBPropertyFileAccessTest { } } - private void createV1StoreFile(@TempDir Path tempDir, String name) throws IOException { + private void createV1StoreFile(String name) throws IOException { Path v1Dir = tempDir.resolve("var").resolve("data").resolve(STORE_NAME); IOUtil.mkdirs(v1Dir.toFile()); Files.createFile(v1Dir.resolve(name)); @@ -131,8 +134,8 @@ class JAXBPropertyFileAccessTest { class ForMissingRepository { @Test - void shouldIgnoreStoreFile(@TempDir Path tempDir) throws IOException { - createV1StoreFile(tempDir, "myStore.xml"); + void shouldIgnoreStoreFile() throws IOException { + createV1StoreFile("myStore.xml"); fileAccess.forStoreName(STORE_NAME).moveAsRepositoryStore(Paths.get("myStore.xml"), REPOSITORY_ID); diff --git a/scm-it/build.gradle b/scm-it/build.gradle index bab2478f94..2195109c94 100644 --- a/scm-it/build.gradle +++ b/scm-it/build.gradle @@ -58,6 +58,8 @@ dependencies { testImplementation libraries.jerseyClientRuntime testImplementation libraries.jacksonJaxbAnnotations + testImplementation libraries.junitPioneer + itWebApp project(path: ':scm-webapp', configuration: 'webapp') itPlugin project(path: ':scm-plugins:scm-integration-test-plugin', configuration: 'smp') } diff --git a/scm-it/src/test/java/sonia/scm/it/DiffITCase.java b/scm-it/src/test/java/sonia/scm/it/DiffITCase.java index ae92284386..d16ba089d6 100644 --- a/scm-it/src/test/java/sonia/scm/it/DiffITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/DiffITCase.java @@ -21,17 +21,16 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.it; import org.apache.http.HttpStatus; -import org.assertj.core.api.AbstractCharSequenceAssert; import org.assertj.core.util.Lists; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junitpioneer.jupiter.RetryingTest; import sonia.scm.it.utils.RepositoryUtil; import sonia.scm.it.utils.ScmRequests; import sonia.scm.it.utils.TestData; @@ -52,27 +51,23 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import static java.nio.file.Files.createDirectories; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import static sonia.scm.it.utils.RestUtil.ADMIN_PASSWORD; import static sonia.scm.it.utils.RestUtil.ADMIN_USERNAME; -public class DiffITCase { +class DiffITCase { - @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); + @TempDir public Path tempFolder; private RepositoryClient svnRepositoryClient; private RepositoryClient gitRepositoryClient; private RepositoryClient hgRepositoryClient; private ScmRequests.RepositoryResponse svnRepositoryResponse; private ScmRequests.RepositoryResponse hgRepositoryResponse; private ScmRequests.RepositoryResponse gitRepositoryResponse; - private File svnFolder; - private File gitFolder; - private File hgFolder; - @Before - public void init() throws IOException { + @BeforeEach + void init() throws IOException { TestData.createDefault(); String namespace = ADMIN_USERNAME; String repo = TestData.getDefaultRepoName("svn"); @@ -81,7 +76,7 @@ public class DiffITCase { .requestIndexResource(ADMIN_USERNAME, ADMIN_PASSWORD) .requestRepository(namespace, repo) .assertStatusCode(HttpStatus.SC_OK); - svnFolder = tempFolder.newFolder("svn"); + File svnFolder = createDirectories(tempFolder.resolve("svn")).toFile(); svnRepositoryClient = RepositoryUtil.createRepositoryClient("svn", svnFolder); repo = TestData.getDefaultRepoName("git"); @@ -90,7 +85,7 @@ public class DiffITCase { .requestIndexResource(ADMIN_USERNAME, ADMIN_PASSWORD) .requestRepository(namespace, repo) .assertStatusCode(HttpStatus.SC_OK); - gitFolder = tempFolder.newFolder("git"); + File gitFolder = createDirectories(tempFolder.resolve("git")).toFile(); gitRepositoryClient = RepositoryUtil.createRepositoryClient("git", gitFolder); repo = TestData.getDefaultRepoName("hg"); @@ -99,12 +94,12 @@ public class DiffITCase { .requestIndexResource(ADMIN_USERNAME, ADMIN_PASSWORD) .requestRepository(namespace, repo) .assertStatusCode(HttpStatus.SC_OK); - hgFolder = tempFolder.newFolder("hg"); + File hgFolder = createDirectories(tempFolder.resolve("hg")).toFile(); hgRepositoryClient = RepositoryUtil.createRepositoryClient("hg", hgFolder); } @Test - public void shouldFindDiffsInGitFormat() throws IOException { + void shouldFindDiffsInGitFormat() throws IOException { String svnDiff = getDiff(RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"), svnRepositoryResponse); String gitDiff = getDiff(RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"), gitRepositoryResponse); String hgDiff = getDiff(RepositoryUtil.createAndCommitFile(hgRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"), hgRepositoryResponse); @@ -115,7 +110,7 @@ public class DiffITCase { } @Test - public void svnAddFileDiffShouldBeConvertedToGitDiff() throws IOException { + void svnAddFileDiffShouldBeConvertedToGitDiff() throws IOException { String svnDiff = getDiff(RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"), svnRepositoryResponse); String gitDiff = getDiff(RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"), gitRepositoryResponse); @@ -123,8 +118,8 @@ public class DiffITCase { assertDiffsAreEqual(svnDiff, expected); } - @Test - public void svnDeleteFileDiffShouldBeConvertedToGitDiff() throws IOException { + @RetryingTest(3) + void svnDeleteFileDiffShouldBeConvertedToGitDiff() throws IOException { RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"); RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"); @@ -136,7 +131,7 @@ public class DiffITCase { } @Test - public void svnUpdateFileDiffShouldBeConvertedToGitDiff() throws IOException { + void svnUpdateFileDiffShouldBeConvertedToGitDiff() throws IOException { RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"); RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, "a.txt", "content of a"); @@ -147,8 +142,8 @@ public class DiffITCase { assertDiffsAreEqual(svnDiff, expected); } - @Test - public void svnMultipleChangesDiffShouldBeConvertedToGitDiff() throws IOException { + @RetryingTest(3) + void svnMultipleChangesDiffShouldBeConvertedToGitDiff() throws IOException { String svnDiff = getDiff(applyMultipleChanges(svnRepositoryClient, "fileToBeDeleted.txt", "fileToBeUpdated.txt", "addedFile.txt"), svnRepositoryResponse); String gitDiff = getDiff(applyMultipleChanges(gitRepositoryClient, "fileToBeDeleted.txt", "fileToBeUpdated.txt", "addedFile.txt"), gitRepositoryResponse); @@ -162,7 +157,7 @@ public class DiffITCase { } @Test - public void svnMultipleSubFolderChangesDiffShouldBeConvertedToGitDiff() throws IOException { + void svnMultipleSubFolderChangesDiffShouldBeConvertedToGitDiff() throws IOException { String svnDiff = getDiff(applyMultipleChanges(svnRepositoryClient, "a/b/fileToBeDeleted.txt", "a/c/fileToBeUpdated.txt", "a/d/addedFile.txt"), svnRepositoryResponse); String gitDiff = getDiff(applyMultipleChanges(gitRepositoryClient, "a/b/fileToBeDeleted.txt", "a/c/fileToBeUpdated.txt", "a/d/addedFile.txt"), gitRepositoryResponse); @@ -176,7 +171,7 @@ public class DiffITCase { } @Test - public void svnLargeChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { + void svnLargeChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { String fileName = "SvnDiffGenerator_forTest"; RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, fileName, ""); RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, fileName, ""); @@ -201,9 +196,9 @@ public class DiffITCase { * FIXME: the binary Git Diff output is not GIT conform */ @Test - @Ignore + @Disabled @SuppressWarnings("squid:S1607") - public void svnBinaryChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { + void svnBinaryChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { String fileName = "binary"; File file = new File(svnRepositoryClient.getWorkingCopy(), fileName); Files.copy(Paths.get(getClass().getResource("/diff/binaryfile/echo").toURI()), Paths.get(file.toURI())); @@ -220,7 +215,7 @@ public class DiffITCase { } @Test - public void svnRenameChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { + void svnRenameChangesDiffShouldBeConvertedToGitDiff() throws IOException, URISyntaxException { String fileName = "a.txt"; RepositoryUtil.createAndCommitFile(svnRepositoryClient, ADMIN_USERNAME, fileName, "content of a"); RepositoryUtil.createAndCommitFile(gitRepositoryClient, ADMIN_USERNAME, fileName, "content of a"); diff --git a/scm-it/src/test/java/sonia/scm/it/GitNonFastForwardITCase.java b/scm-it/src/test/java/sonia/scm/it/GitNonFastForwardITCase.java index 38b5dbc6ee..832f2d8606 100644 --- a/scm-it/src/test/java/sonia/scm/it/GitNonFastForwardITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/GitNonFastForwardITCase.java @@ -34,12 +34,12 @@ import org.eclipse.jgit.transport.PushResult; import org.eclipse.jgit.transport.RemoteRefUpdate; import org.eclipse.jgit.transport.RemoteRefUpdate.Status; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junitpioneer.jupiter.RetryingTest; import sonia.scm.it.utils.RestUtil; import sonia.scm.it.utils.TestData; import sonia.scm.web.VndMediaType; @@ -47,44 +47,45 @@ import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; +import java.nio.file.Path; -import static org.junit.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; import static sonia.scm.it.utils.RestUtil.given; /** * Integration Tests for Git with non fast-forward pushes. */ -public class GitNonFastForwardITCase { +class GitNonFastForwardITCase { private File workingCopy; private Git git; - @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); + @TempDir + private Path tempFolder; - @Before - public void createAndCloneTestRepository() throws IOException, GitAPIException { + @BeforeEach + void createAndCloneTestRepository() throws GitAPIException { TestData.createDefault(); - this.workingCopy = tempFolder.newFolder(); + this.workingCopy = tempFolder.toFile(); this.git = clone(RestUtil.BASE_URL.toASCIIString() + "repo/scmadmin/HeartOfGold-git"); } - @After - public void cleanup() { + @AfterEach + void cleanup() { TestData.cleanup(); } /** * Ensures that the normal behaviour (non fast-forward is allowed), is restored after the tests are executed. */ - @AfterClass + @AfterAll public static void allowNonFastForward() { setNonFastForwardDisallowed(false); } @Test - public void testGitPushAmendWithoutForce() throws IOException, GitAPIException { + void testGitPushAmendWithoutForce() throws IOException, GitAPIException { setNonFastForwardDisallowed(false); addTestFileToWorkingCopyAndCommit("a"); @@ -95,7 +96,7 @@ public class GitNonFastForwardITCase { } @Test - public void testGitPushAmendWithForce() throws IOException, GitAPIException { + void testGitPushAmendWithForce() throws IOException, GitAPIException { setNonFastForwardDisallowed(false); addTestFileToWorkingCopyAndCommit("a"); @@ -105,8 +106,8 @@ public class GitNonFastForwardITCase { pushAndAssert(true, Status.OK); } - @Test - public void testGitPushAmendForceWithDisallowNonFastForward() throws GitAPIException, IOException { + @RetryingTest(3) + void testGitPushAmendForceWithDisallowNonFastForward() throws GitAPIException, IOException { setNonFastForwardDisallowed(true); addTestFileToWorkingCopyAndCommit("a"); @@ -172,7 +173,7 @@ public class GitNonFastForwardITCase { private void assertStatus(PushResult pushResult, Status expectedStatus) { for ( RemoteRefUpdate remoteRefUpdate : pushResult.getRemoteUpdates() ) { - assertEquals(expectedStatus, remoteRefUpdate.getStatus()); + assertThat(remoteRefUpdate.getStatus()).isEqualTo(expectedStatus); } } diff --git a/scm-it/src/test/java/sonia/scm/it/MergeDetectionITCase.java b/scm-it/src/test/java/sonia/scm/it/MergeDetectionITCase.java index 2e3e810608..0764a4b640 100644 --- a/scm-it/src/test/java/sonia/scm/it/MergeDetectionITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/MergeDetectionITCase.java @@ -29,7 +29,9 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.io.TempDir; +import org.junitpioneer.jupiter.RetryingTest; import sonia.scm.it.utils.RepositoryUtil; import sonia.scm.it.utils.RestUtil; import sonia.scm.it.utils.TestData; @@ -126,7 +128,7 @@ class MergeDetectionITCase { Assertions.assertThat(getMergeDetectionResult("postMergeDetection", 0)).isTrue(); } - @Test + @RetryingTest(3) void shouldDetectNormalPushAsNotMerged(@TempDir Path tempDir) throws IOException { client.getCheckoutCommand().checkout("develop"); writeFile(tempDir, developFile, "other content"); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/GitRepositoryContextResolverTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/GitRepositoryContextResolverTest.java index e7e07e39ec..07083bcf1a 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/GitRepositoryContextResolverTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/protocolcommand/git/GitRepositoryContextResolverTest.java @@ -41,7 +41,6 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryLocationResolver; import sonia.scm.repository.RepositoryManager; -import java.io.IOException; import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; @@ -72,15 +71,18 @@ class GitRepositoryContextResolverTest { @Nested class WithRepository { + @TempDir + Path repositoryPath; + @BeforeEach - void mockRepository(@TempDir Path repositoryPath) throws IOException { + void mockRepository() { when(scmConfiguration.getBaseUrl()).thenReturn("https://hog.hitchhiker.com/scm"); when(repositoryManager.get(new NamespaceAndName("space", "X"))).thenReturn(REPOSITORY); when(locationResolver.forClass(any()).getLocation("id")).thenReturn(repositoryPath); } @Test - void shouldResolveCorrectRepository(@TempDir Path repositoryPath) { + void shouldResolveCorrectRepository() { RepositoryContext context = resolver.resolve(new String[]{"git", "repo/space/X/something/else"}); assertThat(context.getRepository()).isSameAs(REPOSITORY); @@ -88,7 +90,7 @@ class GitRepositoryContextResolverTest { } @Test - void shouldResolveCorrectRepositoryWithContextPath(@TempDir Path repositoryPath) throws IOException { + void shouldResolveCorrectRepositoryWithContextPath() { RepositoryContext context = resolver.resolve(new String[]{"git", "scm/repo/space/X/something/else"}); assertThat(context.getRepository()).isSameAs(REPOSITORY); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/update/GitV2UpdateStepTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/update/GitV2UpdateStepTest.java index c207a4bf54..03a53315b5 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/update/GitV2UpdateStepTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/update/GitV2UpdateStepTest.java @@ -58,13 +58,16 @@ class GitV2UpdateStepTest { @InjectMocks GitV2UpdateStep updateStep; + @TempDir + Path temp; + @BeforeEach - void createDataDirectory(@TempDir Path temp) throws IOException { + void createDataDirectory() throws IOException { Files.createDirectories(temp.resolve("data")); } @BeforeEach - void initRepositoryFolder(@TempDir Path temp) { + void initRepositoryFolder() { when(locationResolver.forClass(Path.class)).thenReturn(locationResolverInstance); when(repositoryMetadataAccess.read(temp)).thenReturn(new Repository("123", "git", "space", "X")); doAnswer(invocation -> { @@ -74,14 +77,14 @@ class GitV2UpdateStepTest { } @Test - void shouldWriteConfigFileForBareRepositories(@TempDir Path temp) { + void shouldWriteConfigFileForBareRepositories() { updateStep.doUpdate(); assertThat(temp.resolve("data").resolve("config")).exists(); } @Test - void shouldWriteConfigFileForNonBareRepositories(@TempDir Path temp) throws IOException { + void shouldWriteConfigFileForNonBareRepositories() throws IOException { Files.createDirectories(temp.resolve("data").resolve(".git")); updateStep.doUpdate(); diff --git a/scm-server/build.gradle b/scm-server/build.gradle index 445ac68913..1bec43b8e1 100644 --- a/scm-server/build.gradle +++ b/scm-server/build.gradle @@ -29,7 +29,7 @@ plugins { dependencies { api platform(project(':')) - + implementation libraries.commonsDaemon implementation libraries.jettyServer implementation libraries.jettyWebapp diff --git a/scm-server/src/test/java/sonia/scm/server/HealthCheckTest.java b/scm-server/src/test/java/sonia/scm/server/HealthCheckTest.java index 0dea0f689f..e4d810d68a 100644 --- a/scm-server/src/test/java/sonia/scm/server/HealthCheckTest.java +++ b/scm-server/src/test/java/sonia/scm/server/HealthCheckTest.java @@ -165,12 +165,12 @@ class HealthCheckTest { } @BeforeEach - private void setUp() { + void setUp() { servers = new ArrayList<>(); } @AfterEach - private void shutdown() { + void shutdown() { for (Server server : servers) { try { server.stop(); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java index d0d72f967e..f63d9f5551 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java @@ -51,32 +51,34 @@ class CopyMigrationStrategyTest { SCMContextProvider contextProvider; @Mock RepositoryLocationResolver locationResolver; + @TempDir + private Path tempDir; @BeforeEach - void mockContextProvider(@TempDir Path tempDir) { + void mockContextProvider() { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDir Path tempDir) throws IOException { + void createV1Home() throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @BeforeEach - void mockLocationResolver(@TempDir Path tempDir) { + void mockLocationResolver() { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test - void shouldUseStandardDirectory(@TempDir Path tempDir) { + void shouldUseStandardDirectory() { Path target = new CopyMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(tempDir.resolve("b4f-a9f0-49f7-ad1f-37d3aae1c55f")); } @Test - void shouldCopyDataDirectory(@TempDir Path tempDir) { + void shouldCopyDataDirectory() { Path target = new CopyMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target.resolve("data")).exists(); Path originalDataDir = tempDir diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java index d236859af9..51fd9ff5e9 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java @@ -50,27 +50,29 @@ class InlineMigrationStrategyTest { PathBasedRepositoryLocationResolver locationResolver; @Mock RepositoryLocationResolver.RepositoryLocationResolverInstance locationResolverInstance; + @TempDir + Path tempDir; @BeforeEach - void mockContextProvider(@TempDir Path tempDir) { + void mockContextProvider() { when(locationResolver.forClass(Path.class)).thenReturn(locationResolverInstance); when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDir Path tempDir) throws IOException { + void createV1Home() throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @Test - void shouldUseExistingDirectory(@TempDir Path tempDir) { + void shouldUseExistingDirectory() { Path target = new InlineMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(resolveOldDirectory(tempDir)); verify(locationResolverInstance).setLocation("b4f-a9f0-49f7-ad1f-37d3aae1c55f", target); } @Test - void shouldMoveDataDirectory(@TempDir Path tempDir) { + void shouldMoveDataDirectory() { new InlineMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git"); assertThat(resolveOldDirectory(tempDir).resolve("data")).exists(); } diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java index 72cabf5d8b..df4468d1b8 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java @@ -63,8 +63,11 @@ class MigrateVerbsToPermissionRolesTest { @InjectMocks private MigrateVerbsToPermissionRoles migration; + @TempDir + private Path tempDir; + @BeforeEach - void init(@TempDir Path tempDir) throws IOException { + void init() throws IOException { URL metadataUrl = Resources.getResource("sonia/scm/update/repository/metadataWithoutRoles.xml"); Files.copy(metadataUrl.openStream(), tempDir.resolve("metadata.xml")); doAnswer(invocation -> { @@ -75,7 +78,7 @@ class MigrateVerbsToPermissionRolesTest { } @Test - void shouldUpdateToRolesIfPossible(@TempDir Path tempDir) throws IOException { + void shouldUpdateToRolesIfPossible() throws IOException { migration.doUpdate(); List newMetadata = Files.readAllLines(tempDir.resolve("metadata.xml")); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java index 658360d234..314c0ee26d 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java @@ -48,32 +48,34 @@ class MoveMigrationStrategyTest { SCMContextProvider contextProvider; @Mock RepositoryLocationResolver locationResolver; + @TempDir + Path tempDir; @BeforeEach - void mockContextProvider(@TempDir Path tempDir) { + void mockContextProvider() { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDir Path tempDir) throws IOException { + void createV1Home() throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @BeforeEach - void mockLocationResolver(@TempDir Path tempDir) { + void mockLocationResolver() { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test - void shouldUseStandardDirectory(@TempDir Path tempDir) { + void shouldUseStandardDirectory() { Path target = new MoveMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(tempDir.resolve("b4f-a9f0-49f7-ad1f-37d3aae1c55f")); } @Test - void shouldMoveDataDirectory(@TempDir Path tempDir) { + void shouldMoveDataDirectory() { Path target = new MoveMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target.resolve("data")).exists(); Path originalDataDir = tempDir diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java index 3475fffac0..e0f386efb7 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java @@ -47,13 +47,16 @@ class XmlRepositoryFileNameUpdateStepTest { SCMContextProvider contextProvider = mock(SCMContextProvider.class); XmlRepositoryDAO repositoryDAO = mock(XmlRepositoryDAO.class); + @TempDir + Path tempDir; + @BeforeEach - void mockScmHome(@TempDir Path tempDir) { + void mockScmHome() { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @Test - void shouldCopyRepositoriesFileToRepositoryPathsFile(@TempDir Path tempDir) throws IOException { + void shouldCopyRepositoriesFileToRepositoryPathsFile() throws IOException { XmlRepositoryFileNameUpdateStep updateStep = new XmlRepositoryFileNameUpdateStep(contextProvider, repositoryDAO); URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml"); Path configDir = tempDir.resolve("config"); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java index a212164c5c..595bbb957a 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java @@ -82,9 +82,11 @@ class XmlRepositoryV1UpdateStepTest { UpdateStepTestUtil testUtil; XmlRepositoryV1UpdateStep updateStep; + @TempDir + Path tempDir; @BeforeEach - void createUpdateStepFromMocks(@TempDir Path tempDir) { + void createUpdateStepFromMocks() { testUtil = new UpdateStepTestUtil(tempDir); updateStep = new XmlRepositoryV1UpdateStep( testUtil.getContextProvider(), @@ -99,7 +101,7 @@ class XmlRepositoryV1UpdateStepTest { class WithExistingDatabase { @BeforeEach - void createV1Home(@TempDir Path tempDir) throws IOException { + void createV1Home() throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @@ -176,7 +178,7 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldUseDirectoryFromStrategy(@TempDir Path tempDir) throws JAXBException { + void shouldUseDirectoryFromStrategy() throws JAXBException { Path targetDir = tempDir.resolve("someDir"); MigrationStrategy.Instance strategyMock = injectorMock.getInstance(MoveMigrationStrategy.class); when(strategyMock.migrate("454972da-faf9-4437-b682-dc4a4e0aa8eb", "simple", "git")).thenReturn(of(targetDir)); @@ -206,7 +208,7 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldBackupOldRepositoryDatabaseFile(@TempDir Path tempDir) throws JAXBException { + void shouldBackupOldRepositoryDatabaseFile() throws JAXBException { updateStep.doUpdate(); assertThat(tempDir.resolve("config").resolve("repositories.xml")).doesNotExist(); @@ -220,15 +222,15 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldNotFailIfFormerV2DatabaseExists(@TempDir Path tempDir) throws JAXBException, IOException { - createFormerV2RepositoriesFile(tempDir); + void shouldNotFailIfFormerV2DatabaseExists() throws JAXBException, IOException { + createFormerV2RepositoriesFile(); updateStep.doUpdate(); } @Test - void shouldNotBackupFormerV2DatabaseFile(@TempDir Path tempDir) throws JAXBException, IOException { - createFormerV2RepositoriesFile(tempDir); + void shouldNotBackupFormerV2DatabaseFile() throws JAXBException, IOException { + createFormerV2RepositoriesFile(); updateStep.doUpdate(); @@ -237,14 +239,14 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldGetNoMissingStrategiesWithFormerV2DatabaseFile(@TempDir Path tempDir) throws IOException { - createFormerV2RepositoriesFile(tempDir); + void shouldGetNoMissingStrategiesWithFormerV2DatabaseFile() throws IOException { + createFormerV2RepositoriesFile(); assertThat(updateStep.getRepositoriesWithoutMigrationStrategies()).isEmpty(); } @Test - void shouldFindMissingStrategies(@TempDir Path tempDir) throws IOException { + void shouldFindMissingStrategies() throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); assertThat(updateStep.getRepositoriesWithoutMigrationStrategies()) @@ -255,7 +257,7 @@ class XmlRepositoryV1UpdateStepTest { "454972da-faf9-4437-b682-dc4a4e0aa8eb"); } - private void createFormerV2RepositoriesFile(@TempDir Path tempDir) throws IOException { + private void createFormerV2RepositoriesFile() throws IOException { URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml"); Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); diff --git a/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java index 9dc506e919..f5d8c88ccc 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java @@ -59,8 +59,11 @@ class XmlSecurityV1UpdateStepTest { XmlSecurityV1UpdateStep updateStep; ConfigurationEntryStore assignedPermissionStore; + @TempDir + Path tempDir; + @BeforeEach - void mockScmHome(@TempDir Path tempDir) { + void mockScmHome() { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); InMemoryConfigurationEntryStoreFactory inMemoryConfigurationEntryStoreFactory = create(); assignedPermissionStore = inMemoryConfigurationEntryStoreFactory.get("security"); @@ -71,7 +74,7 @@ class XmlSecurityV1UpdateStepTest { class WithExistingDatabase { @BeforeEach - void createConfigV1XML(@TempDir Path tempDir) throws IOException { + void createConfigV1XML() throws IOException { Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); copyTestDatabaseFile(configDir, "config.xml"); @@ -111,7 +114,7 @@ class XmlSecurityV1UpdateStepTest { private Path configDir; @BeforeEach - void createSecurityV1XML(@TempDir Path tempDir) throws IOException { + void createSecurityV1XML() throws IOException { configDir = tempDir.resolve("config"); Files.createDirectories(configDir); }