diff --git a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/Config.java b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/Config.java index 5a0609af9b0..9fe713de125 100644 --- a/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/Config.java +++ b/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/Config.java @@ -57,6 +57,8 @@ import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.function.Predicate; +import java.util.function.UnaryOperator; import java.util.stream.Collectors; @JsonInclude(JsonInclude.Include.NON_NULL) @@ -867,34 +869,40 @@ private static boolean tryNamespaceFromPath(Config config) { } private static String getHomeDir() { + return getHomeDir(Config::isDirectoryAndExists, Config::getSystemEnvVariable); + } + + private static boolean isDirectoryAndExists(String filePath) { + File f = new File(filePath); + return f.exists() && f.isDirectory(); + } + + private static String getSystemEnvVariable(String envVariableName) { + return System.getenv(envVariableName); + } + + protected static String getHomeDir(Predicate directoryExists, UnaryOperator getEnvVar) { + String home = getEnvVar.apply("HOME"); + if (home != null && !home.isEmpty() && directoryExists.test(home)) { + return home; + } String osName = System.getProperty("os.name").toLowerCase(Locale.ROOT); if (osName.startsWith("win")) { - String homeDrive = System.getenv("HOMEDRIVE"); - String homePath = System.getenv("HOMEPATH"); + String homeDrive = getEnvVar.apply("HOMEDRIVE"); + String homePath = getEnvVar.apply("HOMEPATH"); if (homeDrive != null && !homeDrive.isEmpty() && homePath != null && !homePath.isEmpty()) { String homeDir = homeDrive + homePath; - File f = new File(homeDir); - if (f.exists() && f.isDirectory()) { + if (directoryExists.test(homeDir)) { return homeDir; } } - String userProfile = System.getenv("USERPROFILE"); - if (userProfile != null && !userProfile.isEmpty()) { - File f = new File(userProfile); - if (f.exists() && f.isDirectory()) { - return userProfile; - } - } - } - String home = System.getenv("HOME"); - if (home != null && !home.isEmpty()) { - File f = new File(home); - if (f.exists() && f.isDirectory()) { - return home; + String userProfile = getEnvVar.apply("USERPROFILE"); + if (userProfile != null && !userProfile.isEmpty() && directoryExists.test(userProfile)) { + return userProfile; } } - //Fall back to user.home should never really get here + // Fall back to user.home should never really get here return System.getProperty("user.home", "."); } diff --git a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/ConfigTest.java b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/ConfigTest.java index 76bfdf76954..221594bc860 100644 --- a/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/ConfigTest.java +++ b/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/ConfigTest.java @@ -25,6 +25,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; import java.io.File; import java.io.IOException; @@ -46,6 +47,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.condition.OS.WINDOWS; public class ConfigTest { @@ -667,4 +669,91 @@ private String getTestPathValue(File commandFolder) { "/opt/apache-maven/bin"; } } + + @Test + void getHomeDir_shouldUseHomedriveHomepathOnWindows_WhenHomeEnvVariableIsNotSet() { + String osNamePropToRestore = System.getProperty("os.name"); + try { + + System.setProperty("os.name", "Windows"); + + Map envVars = new HashMap(); + envVars.put("HOMEDRIVE", "C:\\Users\\"); + envVars.put("HOMEPATH", "user"); + envVars.put("USERPROFILE", "C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\"); + + assertEquals("C:\\Users\\user", Config.getHomeDir(f -> true, envVars::get)); + + } finally { + System.setProperty("os.name", osNamePropToRestore); + } + } + + @Test + void getHomeDir_shouldUseUserprofileOnWindows_WhenHomeHomedriveHomepathEnvVariablesAreNotSet() { + String osNamePropToRestore = System.getProperty("os.name"); + try { + + System.setProperty("os.name", "Windows"); + + Map envVars = new HashMap(); + envVars.put("USERPROFILE", "C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\"); + + assertEquals("C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\", + Config.getHomeDir(f -> true, envVars::get)); + + } finally { + System.setProperty("os.name", osNamePropToRestore); + } + } + + @Test + void getHomeDir_shouldUseHomeEnvVariableOnWindows_WhenHomeEnvVariableIsSet() { + String osNamePropToRestore = System.getProperty("os.name"); + try { + + System.setProperty("os.name", "Windows"); + + Map envVars = new HashMap(); + envVars.put("HOMEDRIVE", "C:\\Users\\"); + envVars.put("HOMEPATH", "user"); + envVars.put("HOME", "C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\"); + + assertEquals("C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\", + Config.getHomeDir(f -> true, envVars::get)); + + } finally { + System.setProperty("os.name", osNamePropToRestore); + } + } + + @Test + @EnabledOnOs({ WINDOWS }) + void getHomeDir_shouldUseHomeEnvVariable_WhenEnabledOnWindows_WhenHomeEnvVariableIsSet() { + + Map envVars = new HashMap(); + envVars.put("HOMEDRIVE", "C:\\Users\\"); + envVars.put("HOMEPATH", "user"); + envVars.put("HOME", "C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\"); + + assertEquals("C:\\Users\\user\\workspace\\myworkspace\\tools\\cygwin\\", + Config.getHomeDir(f -> true, envVars::get)); + + } + + @Test + void getHomeDir_shouldReturnUserHomeProp_WhenHomeEnvVariablesAreNotSet() { + String userHomePropToRestore = System.getProperty("user.home"); + try { + + System.setProperty("user.home", "/home/user"); + + Map emptyEnvVars = Collections.emptyMap(); + + assertEquals("/home/user", Config.getHomeDir(f -> true, emptyEnvVars::get)); + + } finally { + System.setProperty("user.home", userHomePropToRestore); + } + } }