From a40616cc28a2b58b22c329d3441e9ce49bf025e6 Mon Sep 17 00:00:00 2001 From: Jean Bisutti Date: Mon, 2 Feb 2026 14:54:32 +0100 Subject: [PATCH] Fix connection string env var precedence over ${file:...} config lookup --- .../configuration/ConfigurationBuilder.java | 53 ++++++++---- settings.gradle.kts | 2 + .../build.gradle.kts | 3 + .../ConnectionStringFileNotFoundServlet.java | 19 +++++ .../ConnectionStringFileNotFoundTest.java | 80 ++++++++++++++++++ .../resources/applicationinsights.json | 7 ++ .../ConnectionStringFromFile/build.gradle.kts | 3 + .../ConnectionStringFromFileServlet.java | 19 +++++ .../ConnectionStringFromFileTest.java | 84 +++++++++++++++++++ .../resources/applicationinsights.json | 7 ++ .../smokeTest/resources/connection_string.txt | 1 + .../smoketest/SmokeTestExtension.java | 21 ++++- .../smoketest/SmokeTestExtensionBuilder.java | 7 ++ 13 files changed, 288 insertions(+), 18 deletions(-) create mode 100644 smoke-tests/apps/ConnectionStringFileNotFound/build.gradle.kts create mode 100644 smoke-tests/apps/ConnectionStringFileNotFound/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFileNotFoundServlet.java create mode 100644 smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFileNotFoundTest.java create mode 100644 smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/resources/applicationinsights.json create mode 100644 smoke-tests/apps/ConnectionStringFromFile/build.gradle.kts create mode 100644 smoke-tests/apps/ConnectionStringFromFile/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFromFileServlet.java create mode 100644 smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFromFileTest.java create mode 100644 smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/applicationinsights.json create mode 100644 smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/connection_string.txt diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java index ed66c6aa00f..7ad86aebd8e 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java @@ -40,6 +40,7 @@ import java.util.Locale; import java.util.Map; import java.util.function.Function; +import java.util.function.Supplier; import javax.annotation.Nullable; import org.apache.commons.text.StringSubstitutor; import org.apache.commons.text.lookup.StringLookup; @@ -715,16 +716,9 @@ static void overlayFromEnv( Function envVarsFunction, Function systemPropertiesFunction) throws IOException { - // load connection string from a file if connection string is in the format of - // "${file:mounted_connection_string_file.txt}" - Map stringLookupMap = - Collections.singletonMap(StringLookupFactory.KEY_FILE, new FileStringLookup(baseDir)); - StringLookup stringLookup = - StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); - StringSubstitutor stringSubstitutor = new StringSubstitutor(stringLookup); config.connectionString = overlayConnectionStringFromEnv( - stringSubstitutor.replace(config.connectionString), + () -> resolveFileLookup(config.connectionString, baseDir), envVarsFunction, systemPropertiesFunction); @@ -828,27 +822,35 @@ public static void overlayFromEnv( Function systemPropertiesFunction) { config.connectionString = overlayConnectionStringFromEnv( - config.connectionString, envVarsFunction, systemPropertiesFunction); + () -> config.connectionString, envVarsFunction, systemPropertiesFunction); config.sampling.percentage = overlayWithEnvVar( APPLICATIONINSIGHTS_SAMPLING_PERCENTAGE, config.sampling.percentage, envVarsFunction); } + private static String resolveFileLookup(String value, Path baseDir) { + Map stringLookupMap = + Collections.singletonMap(StringLookupFactory.KEY_FILE, new FileStringLookup(baseDir)); + StringLookup stringLookup = + StringLookupFactory.INSTANCE.interpolatorStringLookup(stringLookupMap, null, false); + StringSubstitutor stringSubstitutor = new StringSubstitutor(stringLookup); + return stringSubstitutor.replace(value); + } + @Nullable private static String overlayConnectionStringFromEnv( - String connectionString, + Supplier connectionStringSupplier, Function envVarsFunction, Function systemPropertiesFunction) { - String value = + String connectionString = overlayWithSysPropEnvVar( APPLICATIONINSIGHTS_CONNECTION_STRING_SYS, APPLICATIONINSIGHTS_CONNECTION_STRING_ENV, - connectionString, + connectionStringSupplier, envVarsFunction, systemPropertiesFunction); - - if (value != null) { - return value; + if (connectionString != null) { + return connectionString; } // this is for backwards compatibility only @@ -971,12 +973,31 @@ public static String overlayWithSysPropEnvVar( String defaultValue, Function envVarsFunction, Function systemPropertiesFunction) { + return overlayWithSysPropEnvVar( + systemPropertyName, + envVarName, + () -> defaultValue, + envVarsFunction, + systemPropertiesFunction); + } + + @Nullable + static String overlayWithSysPropEnvVar( + String systemPropertyName, + String envVarName, + Supplier defaultValueSupplier, + Function envVarsFunction, + Function systemPropertiesFunction) { String value = getSystemProperty(systemPropertyName, systemPropertiesFunction); if (value != null) { configurationLogger.debug("using system property: {}", systemPropertyName); return value; } - return overlayWithEnvVar(envVarName, defaultValue, envVarsFunction); + String envVarValue = getEnvVar(envVarName, envVarsFunction); + if (envVarValue != null) { + return envVarValue; + } + return defaultValueSupplier.get(); } public static String overlayWithEnvVar( diff --git a/settings.gradle.kts b/settings.gradle.kts index 0965cfa6d4e..2629d08ca1a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -70,6 +70,8 @@ hideFromDependabot(":smoke-tests:apps:ClassicSdkLogbackInterop2x") hideFromDependabot(":smoke-tests:apps:ClassicSdkWebInterop2x") hideFromDependabot(":smoke-tests:apps:ClassicSdkWebInterop3x") hideFromDependabot(":smoke-tests:apps:ClassicSdkWebInterop3xUsingOld3xAgent") +hideFromDependabot(":smoke-tests:apps:ConnectionStringFileNotFound") +hideFromDependabot(":smoke-tests:apps:ConnectionStringFromFile") hideFromDependabot(":smoke-tests:apps:ConnectionStringOverrides") hideFromDependabot(":smoke-tests:apps:CoreAndFilter2x") hideFromDependabot(":smoke-tests:apps:CoreAndFilter3x") diff --git a/smoke-tests/apps/ConnectionStringFileNotFound/build.gradle.kts b/smoke-tests/apps/ConnectionStringFileNotFound/build.gradle.kts new file mode 100644 index 00000000000..eb5b96e032d --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFileNotFound/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("ai.smoke-test-war") +} diff --git a/smoke-tests/apps/ConnectionStringFileNotFound/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFileNotFoundServlet.java b/smoke-tests/apps/ConnectionStringFileNotFound/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFileNotFoundServlet.java new file mode 100644 index 00000000000..d2fd9d4322f --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFileNotFound/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFileNotFoundServlet.java @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketestapp; + +import java.io.IOException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet("/*") +public class ConnectionStringFileNotFoundServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.getWriter().println("ok"); + } +} diff --git a/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFileNotFoundTest.java b/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFileNotFoundTest.java new file mode 100644 index 00000000000..f9c3317eb24 --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFileNotFoundTest.java @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketest; + +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_25; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_25_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.MapEntry.entry; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +// Reproduces https://github.com/microsoft/ApplicationInsights-Java/issues/4214 +// When applicationinsights.json contains a ${file:...} reference to a nonexistent file, +// the APPLICATIONINSIGHTS_CONNECTION_STRING env var should still take effect. +@UseAgent +abstract class ConnectionStringFileNotFoundTest { + + @RegisterExtension static final SmokeTestExtension testing = SmokeTestExtension.create(); + + @Test + @TargetUri("/test") + void shouldUseEnvVarWhenFileNotFound() throws Exception { + Telemetry telemetry = testing.getTelemetry(0); + + assertThat(telemetry.rd.getName()).isEqualTo("GET /ConnectionStringFileNotFound/*"); + assertThat(telemetry.rd.getResponseCode()).isEqualTo("200"); + assertThat(telemetry.rd.getSuccess()).isTrue(); + assertThat(telemetry.rd.getProperties()) + .containsExactly(entry("_MS.ProcessedByMetricExtractors", "True")); + assertThat(telemetry.rd.getMeasurements()).isEmpty(); + } + + @Environment(TOMCAT_8_JAVA_8) + static class Tomcat8Java8Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_8_OPENJ9) + static class Tomcat8Java8OpenJ9Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_11) + static class Tomcat8Java11Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_11_OPENJ9) + static class Tomcat8Java11OpenJ9Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_17) + static class Tomcat8Java17Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_17_OPENJ9) + static class Tomcat8Java17OpenJ9Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_21) + static class Tomcat8Java21Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_21_OPENJ9) + static class Tomcat8Java21OpenJ9Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_25) + static class Tomcat8Java23Test extends ConnectionStringFileNotFoundTest {} + + @Environment(TOMCAT_8_JAVA_25_OPENJ9) + static class Tomcat8Java23OpenJ9Test extends ConnectionStringFileNotFoundTest {} + + @Environment(WILDFLY_13_JAVA_8) + static class Wildfly13Java8Test extends ConnectionStringFileNotFoundTest {} + + @Environment(WILDFLY_13_JAVA_8_OPENJ9) + static class Wildfly13Java8OpenJ9Test extends ConnectionStringFileNotFoundTest {} +} diff --git a/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/resources/applicationinsights.json b/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/resources/applicationinsights.json new file mode 100644 index 00000000000..ef1850d8dbb --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFileNotFound/src/smokeTest/resources/applicationinsights.json @@ -0,0 +1,7 @@ +{ + "connectionString": "${file:/app/secrets/applicationinsights_connection_string}", + "role": { + "name": "testrolename", + "instance": "testroleinstance" + } +} diff --git a/smoke-tests/apps/ConnectionStringFromFile/build.gradle.kts b/smoke-tests/apps/ConnectionStringFromFile/build.gradle.kts new file mode 100644 index 00000000000..eb5b96e032d --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFromFile/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("ai.smoke-test-war") +} diff --git a/smoke-tests/apps/ConnectionStringFromFile/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFromFileServlet.java b/smoke-tests/apps/ConnectionStringFromFile/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFromFileServlet.java new file mode 100644 index 00000000000..d4ce13d49b1 --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFromFile/src/main/java/com/microsoft/applicationinsights/smoketestapp/ConnectionStringFromFileServlet.java @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketestapp; + +import java.io.IOException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet("/*") +public class ConnectionStringFromFileServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.getWriter().println("ok"); + } +} diff --git a/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFromFileTest.java b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFromFileTest.java new file mode 100644 index 00000000000..f0338852037 --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringFromFileTest.java @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketest; + +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_25; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_25_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.MapEntry.entry; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +// Verifies that ${file:...} connection string lookup works correctly when +// the APPLICATIONINSIGHTS_CONNECTION_STRING env var is NOT set. +@UseAgent +abstract class ConnectionStringFromFileTest { + + @RegisterExtension + static final SmokeTestExtension testing = + SmokeTestExtension.builder() + .doNotSetConnectionString() + .addFile("connection_string.txt", "/app/secrets/connection_string.txt") + .build(); + + @Test + @TargetUri("/test") + void shouldReadConnectionStringFromFile() throws Exception { + Telemetry telemetry = testing.getTelemetry(0); + + assertThat(telemetry.rd.getName()).isEqualTo("GET /ConnectionStringFromFile/*"); + assertThat(telemetry.rd.getResponseCode()).isEqualTo("200"); + assertThat(telemetry.rd.getSuccess()).isTrue(); + assertThat(telemetry.rd.getProperties()) + .containsExactly(entry("_MS.ProcessedByMetricExtractors", "True")); + assertThat(telemetry.rd.getMeasurements()).isEmpty(); + } + + @Environment(TOMCAT_8_JAVA_8) + static class Tomcat8Java8Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_8_OPENJ9) + static class Tomcat8Java8OpenJ9Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_11) + static class Tomcat8Java11Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_11_OPENJ9) + static class Tomcat8Java11OpenJ9Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_17) + static class Tomcat8Java17Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_17_OPENJ9) + static class Tomcat8Java17OpenJ9Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_21) + static class Tomcat8Java21Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_21_OPENJ9) + static class Tomcat8Java21OpenJ9Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_25) + static class Tomcat8Java23Test extends ConnectionStringFromFileTest {} + + @Environment(TOMCAT_8_JAVA_25_OPENJ9) + static class Tomcat8Java23OpenJ9Test extends ConnectionStringFromFileTest {} + + @Environment(WILDFLY_13_JAVA_8) + static class Wildfly13Java8Test extends ConnectionStringFromFileTest {} + + @Environment(WILDFLY_13_JAVA_8_OPENJ9) + static class Wildfly13Java8OpenJ9Test extends ConnectionStringFromFileTest {} +} diff --git a/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/applicationinsights.json b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/applicationinsights.json new file mode 100644 index 00000000000..a317b2a657d --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/applicationinsights.json @@ -0,0 +1,7 @@ +{ + "connectionString": "${file:/app/secrets/connection_string.txt}", + "role": { + "name": "testrolename", + "instance": "testroleinstance" + } +} diff --git a/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/connection_string.txt b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/connection_string.txt new file mode 100644 index 00000000000..f02025cabfc --- /dev/null +++ b/smoke-tests/apps/ConnectionStringFromFile/src/smokeTest/resources/connection_string.txt @@ -0,0 +1 @@ +InstrumentationKey=00000000-0000-0000-0000-0FEEDDADBEEF;IngestionEndpoint=http://host.testcontainers.internal:6060/;LiveEndpoint=http://host.testcontainers.internal:6060/ diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java index c3337724ead..df4179fe2ee 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java @@ -51,6 +51,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; @SuppressWarnings({ "SystemOut", @@ -112,6 +113,7 @@ public class SmokeTestExtension private final Map httpHeaders; private final Map envVars; private final List jvmArgs; + private final Map additionalFiles; private final boolean useDefaultHttpPort; private final boolean useOtlpEndpoint; private final boolean useOtlpEndpointOnly; @@ -139,6 +141,7 @@ public static SmokeTestExtensionBuilder builder() { Map httpHeaders, Map envVars, List jvmArgs, + Map additionalFiles, boolean useDefaultHttpPort, boolean useOtlpEndpoint, boolean useOtlpEndpointOnly) { @@ -169,6 +172,7 @@ public static SmokeTestExtensionBuilder builder() { this.httpHeaders = httpHeaders; this.envVars = envVars; this.jvmArgs = jvmArgs; + this.additionalFiles = additionalFiles; this.useDefaultHttpPort = useDefaultHttpPort; this.useOtlpEndpoint = useOtlpEndpoint; this.useOtlpEndpointOnly = useOtlpEndpointOnly; @@ -508,7 +512,9 @@ private void startTestApplicationContainer() throws Exception { } container.withEnv("JAVA_TOOL_OPTIONS", String.join(" ", javaToolOptions)); - container = addAdditionalFile(container); + container = + mountAgentExtensionFile(container); // agent extension specified via setAgentExtensionFile() + container = mountAdditionalFiles(container); // Additional files specified via addFile() if (useAgent) { container = @@ -559,7 +565,7 @@ private void startTestApplicationContainer() throws Exception { allContainers.add(container); } - private GenericContainer addAdditionalFile(GenericContainer container) { + private GenericContainer mountAgentExtensionFile(GenericContainer container) { if (agentExtensionFile != null) { return container.withFileSystemBind( agentExtensionFile.getAbsolutePath(), @@ -569,6 +575,17 @@ private GenericContainer addAdditionalFile(GenericContainer container) { return container; } + private GenericContainer mountAdditionalFiles(GenericContainer container) { + for (Map.Entry entry : additionalFiles.entrySet()) { + String resourceName = entry.getKey(); + String containerPath = entry.getValue(); + container = + container.withCopyFileToContainer( + MountableFile.forClasspathResource(resourceName), containerPath); + } + return container; + } + @Override public void afterEach(ExtensionContext context) { mockedIngestion.resetData(); diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java index e223c64aa07..e930be4e4ef 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java @@ -27,6 +27,7 @@ public class SmokeTestExtensionBuilder { private final Map httpHeaders = new HashMap<>(); private final Map envVars = new HashMap<>(); private final List jvmArgs = new ArrayList<>(); + private final Map additionalFiles = new HashMap<>(); private boolean useDefaultHttpPort; private boolean useOtlpEndpoint; private boolean useOtlpEndpointOnly; @@ -99,6 +100,11 @@ public SmokeTestExtensionBuilder addJvmArg(String jvmArg) { return this; } + public SmokeTestExtensionBuilder addFile(String resourceName, String containerPath) { + additionalFiles.put(resourceName, containerPath); + return this; + } + public SmokeTestExtensionBuilder setUseDefaultHttpPort() { this.useDefaultHttpPort = true; return this; @@ -130,6 +136,7 @@ public SmokeTestExtension build() { httpHeaders, envVars, jvmArgs, + additionalFiles, useDefaultHttpPort, useOtlpEndpoint, useOtlpEndpointOnly);