From d37399cf281ebde083a86ce63294a9bdbcd5d50b Mon Sep 17 00:00:00 2001 From: Thomas Hardy Date: Sat, 4 Apr 2026 13:52:49 -0700 Subject: [PATCH] Fix - provide default (empty) client config when default user config dir does not exist --- .../java/io/temporal/envconfig/ClientConfig.java | 11 +++++++++-- .../envconfig/ClientConfigProfileTest.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfig.java b/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfig.java index 30dfa9b43..7124c11bd 100644 --- a/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfig.java +++ b/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfig.java @@ -44,13 +44,16 @@ public static ClientConfig getDefaultInstance() { private static String getDefaultConfigFilePath() { String userDir = System.getProperty("user.home"); if (userDir == null || userDir.isEmpty()) { - throw new RuntimeException("failed getting user home directory"); + return null; } return getDefaultConfigFilePath(userDir, System.getProperty("os.name"), System.getenv()); } static String getDefaultConfigFilePath( String userDir, String osName, Map environment) { + if (userDir == null || userDir.isEmpty()) { + return null; + } if (osName != null) { String osNameLower = osName.toLowerCase(); if (osNameLower.contains("mac")) { @@ -60,7 +63,7 @@ static String getDefaultConfigFilePath( if (osNameLower.contains("win")) { String appData = environment != null ? environment.get("APPDATA") : null; if (appData == null || appData.isEmpty()) { - throw new RuntimeException("%APPDATA% is not defined"); + return null; } return Paths.get(appData, "temporalio", "temporal.toml").toString(); } @@ -122,6 +125,10 @@ public static ClientConfig load(LoadClientConfigOptions options) throws IOExcept if (file == null || file.isEmpty()) { file = getDefaultConfigFilePath(); } + // No config dir available — return default empty config + if (file == null) { + return getDefaultInstance(); + } try { ClientConfigToml.TomlClientConfig result = reader.readValue(new File(file)); return new ClientConfig(ClientConfigToml.getClientProfiles(result)); diff --git a/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java b/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java index 85c50159f..f52c787d3 100644 --- a/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java +++ b/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java @@ -325,6 +325,22 @@ public void defaultConfigFilePath() { ClientConfig.getDefaultConfigFilePath("/home/test", "Linux", Collections.emptyMap())); } + @Test + public void loadDefaultConfigMissingHomeDir() throws IOException { + String original = System.getProperty("user.home"); + try { + System.setProperty("user.home", ""); + ClientConfig config = + ClientConfig.load( + LoadClientConfigOptions.newBuilder().setEnvOverrides(Collections.emptyMap()).build()); + Assert.assertEquals(ClientConfig.getDefaultInstance(), config); + } finally { + if (original != null) { + System.setProperty("user.home", original); + } + } + } + @Test public void parseToml() throws IOException { String toml =