From f0fe513bc009582e371f9af9696e25b5e34c95e7 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 16 Jul 2025 17:56:00 +0200 Subject: [PATCH] feat(env): Improve null values handling --- .../environment/EnvironmentVariables.java | 9 +++++-- .../datadog/environment/SystemProperties.java | 13 +++++++--- .../environment/EnvironmentVariablesTest.java | 24 ++++++++++++++----- .../environment/SystemPropertiesTest.java | 20 ++++++++++++---- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java b/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java index 96f60bd6c4e..2be22a7ad10 100644 --- a/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java +++ b/components/environment/src/main/java/datadog/environment/EnvironmentVariables.java @@ -16,7 +16,8 @@ private EnvironmentVariables() {} * Gets an environment variable value. * * @param name The environment variable name. - * @return The environment variable value, {@code null} if missing or can't be retrieved. + * @return The environment variable value, {@code null} if missing, can't be retrieved, or the + * environment variable name is {@code null}. */ public static @Nullable String get(String name) { return getOrDefault(name, null); @@ -28,9 +29,13 @@ private EnvironmentVariables() {} * @param name The environment variable name. * @param defaultValue The default value to return if the environment variable is missing or can't * be retrieved. - * @return The environment variable value, {@code defaultValue} if missing or can't be retrieved. + * @return The environment variable value, {@code defaultValue} if missing, can't be retrieved or + * the environment variable name is {@code null}. */ public static String getOrDefault(@Nonnull String name, String defaultValue) { + if (name == null) { + return defaultValue; + } try { String value = System.getenv(name); return value == null ? defaultValue : value; diff --git a/components/environment/src/main/java/datadog/environment/SystemProperties.java b/components/environment/src/main/java/datadog/environment/SystemProperties.java index 29b8e25804c..2a64d30d154 100644 --- a/components/environment/src/main/java/datadog/environment/SystemProperties.java +++ b/components/environment/src/main/java/datadog/environment/SystemProperties.java @@ -1,5 +1,7 @@ package datadog.environment; +import javax.annotation.Nonnull; + /** * Safely queries system properties against security manager. * @@ -13,7 +15,8 @@ private SystemProperties() {} * Gets a system property value. * * @param property The system property name. - * @return The system property value, {@code null} if missing or can't be retrieved. + * @return The system property value, {@code null} if missing, can't be retrieved, or the system + * property name is {@code null}. */ public static String get(String property) { return getOrDefault(property, null); @@ -25,9 +28,13 @@ public static String get(String property) { * @param property The system property name. * @param defaultValue The default value to return if the system property is missing or can't be * retrieved. - * @return The system property value, {@code defaultValue} if missing or can't be retrieved. + * @return The system property value, {@code defaultValue} if missing, can't be retrieved, or the + * system property name is {@code null}. */ - public static String getOrDefault(String property, String defaultValue) { + public static String getOrDefault(@Nonnull String property, String defaultValue) { + if (property == null) { + return defaultValue; + } try { return System.getProperty(property, defaultValue); } catch (SecurityException ignored) { diff --git a/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java b/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java index 80cb4f601b6..695c95e2f09 100644 --- a/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java +++ b/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java @@ -1,27 +1,39 @@ package datadog.environment; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import org.junit.jupiter.api.Test; class EnvironmentVariablesTest { private static final String EXISTING_ENV_VAR = "JAVA_8_HOME"; private static final String MISSING_ENV_VAR = "UNDEFINED_ENV_VAR"; + private static final String DEFAULT_VALUE = "DEFAULT"; @Test void testGet() { + // Existing environment variable assertNotNull(EnvironmentVariables.get(EXISTING_ENV_VAR)); + // Missing environment variable assertNull(EnvironmentVariables.get(MISSING_ENV_VAR)); - assertThrows(NullPointerException.class, () -> EnvironmentVariables.get(null)); + // Null values + assertDoesNotThrow(() -> EnvironmentVariables.get(null)); + assertNull(EnvironmentVariables.get(null)); } @Test void testGetOrDefault() { + // Existing environment variable assertNotNull(EnvironmentVariables.getOrDefault(EXISTING_ENV_VAR, null)); - - assertEquals("", EnvironmentVariables.getOrDefault(MISSING_ENV_VAR, "")); + // Missing environment variable + assertEquals(DEFAULT_VALUE, EnvironmentVariables.getOrDefault(MISSING_ENV_VAR, DEFAULT_VALUE)); + assertNull(EnvironmentVariables.getOrDefault(MISSING_ENV_VAR, null)); + // Null values + assertDoesNotThrow(() -> EnvironmentVariables.getOrDefault(null, DEFAULT_VALUE)); + assertEquals(DEFAULT_VALUE, EnvironmentVariables.getOrDefault(null, DEFAULT_VALUE)); + assertDoesNotThrow(() -> EnvironmentVariables.getOrDefault(MISSING_ENV_VAR, null)); assertNull(EnvironmentVariables.getOrDefault(MISSING_ENV_VAR, null)); - - assertThrows(NullPointerException.class, () -> EnvironmentVariables.getOrDefault(null, "")); } } diff --git a/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java b/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java index a145071c442..713da94fafe 100644 --- a/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java +++ b/components/environment/src/test/java/datadog/environment/SystemPropertiesTest.java @@ -8,22 +8,32 @@ class SystemPropertiesTest { private static final String EXISTING_SYSTEM_PROPERTY = "java.home"; private static final String MISSING_SYSTEM_PROPERTY = "undefined.system.property"; + private static final String DEFAULT_VALUE = "DEFAULT"; @Test void testGet() { + // Existing system properties assertNotNull(SystemProperties.get(EXISTING_SYSTEM_PROPERTY)); + // Missing system properties assertNull(SystemProperties.get(MISSING_SYSTEM_PROPERTY)); - assertThrows(NullPointerException.class, () -> SystemProperties.get(null)); + // Null values + assertDoesNotThrow(() -> SystemProperties.get(null)); + assertNull(SystemProperties.get(null)); } @Test void testGetOrDefault() { + // Existing system properties assertNotNull(SystemProperties.getOrDefault(EXISTING_SYSTEM_PROPERTY, null)); - - assertEquals("", SystemProperties.getOrDefault(MISSING_SYSTEM_PROPERTY, "")); + // Missing system properties + assertEquals( + DEFAULT_VALUE, SystemProperties.getOrDefault(MISSING_SYSTEM_PROPERTY, DEFAULT_VALUE)); + assertNull(SystemProperties.getOrDefault(MISSING_SYSTEM_PROPERTY, null)); + // Null values + assertDoesNotThrow(() -> SystemProperties.getOrDefault(null, DEFAULT_VALUE)); + assertEquals(DEFAULT_VALUE, SystemProperties.getOrDefault(null, DEFAULT_VALUE)); + assertDoesNotThrow(() -> SystemProperties.getOrDefault(MISSING_SYSTEM_PROPERTY, null)); assertNull(SystemProperties.getOrDefault(MISSING_SYSTEM_PROPERTY, null)); - - assertThrows(NullPointerException.class, () -> SystemProperties.getOrDefault(null, "")); } @Test