diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy index 8970af5be26..951c2ecff3e 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy @@ -124,7 +124,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A StringBuilder ddEnvVars = new StringBuilder() for (Map.Entry entry : System.getProperties().entrySet()) { if (entry.getKey().toString().startsWith("dd.")) { - ddEnvVars.append(ConfigStrings.systemPropertyNameToEnvironmentVariableName(entry.getKey().toString())) + ddEnvVars.append(ConfigStrings.toEnvVar(entry.getKey().toString())) .append("=").append(entry.getValue()).append(",") } } diff --git a/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java b/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java index 137280ad539..2937e19a372 100644 --- a/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java +++ b/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java @@ -1,5 +1,6 @@ package datadog.trace.util; +import java.util.Locale; import javax.annotation.Nonnull; public final class ConfigStrings { @@ -7,11 +8,11 @@ public final class ConfigStrings { private ConfigStrings() {} public static String toEnvVar(String string) { - return string.replace('.', '_').replace('-', '_').toUpperCase(); + return string.replace('.', '_').replace('-', '_').toUpperCase(Locale.ROOT); } public static String toEnvVarLowerCase(String string) { - return string.replace('.', '_').replace('-', '_').toLowerCase(); + return string.replace('.', '_').replace('-', '_').toLowerCase(Locale.ROOT); } /** @@ -26,18 +27,6 @@ public static String propertyNameToEnvironmentVariableName(final String setting) return "DD_" + toEnvVar(setting); } - /** - * Converts the system property name, e.g. 'dd.service.name' into a public environment variable - * name, e.g. `DD_SERVICE_NAME`. - * - * @param setting The system property name, e.g. `dd.service.name` - * @return The public facing environment variable name - */ - @Nonnull - public static String systemPropertyNameToEnvironmentVariableName(final String setting) { - return setting.replace('.', '_').replace('-', '_').toUpperCase(); - } - /** * Converts the property name, e.g. 'service.name' into a public system property name, e.g. * `dd.service.name`. diff --git a/utils/config-utils/src/test/java/datadog/trace/util/ConfigStringsTest.java b/utils/config-utils/src/test/java/datadog/trace/util/ConfigStringsTest.java new file mode 100644 index 00000000000..c8b5acb8dfd --- /dev/null +++ b/utils/config-utils/src/test/java/datadog/trace/util/ConfigStringsTest.java @@ -0,0 +1,33 @@ +package datadog.trace.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.Locale; +import org.junit.jupiter.api.Test; + +class ConfigStringsTest { + + /** Dotted capital I (U+0130) that a Turkish-locale {@code toUpperCase()} produces from 'i'. */ + private static final char DOTTED_CAPITAL_I = 'İ'; + + @Test + void toEnvVarUppercasesLowerIToAsciiIOnTurkishLocale() { + // Turkish is the locale where a locale-sensitive toUpperCase() maps 'i' -> 'İ' + // Forcing it as the default locale here proves the conversions are + // locale-independent (pinned to Locale.ROOT) rather than relying on the machine's locale. + Locale previousDefault = Locale.getDefault(); + Locale.setDefault(new Locale("tr", "TR")); + try { + String result = ConfigStrings.toEnvVar("dd.profiling.i"); + + // Must be the plain ASCII 'I' (U+0049), not the Turkish dotted 'İ' (U+0130). + assertEquals("DD_PROFILING_I", result); + assertFalse( + result.indexOf(DOTTED_CAPITAL_I) >= 0, + "env var name must not contain the dotted capital I (U+0130)"); + } finally { + Locale.setDefault(previousDefault); + } + } +}