diff --git a/utils/config-utils/build.gradle.kts b/utils/config-utils/build.gradle.kts index 2891dc3845b..30334c87292 100644 --- a/utils/config-utils/build.gradle.kts +++ b/utils/config-utils/build.gradle.kts @@ -32,7 +32,8 @@ extra["excludedClassesCoverage"] = listOf( "datadog.trace.bootstrap.config.provider.stableconfig.Selector", // tested in internal-api "datadog.trace.bootstrap.config.provider.StableConfigParser", - "datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource" + "datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource", + "datadog.trace.config.inversion.SupportedConfiguration" ) extra["excludedClassesBranchCoverage"] = listOf( diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java index 6c7747e5a8c..8ca3989ba7f 100644 --- a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/StableConfigSourceTest.java @@ -294,6 +294,34 @@ void testConfigIdExistsInConfigCollectorWhenUsingStableConfigSource() throws Exc } } + @Test + void testStableConfigGetHandlesPresentAndMissingKeys() { + Map configMap = new HashMap<>(); + configMap.put("DD_SERVICE", "test-service"); + configMap.put("DD_PORT", 8126); + + StableConfigSource.StableConfig config = + new StableConfigSource.StableConfig("config-123", configMap); + + // Present String value: hits the non-null branch of the ternary in get() + assertEquals("test-service", config.get("DD_SERVICE")); + // Present non-String value: exercises String.valueOf on a non-null, non-String object + assertEquals("8126", config.get("DD_PORT")); + // Missing key: hits the null branch of the ternary in get() + assertNull(config.get("DD_MISSING")); + + assertEquals("config-123", config.getConfigId()); + assertEquals(configMap.keySet(), config.getKeys()); + } + + @Test + void testStableConfigEmpty() { + StableConfigSource.StableConfig empty = StableConfigSource.StableConfig.EMPTY; + assertNull(empty.get("DD_SERVICE")); + assertNull(empty.getConfigId()); + assertEquals(0, empty.getKeys().size()); + } + private static void writeFileYaml( Path filePath, String configId, Map defaultConfigs) throws IOException { Map yamlData = new HashMap<>(); diff --git a/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/stableconfig/RuleTest.java b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/stableconfig/RuleTest.java new file mode 100644 index 00000000000..d84c653f3d4 --- /dev/null +++ b/utils/config-utils/src/test/java/datadog/trace/bootstrap/config/provider/stableconfig/RuleTest.java @@ -0,0 +1,85 @@ +package datadog.trace.bootstrap.config.provider.stableconfig; + +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class RuleTest { + + @Test + void testNoArgConstructorYieldsEmptyState() { + Rule rule = new Rule(); + assertTrue(rule.getSelectors().isEmpty()); + assertTrue(rule.getConfiguration().isEmpty()); + } + + @Test + void testConstructorExposesValuesViaGetters() { + Selector selector = new Selector("process_arguments", "-Dfoo", asList("bar"), "equals"); + Map configuration = new HashMap<>(); + configuration.put("DD_SERVICE", "test"); + + Rule rule = new Rule(asList(selector), configuration); + + assertEquals(1, rule.getSelectors().size()); + assertSame(selector, rule.getSelectors().get(0)); + assertSame(configuration, rule.getConfiguration()); + } + + @Test + void testFromParsesValidRule() { + Map selectorMap = new LinkedHashMap<>(); + selectorMap.put("origin", "process_arguments"); + selectorMap.put("key", "-Dfoo"); + selectorMap.put("matches", asList("bar")); + selectorMap.put("operator", "equals"); + + Map configuration = new LinkedHashMap<>(); + configuration.put("DD_SERVICE", "test"); + + Map ruleMap = new LinkedHashMap<>(); + ruleMap.put("selectors", asList(selectorMap)); + ruleMap.put("configuration", configuration); + + Rule rule = Rule.from(ruleMap); + + List selectors = rule.getSelectors(); + assertEquals(1, selectors.size()); + Selector selector = selectors.get(0); + assertEquals("process_arguments", selector.getOrigin()); + assertEquals("-Dfoo", selector.getKey()); + assertEquals(asList("bar"), selector.getMatches()); + assertEquals("equals", selector.getOperator()); + + assertEquals("test", rule.getConfiguration().get("DD_SERVICE")); + } + + @Test + void testFromSkipsNullSelectorEntries() { + Map selectorMap = new LinkedHashMap<>(); + selectorMap.put("origin", "process_arguments"); + selectorMap.put("key", "-Dfoo"); + selectorMap.put("matches", asList("bar")); + selectorMap.put("operator", "equals"); + + Map configuration = new LinkedHashMap<>(); + configuration.put("DD_SERVICE", "test"); + + Map ruleMap = new LinkedHashMap<>(); + ruleMap.put("selectors", asList(null, selectorMap)); + ruleMap.put("configuration", configuration); + + Rule rule = Rule.from(ruleMap); + + // The null entry is filtered out, leaving only the valid selector. + assertEquals(1, rule.getSelectors().size()); + assertEquals("process_arguments", rule.getSelectors().get(0).getOrigin()); + } +}