diff --git a/scm-core/src/test/java/sonia/scm/BaseDirectoryTest.java b/scm-core/src/test/java/sonia/scm/BaseDirectoryTest.java index 36b15b0c56..b9342db32d 100644 --- a/scm-core/src/test/java/sonia/scm/BaseDirectoryTest.java +++ b/scm-core/src/test/java/sonia/scm/BaseDirectoryTest.java @@ -25,9 +25,6 @@ package sonia.scm; import com.google.common.collect.ImmutableMap; -import lombok.Builder; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/scm-webapp/src/main/java/sonia/scm/ScmLogFilePropertyDefiner.java b/scm-webapp/src/main/java/sonia/scm/ScmLogFilePropertyDefiner.java index 9161c0eec3..a839d95770 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmLogFilePropertyDefiner.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmLogFilePropertyDefiner.java @@ -21,63 +21,64 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- import ch.qos.logback.core.PropertyDefinerBase; +import com.google.common.annotations.VisibleForTesting; +import sonia.scm.util.SystemUtil; //~--- JDK imports ------------------------------------------------------------ import java.io.File; +import java.util.Properties; /** + * Resolve directory path for SCM-Manager logs. * * @author Sebastian Sdorra */ -public class ScmLogFilePropertyDefiner extends PropertyDefinerBase -{ +public class ScmLogFilePropertyDefiner extends PropertyDefinerBase { - /** Field description */ - public static final String LOG_DIRECTORY = "logs"; + private final String logDirectoryPath; - //~--- constructors --------------------------------------------------------- + public ScmLogFilePropertyDefiner() { + this(SCMContext.getContext(), SystemUtil.getPlatform(), System.getProperties()); + } - /** - * Constructs ... - * - */ - public ScmLogFilePropertyDefiner() - { - File logDirectory = new File(SCMContext.getContext().getBaseDirectory(), - LOG_DIRECTORY); + @VisibleForTesting + ScmLogFilePropertyDefiner(SCMContextProvider context, Platform platform, Properties properties) { + File logDirectory = resolveDirectory(context, platform, properties); - if (!logDirectory.exists() &&!logDirectory.mkdirs()) - { + if (!logDirectory.exists() && !logDirectory.mkdirs()) { throw new ConfigurationException( - "could not create log directory ".concat(logDirectory.getPath())); + "could not create log directory ".concat(logDirectory.getPath())); } this.logDirectoryPath = logDirectory.getAbsolutePath(); } - //~--- get methods ---------------------------------------------------------- + private File resolveDirectory(SCMContextProvider context, Platform platform, Properties properties) { + if (platform.isMac()) { + return resolveOsX(properties); + } else { + return resolveDefault(context); + } + } + + private File resolveOsX(Properties properties) { + return new File(properties.getProperty("user.home"), "Library/Logs/SCM-Manager"); + } + + private File resolveDefault(SCMContextProvider context) { + return new File(context.getBaseDirectory(), "logs"); + } - /** - * Method description - * - * - * @return - */ @Override - public String getPropertyValue() - { + public String getPropertyValue() { return logDirectoryPath; } - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private String logDirectoryPath; } diff --git a/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java b/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java new file mode 100644 index 0000000000..6372c75aa1 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java @@ -0,0 +1,93 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junitpioneer.jupiter.TempDirectory; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.nio.file.Path; +import java.util.Properties; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith({MockitoExtension.class, TempDirectory.class}) +class ScmLogFilePropertyDefinerTest { + + @Mock + private SCMContextProvider context; + + @Test + void shouldReturnPath(@TempDirectory.TempDir Path tempDir) { + when(context.getBaseDirectory()).thenReturn(tempDir.toFile()); + ScmLogFilePropertyDefiner definer = builder().create(); + + Path logDirectory = tempDir.resolve("logs"); + assertThat(definer.getPropertyValue()).isEqualTo(logDirectory.toAbsolutePath().toString()); + } + + @Test + void shouldReturnOsxPath(@TempDirectory.TempDir Path tempDir) { + ScmLogFilePropertyDefiner definer = builder() + .withOs("Mac OS X") + .withUserHome(tempDir.toAbsolutePath().toString()) + .create(); + + Path logDirectory = tempDir.resolve("Library/Logs/SCM-Manager"); + assertThat(definer.getPropertyValue()).isEqualTo(logDirectory.toAbsolutePath().toString()); + } + + private ScmLogFilePropertyDefinerBuilder builder() { + return new ScmLogFilePropertyDefinerBuilder(); + } + + private class ScmLogFilePropertyDefinerBuilder { + + private Platform platform; + private Properties properties = new Properties(); + + public ScmLogFilePropertyDefinerBuilder() { + withOs("Linux"); + } + + public ScmLogFilePropertyDefinerBuilder withOs(String osName) { + platform = new Platform(osName, "64", "x86_64"); + return this; + } + + public ScmLogFilePropertyDefinerBuilder withUserHome(String path) { + properties.setProperty("user.home", path); + return this; + } + + public ScmLogFilePropertyDefiner create() { + return new ScmLogFilePropertyDefiner(context, platform, properties); + } + + } +}