Skip to content

Commit 36e4f62

Browse files
committed
adding unit tests for ConfigHelper
1 parent e037a8e commit 36e4f62

File tree

7 files changed

+322
-31
lines changed

7 files changed

+322
-31
lines changed

components/environment/src/generator/resources/supported-configurations.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,12 @@
649649
"DD_TRACE_GOOGLE_PUBSUB_LEGACY_TRACING_ENABLED": ["A"],
650650
"DD_TRACE_GOOGLE_PUBSUB_PUBLISHER_ENABLED": ["A"],
651651
"DD_TRACE_GOOGLE_PUBSUB_RECEIVER_ENABLED": ["A"],
652+
"DD_TRACE_GRADLE_ENABLED": ["A"],
653+
"DD_TRACE_GRADLE_BUILD_LISTENER_ENABLED": ["A"],
654+
"DD_TRACE_GRADLE_BUILD_SCOPE_SERVICES_ENABLED": ["A"],
655+
"DD_TRACE_GRADLE_DAEMON_LOGGING_ENABLED": ["A"],
656+
"DD_TRACE_GRADLE_DAEMON_JVM_OPTIONS_ENABLED": ["A"],
657+
"DD_TRACE_GRADLE_PLUGIN_INJECTOR_ENABLED": ["A"],
652658
"DD_TRACE_GRAPHQL_JAVA_ANALYTICS_ENABLED": ["A"],
653659
"DD_TRACE_GRAPHQL_JAVA_ANALYTICS_SAMPLE_RATE": ["A"],
654660
"DD_TRACE_GRAPHQL_JAVA_ENABLED": ["A"],
@@ -1423,6 +1429,12 @@
14231429
"DD_TRACE_GOOGLE_PUBSUB_ENABLED": ["DD_TRACE_INTEGRATION_GOOGLE_PUBSUB_ENABLED","DD_INTEGRATION_GOOGLE_PUBSUB_ENABLED"],
14241430
"DD_TRACE_GOOGLE_PUBSUB_PUBLISHER_ENABLED": ["DD_TRACE_INTEGRATION_GOOGLE_PUBSUB_PUBLISHER_ENABLED","DD_INTEGRATION_GOOGLE_PUBSUB_PUBLISHER_ENABLED"],
14251431
"DD_TRACE_GOOGLE_PUBSUB_RECEIVER_ENABLED": ["DD_TRACE_INTEGRATION_GOOGLE_PUBSUB_RECEIVER_ENABLED","DD_INTEGRATION_GOOGLE_PUBSUB_RECEIVER_ENABLED"],
1432+
"DD_TRACE_GRADLE_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_ENABLED","DD_INTEGRATION_GRADLE_ENABLED"],
1433+
"DD_TRACE_GRADLE_BUILD_LISTENER_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_BUILD_LISTENER_ENABLED","DD_INTEGRATION_GRADLE_BUILD_LISTENER_ENABLED"],
1434+
"DD_TRACE_GRADLE_BUILD_SCOPE_SERVICES_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_BUILD_SCOPE_SERVICES_ENABLED","DD_INTEGRATION_GRADLE_BUILD_SCOPE_SERVICES_ENABLED"],
1435+
"DD_TRACE_GRADLE_DAEMON_LOGGING_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_DAEMON_LOGGING_ENABLED","DD_INTEGRATION_GRADLE_DAEMON_LOGGING_ENABLED"],
1436+
"DD_TRACE_GRADLE_DAEMON_JVM_OPTIONS_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_DAEMON_JVM_OPTIONS_ENABLED","DD_INTEGRATION_GRADLE_DAEMON_JVM_OPTIONS_ENABLED"],
1437+
"DD_TRACE_GRADLE_PLUGIN_INJECTOR_ENABLED": ["DD_TRACE_INTEGRATION_GRADLE_PLUGIN_INJECTOR_ENABLED","DD_INTEGRATION_GRADLE_PLUGIN_INJECTOR_ENABLED"],
14261438
"DD_TRACE_GRAPHQL_JAVA_ANALYTICS_SAMPLE_RATE": ["DD_GRAPHQL_JAVA_ANALYTICS_SAMPLE_RATE"],
14271439
"DD_TRACE_GRAPHQL_JAVA_ENABLED": ["DD_TRACE_INTEGRATION_GRAPHQL_JAVA_ENABLED","DD_INTEGRATION_GRAPHQL_JAVA_ENABLED"],
14281440
"DD_TRACE_GRIZZLY_ANALYTICS_SAMPLE_RATE": ["DD_GRIZZLY_ANALYTICS_SAMPLE_RATE"],

components/environment/src/main/java/datadog/environment/ConfigHelper.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
public class ConfigHelper {
1010
private static boolean configInversionStrict;
1111

12+
// Default to production source
13+
private static SupportedConfigurationSource configSource = new SupportedConfigurationSource();
14+
1215
public static void setConfigInversionStrict(boolean configInversionStrict) {
1316
ConfigHelper.configInversionStrict = configInversionStrict;
1417
}
@@ -17,6 +20,17 @@ public static boolean isConfigInversionStrict() {
1720
return configInversionStrict;
1821
}
1922

23+
// Used only for testing purposes
24+
static void setConfigurationSource(SupportedConfigurationSource testSource) {
25+
configSource = testSource;
26+
}
27+
28+
/** Reset all configuration data to the generated defaults. Useful for cleaning up after tests. */
29+
static void resetToDefaults() {
30+
configSource = new SupportedConfigurationSource();
31+
configInversionStrict = false;
32+
}
33+
2034
public static Map<String, String> getEnvironmentVariables() {
2135
Map<String, String> env = System.getenv();
2236
Map<String, String> configs = new LinkedHashMap<>();
@@ -25,19 +39,18 @@ public static Map<String, String> getEnvironmentVariables() {
2539
String value = entry.getValue();
2640
if (key.startsWith("DD_")
2741
|| key.startsWith("OTEL_")
28-
|| GeneratedSupportedConfigurations.ALIAS_MAPPING.containsKey(key)) {
29-
if (GeneratedSupportedConfigurations.SUPPORTED.contains(key)) {
42+
|| configSource.getAliasMapping().containsKey(key)) {
43+
if (configSource.getSupportedConfigurations().contains(key)) {
3044
configs.put(key, value);
3145
// If this environment variable is the alias of another, and we haven't processed the
3246
// original environment variable yet, handle it here.
33-
} else if (GeneratedSupportedConfigurations.ALIAS_MAPPING.containsKey(key)
34-
&& !configs.containsKey(GeneratedSupportedConfigurations.ALIAS_MAPPING.get(key))) {
47+
} else if (configSource.getAliasMapping().containsKey(key)
48+
&& !configs.containsKey(configSource.getAliasMapping().get(key))) {
3549
List<String> aliasList =
36-
GeneratedSupportedConfigurations.ALIASES.get(
37-
GeneratedSupportedConfigurations.ALIAS_MAPPING.get(key));
50+
configSource.getAliases().get(configSource.getAliasMapping().get(key));
3851
for (String alias : aliasList) {
3952
if (env.containsKey(alias)) {
40-
configs.put(GeneratedSupportedConfigurations.ALIAS_MAPPING.get(key), env.get(alias));
53+
configs.put(configSource.getAliasMapping().get(key), env.get(alias));
4154
break;
4255
}
4356
}
@@ -58,16 +71,18 @@ public static Map<String, String> getEnvironmentVariables() {
5871

5972
public static String getEnvironmentVariable(String name) {
6073
if ((name.startsWith("DD_") || name.startsWith("OTEL_"))
61-
&& !GeneratedSupportedConfigurations.ALIAS_MAPPING.containsKey(name)
62-
&& !GeneratedSupportedConfigurations.SUPPORTED.contains(name)
63-
&& configInversionStrict) {
74+
&& !configSource.getAliasMapping().containsKey(name)
75+
&& !configSource.getSupportedConfigurations().contains(name)) {
6476
System.err.println(
6577
"Warning: Missing environment variable " + name + " from supported-configurations.json.");
78+
if (configInversionStrict) {
79+
return null; // If strict mode is enabled, return null for unsupported configs
80+
}
6681
}
6782

6883
String config = EnvironmentVariables.get(name);
69-
if (config == null && GeneratedSupportedConfigurations.ALIASES.containsKey(name)) {
70-
for (String alias : GeneratedSupportedConfigurations.ALIASES.get(name)) {
84+
if (config == null && configSource.getAliases().containsKey(name)) {
85+
for (String alias : configSource.getAliases().get(name)) {
7186
String aliasValue = EnvironmentVariables.get(alias);
7287
if (aliasValue != null) {
7388
return aliasValue;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package datadog.environment;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
import java.util.Set;
6+
7+
/**
8+
* This class uses {@link #GeneratedSupportedConfigurations} for handling supported configurations
9+
* for Config Inversion Can be extended for testing with custom configuration data.
10+
*/
11+
class SupportedConfigurationSource {
12+
13+
/** @return Set of supported configuration keys */
14+
public Set<String> getSupportedConfigurations() {
15+
return GeneratedSupportedConfigurations.SUPPORTED;
16+
}
17+
18+
/** @return Map of configuration keys to their aliases */
19+
public Map<String, List<String>> getAliases() {
20+
return GeneratedSupportedConfigurations.ALIASES;
21+
}
22+
23+
/** @return Map of alias keys to their primary configuration keys */
24+
public Map<String, String> getAliasMapping() {
25+
return GeneratedSupportedConfigurations.ALIAS_MAPPING;
26+
}
27+
28+
/** @return Map of deprecated configurations */
29+
public Map<String, String> getDeprecatedConfigurations() {
30+
return GeneratedSupportedConfigurations.DEPRECATED;
31+
}
32+
}
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
package datadog.environment;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertNull;
6+
7+
import java.lang.reflect.Field;
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.HashMap;
11+
import java.util.HashSet;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.Set;
15+
import org.junit.jupiter.api.AfterAll;
16+
import org.junit.jupiter.api.BeforeAll;
17+
import org.junit.jupiter.api.Test;
18+
19+
public class ConfigHelperTest {
20+
// Test environment variables
21+
private static final String TEST_DD_VAR = "DD_TEST_CONFIG";
22+
private static final String TEST_DD_VAR_VAL = "test_dd_var";
23+
private static final String TEST_OTEL_VAR = "OTEL_TEST_CONFIG";
24+
private static final String TEST_OTEL_VAR_VAL = "test_otel_var";
25+
private static final String TEST_REGULAR_VAR = "REGULAR_TEST_CONFIG";
26+
private static final String TEST_REGULAR_VAR_VAL = "test_regular_var";
27+
private static final String UNSUPPORTED_DD_VAR = "DD_UNSUPPORTED_CONFIG";
28+
29+
private static final String ALIAS_DD_VAR = "DD_TEST_CONFIG_ALIAS";
30+
private static final String ALIAS_DD_VAL = "test_alias_val";
31+
private static final String NON_DD_ALIAS_VAR = "TEST_CONFIG_ALIAS";
32+
private static final String NON_DD_ALIAS_VAL = "test_alias_val_non_dd";
33+
34+
private static boolean strictness;
35+
private static TestSupportedConfigurationSource testSource;
36+
37+
@BeforeAll
38+
static void setUp() {
39+
// Set up test configurations using SupportedConfigurationSource
40+
Set<String> testSupported =
41+
new HashSet<>(Arrays.asList(TEST_DD_VAR, TEST_OTEL_VAR, TEST_REGULAR_VAR));
42+
43+
Map<String, List<String>> testAliases = new HashMap<>();
44+
testAliases.put(TEST_DD_VAR, Arrays.asList(ALIAS_DD_VAR, NON_DD_ALIAS_VAR));
45+
46+
Map<String, String> testAliasMapping = new HashMap<>();
47+
testAliasMapping.put(ALIAS_DD_VAR, TEST_DD_VAR);
48+
testAliasMapping.put(NON_DD_ALIAS_VAR, TEST_DD_VAR);
49+
50+
// Create and set test configuration source
51+
testSource =
52+
new TestSupportedConfigurationSource(
53+
testSupported, testAliases, testAliasMapping, new HashMap<>());
54+
ConfigHelper.setConfigurationSource(testSource);
55+
strictness = ConfigHelper.isConfigInversionStrict();
56+
ConfigHelper.setConfigInversionStrict(true);
57+
}
58+
59+
@AfterAll
60+
static void tearDown() {
61+
ConfigHelper.resetToDefaults();
62+
ConfigHelper.setConfigInversionStrict(strictness);
63+
}
64+
65+
@Test
66+
void testBasicConfigHelper() {
67+
setEnvVar(TEST_DD_VAR, TEST_DD_VAR_VAL);
68+
setEnvVar(TEST_OTEL_VAR, TEST_OTEL_VAR_VAL);
69+
setEnvVar(TEST_REGULAR_VAR, TEST_REGULAR_VAR_VAL);
70+
71+
assertEquals(TEST_DD_VAR_VAL, ConfigHelper.getEnvironmentVariable(TEST_DD_VAR));
72+
assertEquals(TEST_OTEL_VAR_VAL, ConfigHelper.getEnvironmentVariable(TEST_OTEL_VAR));
73+
assertEquals(TEST_REGULAR_VAR_VAL, ConfigHelper.getEnvironmentVariable(TEST_REGULAR_VAR));
74+
75+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
76+
assertEquals(TEST_DD_VAR_VAL, result.get(TEST_DD_VAR));
77+
assertEquals(TEST_OTEL_VAR_VAL, result.get(TEST_OTEL_VAR));
78+
assertEquals(TEST_REGULAR_VAR_VAL, result.get(TEST_REGULAR_VAR));
79+
80+
// Cleanup
81+
setEnvVar(TEST_DD_VAR, null);
82+
setEnvVar(TEST_OTEL_VAR, null);
83+
setEnvVar(TEST_REGULAR_VAR, null);
84+
}
85+
86+
@Test
87+
void testAliasSupport() {
88+
setEnvVar(ALIAS_DD_VAR, ALIAS_DD_VAL);
89+
90+
assertEquals(ALIAS_DD_VAL, ConfigHelper.getEnvironmentVariable(TEST_DD_VAR));
91+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
92+
assertEquals(ALIAS_DD_VAL, result.get(TEST_DD_VAR));
93+
assertFalse(result.containsKey(ALIAS_DD_VAR));
94+
95+
// Cleanup
96+
setEnvVar(ALIAS_DD_VAR, null);
97+
}
98+
99+
@Test
100+
void testMainConfigPrecedence() {
101+
// When both main variable and alias are set, main should take precedence
102+
setEnvVar(TEST_DD_VAR, TEST_DD_VAR_VAL);
103+
setEnvVar(ALIAS_DD_VAR, ALIAS_DD_VAL);
104+
105+
assertEquals(TEST_DD_VAR_VAL, ConfigHelper.getEnvironmentVariable(TEST_DD_VAR));
106+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
107+
assertEquals(TEST_DD_VAR_VAL, result.get(TEST_DD_VAR));
108+
assertFalse(result.containsKey(ALIAS_DD_VAR));
109+
110+
// Cleanup
111+
setEnvVar(TEST_DD_VAR, null);
112+
setEnvVar(ALIAS_DD_VAR, null);
113+
}
114+
115+
@Test
116+
void testUnsupportedDDEnvironmentVariable() {
117+
setEnvVar(UNSUPPORTED_DD_VAR, "");
118+
119+
assertNull(ConfigHelper.getEnvironmentVariable(UNSUPPORTED_DD_VAR));
120+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
121+
assertFalse(result.containsKey(UNSUPPORTED_DD_VAR));
122+
123+
// Cleanup
124+
setEnvVar(UNSUPPORTED_DD_VAR, null);
125+
}
126+
127+
@Test
128+
void testNonDDAliases() {
129+
setEnvVar(NON_DD_ALIAS_VAR, NON_DD_ALIAS_VAL);
130+
131+
assertEquals(NON_DD_ALIAS_VAL, ConfigHelper.getEnvironmentVariable(TEST_DD_VAR));
132+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
133+
assertEquals(NON_DD_ALIAS_VAL, result.get(TEST_DD_VAR));
134+
assertFalse(result.containsKey(NON_DD_ALIAS_VAR));
135+
136+
// Cleanup
137+
setEnvVar(NON_DD_ALIAS_VAR, null);
138+
}
139+
140+
@Test
141+
void testAliasesWithoutPresentAliases() {
142+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
143+
assertFalse(result.containsKey(ALIAS_DD_VAR));
144+
}
145+
146+
@Test
147+
void testUnsupportedButNotStrict() {
148+
ConfigHelper.setConfigInversionStrict(false);
149+
setEnvVar(UNSUPPORTED_DD_VAR, "loose");
150+
151+
// Should fall through and return the env var even though it's unsupported
152+
assertEquals("loose", ConfigHelper.getEnvironmentVariable(UNSUPPORTED_DD_VAR));
153+
154+
// Cleanup
155+
ConfigHelper.setConfigInversionStrict(true);
156+
setEnvVar(UNSUPPORTED_DD_VAR, null);
157+
}
158+
159+
@Test
160+
void testAliasWithEmptyList() {
161+
Map<String, List<String>> aliasMap = new HashMap<>();
162+
aliasMap.put("EMPTY_ALIAS_CONFIG", new ArrayList<>());
163+
164+
ConfigHelper.setConfigurationSource(
165+
new TestSupportedConfigurationSource(
166+
new HashSet<>(), aliasMap, new HashMap<>(), new HashMap<>()));
167+
168+
assertNull(ConfigHelper.getEnvironmentVariable("EMPTY_ALIAS_CONFIG"));
169+
170+
// Cleanup
171+
ConfigHelper.setConfigurationSource(testSource);
172+
}
173+
174+
@Test
175+
void testAliasSkippedWhenBaseAlreadyPresent() {
176+
setEnvVar(TEST_DD_VAR, TEST_DD_VAR_VAL);
177+
setEnvVar(NON_DD_ALIAS_VAR, NON_DD_ALIAS_VAL);
178+
179+
Map<String, String> result = ConfigHelper.getEnvironmentVariables();
180+
assertEquals(TEST_DD_VAR_VAL, result.get(TEST_DD_VAR));
181+
assertFalse(result.containsKey(NON_DD_ALIAS_VAR));
182+
183+
// Cleanup
184+
setEnvVar(TEST_DD_VAR, null);
185+
setEnvVar(NON_DD_ALIAS_VAR, null);
186+
}
187+
188+
// Copied from utils.TestHelper
189+
@SuppressWarnings("unchecked")
190+
private static void setEnvVar(String envName, String envValue) {
191+
try {
192+
Class<?> classOfMap = System.getenv().getClass();
193+
Field field = classOfMap.getDeclaredField("m");
194+
field.setAccessible(true);
195+
if (envValue == null) {
196+
((Map<String, String>) field.get(System.getenv())).remove(envName);
197+
} else {
198+
((Map<String, String>) field.get(System.getenv())).put(envName, envValue);
199+
}
200+
} catch (Exception ex) {
201+
ex.printStackTrace();
202+
}
203+
}
204+
}

components/environment/src/test/java/datadog/environment/ParseSupportedConfigurationsTest.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)