Skip to content

Commit 5309bf0

Browse files
committed
fix: update Config defaults to boolean types and enhance environment variable handling
1 parent d69584b commit 5309bf0

3 files changed

Lines changed: 92 additions & 9 deletions

File tree

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public final class Config {
1313
static final Resolver DEFAULT_RESOLVER_TYPE = Resolver.RPC;
1414
static final String DEFAULT_RPC_PORT = "8013";
1515
static final String DEFAULT_IN_PROCESS_PORT = "8015";
16-
static final String DEFAULT_TLS = "false";
16+
static final boolean DEFAULT_TLS = false;
1717
static final String DEFAULT_HOST = "localhost";
1818

1919
static final int DEFAULT_DEADLINE = 500;
@@ -23,7 +23,7 @@ public final class Config {
2323
static final int DEFAULT_MAX_CACHE_SIZE = 1000;
2424
static final int DEFAULT_OFFLINE_POLL_MS = 5000;
2525
static final long DEFAULT_KEEP_ALIVE = 0;
26-
static final String DEFAULT_REINITIALIZE_ON_ERROR = "false";
26+
static final boolean DEFAULT_REINITIALIZE_ON_ERROR = false;
2727

2828
static final String RESOLVER_ENV_VAR = "FLAGD_RESOLVER";
2929
static final String HOST_ENV_VAR_NAME = "FLAGD_HOST";
@@ -84,21 +84,55 @@ static String fallBackToEnvOrDefault(String key, String defaultValue) {
8484
}
8585

8686
static int fallBackToEnvOrDefault(String key, int defaultValue) {
87+
final String value = System.getenv(key);
88+
if (value == null) {
89+
return defaultValue;
90+
}
8791
try {
88-
return System.getenv(key) != null ? Integer.parseInt(System.getenv(key)) : defaultValue;
89-
} catch (Exception e) {
92+
return Integer.parseInt(value);
93+
} catch (NumberFormatException e) {
94+
logInvalidEnvValue(key, value, "an integer", defaultValue);
9095
return defaultValue;
9196
}
9297
}
9398

9499
static long fallBackToEnvOrDefault(String key, long defaultValue) {
100+
final String value = System.getenv(key);
101+
if (value == null) {
102+
return defaultValue;
103+
}
95104
try {
96-
return System.getenv(key) != null ? Long.parseLong(System.getenv(key)) : defaultValue;
97-
} catch (Exception e) {
105+
return Long.parseLong(value);
106+
} catch (NumberFormatException e) {
107+
logInvalidEnvValue(key, value, "an integer", defaultValue);
98108
return defaultValue;
99109
}
100110
}
101111

112+
static boolean fallBackToEnvOrDefault(String key, boolean defaultValue) {
113+
final String value = System.getenv(key);
114+
if (value == null) {
115+
return defaultValue;
116+
}
117+
if ("true".equalsIgnoreCase(value)) {
118+
return true;
119+
}
120+
if ("false".equalsIgnoreCase(value)) {
121+
return false;
122+
}
123+
logInvalidEnvValue(key, value, "'true' or 'false'", defaultValue);
124+
return defaultValue;
125+
}
126+
127+
private static void logInvalidEnvValue(String key, String value, String expected, Object defaultValue) {
128+
log.error(
129+
"Invalid value '{}' for environment variable {}: expected {}. Falling back to default value '{}'.",
130+
value,
131+
key,
132+
expected,
133+
defaultValue);
134+
}
135+
102136
static List<String> fallBackToEnvOrDefaultList(String key, List<String> defaultValue) {
103137
try {
104138
return System.getenv(key) != null

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class FlagdOptions {
6060
* Use TLS connectivity.
6161
*/
6262
@Builder.Default
63-
private boolean tls = Boolean.parseBoolean(fallBackToEnvOrDefault(Config.TLS_ENV_VAR_NAME, Config.DEFAULT_TLS));
63+
private boolean tls = fallBackToEnvOrDefault(Config.TLS_ENV_VAR_NAME, Config.DEFAULT_TLS);
6464

6565
/**
6666
* TLS certificate overriding if TLS connectivity is used.
@@ -235,8 +235,8 @@ public class FlagdOptions {
235235
* Particularly useful for troubleshooting network issues related to proxies or service meshes.
236236
*/
237237
@Builder.Default
238-
private boolean reinitializeOnError = Boolean.parseBoolean(
239-
fallBackToEnvOrDefault(Config.REINITIALIZE_ON_ERROR_ENV_VAR_NAME, Config.DEFAULT_REINITIALIZE_ON_ERROR));
238+
private boolean reinitializeOnError =
239+
fallBackToEnvOrDefault(Config.REINITIALIZE_ON_ERROR_ENV_VAR_NAME, Config.DEFAULT_REINITIALIZE_ON_ERROR);
240240

241241
/**
242242
* !EXPERIMENTAL!

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package dev.openfeature.contrib.providers.flagd;
22

3+
import static dev.openfeature.contrib.providers.flagd.Config.DEADLINE_MS_ENV_VAR_NAME;
34
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_CACHE;
5+
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_DEADLINE;
46
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_HOST;
57
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_IN_PROCESS_PORT;
8+
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_KEEP_ALIVE;
69
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_MAX_CACHE_SIZE;
710
import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_RPC_PORT;
811
import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME;
912
import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME_OLD;
13+
import static dev.openfeature.contrib.providers.flagd.Config.MAX_CACHE_SIZE_ENV_VAR_NAME;
1014
import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME;
1115
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_ENV_VAR;
1216
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_IN_PROCESS;
1317
import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_RPC;
1418
import static dev.openfeature.contrib.providers.flagd.Config.SYNC_PORT_ENV_VAR_NAME;
1519
import static dev.openfeature.contrib.providers.flagd.Config.TARGET_URI_ENV_VAR_NAME;
20+
import static dev.openfeature.contrib.providers.flagd.Config.TLS_ENV_VAR_NAME;
1621
import static org.assertj.core.api.Assertions.assertThat;
1722
import static org.junit.jupiter.api.Assertions.assertEquals;
1823
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -329,4 +334,48 @@ void testTargetOverrideFromEnv() {
329334

330335
assertThat(flagdOptions.getTargetUri()).isEqualTo("envoy://localhost:1234/foo.service");
331336
}
337+
338+
@Nested
339+
class InvalidEnvironmentVariables {
340+
341+
@Test
342+
@SetEnvironmentVariable(key = DEADLINE_MS_ENV_VAR_NAME, value = "not-a-number")
343+
void invalidIntFallsBackToDefault() {
344+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
345+
346+
assertThat(flagdOptions.getDeadline()).isEqualTo(DEFAULT_DEADLINE);
347+
}
348+
349+
@Test
350+
@SetEnvironmentVariable(key = MAX_CACHE_SIZE_ENV_VAR_NAME, value = "10.5")
351+
void invalidIntWithDecimalFallsBackToDefault() {
352+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
353+
354+
assertThat(flagdOptions.getMaxCacheSize()).isEqualTo(DEFAULT_MAX_CACHE_SIZE);
355+
}
356+
357+
@Test
358+
@SetEnvironmentVariable(key = KEEP_ALIVE_MS_ENV_VAR_NAME, value = "abc")
359+
void invalidLongFallsBackToDefault() {
360+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
361+
362+
assertThat(flagdOptions.getKeepAlive()).isEqualTo(DEFAULT_KEEP_ALIVE);
363+
}
364+
365+
@Test
366+
@SetEnvironmentVariable(key = TLS_ENV_VAR_NAME, value = "yes")
367+
void invalidBooleanFallsBackToDefault() {
368+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
369+
370+
assertThat(flagdOptions.isTls()).isFalse();
371+
}
372+
373+
@Test
374+
@SetEnvironmentVariable(key = TLS_ENV_VAR_NAME, value = "TRUE")
375+
void booleanIsParsedCaseInsensitively() {
376+
FlagdOptions flagdOptions = FlagdOptions.builder().build();
377+
378+
assertThat(flagdOptions.isTls()).isTrue();
379+
}
380+
}
332381
}

0 commit comments

Comments
 (0)