diff --git a/gradle/changelog/fix_unit_tests_on_windows.yaml b/gradle/changelog/fix_unit_tests_on_windows.yaml new file mode 100644 index 0000000000..30be37ec8f --- /dev/null +++ b/gradle/changelog/fix_unit_tests_on_windows.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Fix bugs in unit tests which occur on Windows only ([#1927](https://github.com/scm-manager/scm-manager/pull/1927)) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java index 684f5d43ef..09f3f03378 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java @@ -45,7 +45,6 @@ import java.util.Collection; public abstract class AbstractGitPushOrPullCommand extends AbstractGitCommand { - private static final String SCHEME = ScmTransportProtocol.NAME + "://"; private static final Logger LOG = LoggerFactory.getLogger(AbstractGitPushOrPullCommand.class); protected GitRepositoryHandler handler; @@ -100,7 +99,7 @@ public abstract class AbstractGitPushOrPullCommand extends AbstractGitCommand { } protected String getRemoteUrl(File directory) { - return SCHEME.concat(directory.getAbsolutePath()); + return directory.toURI().toASCIIString(); } protected String getRemoteUrl(sonia.scm.repository.Repository repository) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java index 6deb3afe53..2424e1365b 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java @@ -74,7 +74,7 @@ public class GitPushCommandTest extends AbstractRemoteCommandTestBase PushResponse response = cmd.push(request); assertNotNull(response); - assertEquals(2l, response.getChangesetCount()); + assertEquals(2L, response.getChangesetCount()); Iterator commits = incoming.log().call().iterator(); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryFactoryTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryFactoryTest.java index 2b52c3c928..3402c57ee9 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryFactoryTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryFactoryTest.java @@ -24,8 +24,9 @@ package sonia.scm.repository; -import org.javahg.Repository; import com.google.common.collect.ImmutableMap; +import org.javahg.Repository; +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; @@ -57,6 +58,7 @@ class HgRepositoryFactoryTest { private HgRepositoryFactory factory; private sonia.scm.repository.Repository heartOfGold; + private Repository repository; @BeforeEach void setUpFactory(@TempDir Path directory) { @@ -68,9 +70,16 @@ class HgRepositoryFactoryTest { heartOfGold = createRepository(); } + @AfterEach + void tearDown() { + if (repository != null) { + repository.close(); + } + } + @Test void shouldOpenRepositoryForRead() { - Repository repository = factory.openForRead(heartOfGold); + repository = factory.openForRead(heartOfGold); assertThat(repository).isNotNull(); verify(environmentBuilder).read(heartOfGold); @@ -78,7 +87,7 @@ class HgRepositoryFactoryTest { @Test void shouldOpenRepositoryForWrite() { - Repository repository = factory.openForWrite(heartOfGold); + repository = factory.openForWrite(heartOfGold); assertThat(repository).isNotNull(); verify(environmentBuilder).write(heartOfGold); @@ -88,7 +97,7 @@ class HgRepositoryFactoryTest { void shouldFallbackToUTF8OnUnknownEncoding() { handler.getConfig().setEncoding("unknown"); - Repository repository = factory.openForRead(heartOfGold); + repository = factory.openForRead(heartOfGold); assertThat(repository.getBaseRepository().getConfiguration().getEncoding()).isEqualTo(StandardCharsets.UTF_8); } @@ -97,7 +106,7 @@ class HgRepositoryFactoryTest { void shouldSetPendingChangesetState() { when(hookEnvironment.isPending()).thenReturn(true); - Repository repository = factory.openForRead(heartOfGold); + repository = factory.openForRead(heartOfGold); assertThat(repository.getBaseRepository().getConfiguration().isEnablePendingChangesets()) .isTrue(); @@ -107,7 +116,7 @@ class HgRepositoryFactoryTest { void shouldPassEnvironment() { when(environmentBuilder.read(heartOfGold)).thenReturn(ImmutableMap.of("spaceship", "heartOfGold")); - Repository repository = factory.openForRead(heartOfGold); + repository = factory.openForRead(heartOfGold); assertThat(repository.getBaseRepository().getConfiguration().getEnvironment()) .containsEntry("spaceship", "heartOfGold"); @@ -122,5 +131,4 @@ class HgRepositoryFactoryTest { return heartOfGold; } - } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgVerifierTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgVerifierTest.java index b733242acd..6a1e624907 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgVerifierTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgVerifierTest.java @@ -29,6 +29,8 @@ import org.assertj.core.util.Strings; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -70,6 +72,7 @@ class HgVerifierTest { } @Test + @DisabledOnOs(OS.WINDOWS) void shouldReturnFalseIfFileIsNotExecutable(@TempDir Path directory) throws IOException { Path hg = directory.resolve("hg"); Files.createFile(hg); @@ -115,7 +118,7 @@ class HgVerifierTest { } @ParameterizedTest - @ValueSource(strings = { "3-2-1", "x.y.z" }) + @ValueSource(strings = {"3-2-1", "x.y.z"}) void shouldReturnInvalidVersions(String version, @TempDir Path directory) throws IOException { HgVerifier verifier = new HgVerifier(hg -> version); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java index 3af18005e8..540a8509c2 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnMirrorCommandTest.java @@ -40,6 +40,7 @@ import sonia.scm.config.ScmConfiguration; import sonia.scm.net.GlobalProxyConfiguration; import sonia.scm.repository.RepositoryTestData; import sonia.scm.repository.api.MirrorCommandResult; +import sonia.scm.util.SystemUtil; import javax.net.ssl.X509TrustManager; import java.io.File; @@ -115,7 +116,7 @@ public class SvnMirrorCommandTest extends AbstractSvnCommandTestBase { private MirrorCommandRequest createRequest(File source) { MirrorCommandRequest request = new MirrorCommandRequest(); - request.setSourceUrl("file://" + source.getAbsolutePath()); + request.setSourceUrl("file://" + (SystemUtil.isWindows() ? "/" : "") + source.getAbsolutePath()); return request; } diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/TarArchiveRepositoryStoreImporter.java b/scm-webapp/src/main/java/sonia/scm/importexport/TarArchiveRepositoryStoreImporter.java index a953f43603..db4fe86eb7 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/TarArchiveRepositoryStoreImporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/TarArchiveRepositoryStoreImporter.java @@ -34,7 +34,6 @@ import sonia.scm.store.StoreEntryMetaData; import sonia.scm.store.StoreType; import javax.inject.Inject; -import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -51,7 +50,7 @@ public class TarArchiveRepositoryStoreImporter { try (TarArchiveInputStream tais = new NoneClosingTarArchiveInputStream(inputStream)) { ArchiveEntry entry = tais.getNextEntry(); while (entry != null) { - String[] entryPathParts = entry.getName().split(File.separator); + String[] entryPathParts = entry.getName().split("/"); validateStorePath(repository, entryPathParts); importStoreByType(repository, tais, entryPathParts, logger); entry = tais.getNextEntry(); diff --git a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java index 0bbeba37d9..658c6af716 100644 --- a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryImporterTest.java @@ -160,11 +160,12 @@ class FullScmRepositoryImporterTest { void shouldNotImportRepositoryIfFileNotExists(@TempDir Path temp) throws IOException { Path emptyFile = temp.resolve("empty"); Files.createFile(emptyFile); - FileInputStream inputStream = new FileInputStream(emptyFile.toFile()); - assertThrows( - ImportFailedException.class, - () -> fullImporter.importFromStream(REPOSITORY, inputStream, "") - ); + try (FileInputStream inputStream = new FileInputStream(emptyFile.toFile())) { + assertThrows( + ImportFailedException.class, + () -> fullImporter.importFromStream(REPOSITORY, inputStream, "") + ); + } } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/DefaultRestarterTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/DefaultRestarterTest.java index c80ce208ac..1f58479532 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/DefaultRestarterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/DefaultRestarterTest.java @@ -24,6 +24,8 @@ package sonia.scm.lifecycle; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -61,6 +63,7 @@ class DefaultRestarterTest { assertThat(restarter.isSupported()).isFalse(); } + @DisabledOnOs(OS.WINDOWS) @Test void shouldReturnTrueIfRestartStrategyIsAvailable() { DefaultRestarter restarter = new DefaultRestarter(); diff --git a/scm-webapp/src/test/java/sonia/scm/web/i18n/I18nServletTest.java b/scm-webapp/src/test/java/sonia/scm/web/i18n/I18nServletTest.java index 2d7cb5297b..8627ade189 100644 --- a/scm-webapp/src/test/java/sonia/scm/web/i18n/I18nServletTest.java +++ b/scm-webapp/src/test/java/sonia/scm/web/i18n/I18nServletTest.java @@ -50,6 +50,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.nio.charset.StandardCharsets; @@ -60,6 +61,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -127,11 +129,10 @@ class I18nServletTest { private Cache cache; @Test - void shouldNotHaveInvalidPluginsJsonFiles() throws IOException { - String path = getClass().getClassLoader().getResource("locales/en/plugins.json").getPath(); - assertThat(path).isNotNull(); + void shouldNotHaveInvalidPluginsJsonFiles() throws Exception { + URI uri = Objects.requireNonNull(getClass().getClassLoader().getResource("locales/en/plugins.json")).toURI(); - Path filePath = Paths.get(path); + Path filePath = Paths.get(uri); Path translationRootPath = filePath.getParent().getParent(); assertThat(translationRootPath).isDirectoryContaining("glob:**/en");