diff --git a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts index 733196145942..a75c037899a6 100644 --- a/conventions/src/main/kotlin/otel.java-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.java-conventions.gradle.kts @@ -209,7 +209,6 @@ testing { implementation("org.slf4j:log4j-over-slf4j") implementation("org.slf4j:jcl-over-slf4j") implementation("org.slf4j:jul-to-slf4j") - implementation("com.github.stefanbirkner:system-rules") } } } diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index 12b417dd9ab5..931b7a77bf9d 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -86,8 +86,6 @@ val DEPENDENCIES = listOf( "io.r2dbc:r2dbc-proxy:1.1.6.RELEASE", "ch.qos.logback:logback-classic:1.3.15", // 1.4+ requires Java 11+ - "com.github.stefanbirkner:system-lambda:1.2.1", - "com.github.stefanbirkner:system-rules:1.19.0", "uk.org.webcompere:system-stubs-jupiter:2.0.3", "com.uber.nullaway:nullaway:0.12.10", "commons-beanutils:commons-beanutils:1.11.0", diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts index cfc8e4afb53f..0f4dee2475ba 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/testing/build.gradle.kts @@ -11,5 +11,4 @@ dependencies { api("org.mockito:mockito-junit-jupiter") implementation("io.opentelemetry:opentelemetry-api") - implementation("com.github.stefanbirkner:system-lambda") } diff --git a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts index 336b04342315..fa62cf0696bf 100644 --- a/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts +++ b/instrumentation/aws-lambda/aws-lambda-events-2.2/testing/build.gradle.kts @@ -12,5 +12,4 @@ dependencies { api("org.mockito:mockito-junit-jupiter") implementation("io.opentelemetry:opentelemetry-api") - implementation("com.github.stefanbirkner:system-lambda") } diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts index f0e78b82b54e..91a41da1ff55 100644 --- a/javaagent-tooling/build.gradle.kts +++ b/javaagent-tooling/build.gradle.kts @@ -113,6 +113,14 @@ testing { compileOnly("com.google.code.findbugs:annotations") } } + + val testConfigFile by registering(JvmTestSuite::class) { + dependencies { + implementation(project(":javaagent-tooling")) + // requires mockito-inline + implementation("uk.org.webcompere:system-stubs-jupiter") + } + } } } diff --git a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.groovy b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.groovy deleted file mode 100644 index 5f83eb57503a..000000000000 --- a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.groovy +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config - -import org.junit.Rule -import org.junit.contrib.java.lang.system.EnvironmentVariables -import spock.lang.Shared -import spock.lang.Specification -import spock.lang.TempDir -import spock.util.environment.RestoreSystemProperties - -@RestoreSystemProperties -class ConfigurationFileTest extends Specification { - - @Rule - public final EnvironmentVariables environmentVariables = new EnvironmentVariables() - - @TempDir - @Shared - public File tmpDir - - def "should use env property"() { - given: - def path = createFile("config", "property1=val-env") - environmentVariables.set("OTEL_JAVAAGENT_CONFIGURATION_FILE", path) - - when: - def properties = ConfigurationFile.loadConfigFile() - - then: - properties.get("property1") == "val-env" - } - - def "should use system property"() { - given: - def path = createFile("config", "property1=val-sys") - System.setProperty("otel.javaagent.configuration-file", path) - - when: - def properties = ConfigurationFile.loadConfigFile() - - then: - properties.get("property1") == "val-sys" - } - - def "system property should take precedence over env property"() { - given: - def pathEnv = createFile("configEnv", "property1=val-env") - def pathSys = createFile("configSys", "property1=val-sys") - - environmentVariables.set("OTEL_JAVAAGENT_CONFIGURATION_FILE", pathEnv) - System.setProperty("otel.javaagent.configuration-file", pathSys) - - when: - def properties = ConfigurationFile.loadConfigFile() - - then: - properties.get("property1") == "val-sys" - } - - - def "should return empty properties if file does not exist"() { - given: - environmentVariables.set("OTEL_JAVAAGENT_CONFIGURATION_FILE", "somePath") - - when: - def properties = ConfigurationFile.loadConfigFile() - - then: - properties.isEmpty() - } - - def "should return empty properties if property is not set"() { - when: - def properties = ConfigurationFile.loadConfigFile() - - then: - properties.isEmpty() - } - - def createFile(String name, String contents) { - def file = new File(tmpDir, name) - file.write(contents) - return file.getAbsolutePath() - } - -} diff --git a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.groovy b/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.groovy deleted file mode 100644 index 1fe11b29b7f4..000000000000 --- a/javaagent-tooling/src/test/groovy/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.groovy +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.config - - -import spock.lang.Specification - -import static java.util.Collections.emptySet - -class MethodsConfigurationParserTest extends Specification { - - def "test configuration #value"() { - expect: - MethodsConfigurationParser.parse(value) == expected - - where: - value | expected - null | [:] - " " | [:] - "some.package.ClassName" | ["some.package.ClassName":emptySet()] - "some.package.ClassName[ , ]" | [:] - "some.package.ClassName[ , method]" | [:] - "some.package.Class\$Name[ method , ]" | ["some.package.Class\$Name": ["method"].toSet()] - "ClassName[ method1,]" | ["ClassName": ["method1"].toSet()] - "ClassName[method1 , method2]" | ["ClassName": ["method1", "method2"].toSet()] - "Class\$1[method1 ] ; Class\$2[ method2];" | ["Class\$1": ["method1"].toSet(), "Class\$2": ["method2"].toSet()] - "Duplicate[method1] ; Duplicate[method2] ;Duplicate[method3];" | ["Duplicate": ["method3"].toSet()] - } -} diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.java new file mode 100644 index 000000000000..7f055281c887 --- /dev/null +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/config/MethodsConfigurationParserTest.java @@ -0,0 +1,72 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.config; + +import static java.util.Collections.emptyMap; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class MethodsConfigurationParserTest { + + @ParameterizedTest + @MethodSource("configurationTestData") + void testConfiguration(String value, Map> expected) { + Map> result = MethodsConfigurationParser.parse(value); + + assertThat(result).isEqualTo(expected); + } + + static Stream configurationTestData() { + return Stream.of( + Arguments.of(null, emptyMap()), + Arguments.of(" ", emptyMap()), + Arguments.of( + "some.package.ClassName", + Collections.>singletonMap( + "some.package.ClassName", Collections.emptySet())), + Arguments.of("some.package.ClassName[ , ]", emptyMap()), + Arguments.of("some.package.ClassName[ , method]", emptyMap()), + Arguments.of( + "some.package.Class$Name[ method , ]", + Collections.singletonMap("some.package.Class$Name", createSet("method"))), + Arguments.of( + "ClassName[ method1,]", Collections.singletonMap("ClassName", createSet("method1"))), + Arguments.of( + "ClassName[method1 , method2]", + Collections.singletonMap("ClassName", createSet("method1", "method2"))), + Arguments.of( + "Class$1[method1 ] ; Class$2[ method2];", + createTwoEntryMap("Class$1", createSet("method1"), "Class$2", createSet("method2"))), + Arguments.of( + "Duplicate[method1] ; Duplicate[method2] ;Duplicate[method3];", + Collections.singletonMap("Duplicate", createSet("method3")))); + } + + private static Map> createTwoEntryMap( + String key1, Set value1, String key2, Set value2) { + Map> map = new HashMap<>(); + map.put(key1, value1); + map.put(key2, value2); + return map; + } + + private static Set createSet(String... elements) { + Set set = new HashSet<>(); + for (String element : elements) { + set.add(element); + } + return set; + } +} diff --git a/javaagent-tooling/src/testConfigFile/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.java b/javaagent-tooling/src/testConfigFile/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.java new file mode 100644 index 000000000000..52e6d54261fe --- /dev/null +++ b/javaagent-tooling/src/testConfigFile/java/io/opentelemetry/javaagent/tooling/config/ConfigurationFileTest.java @@ -0,0 +1,90 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.tooling.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +import uk.org.webcompere.systemstubs.properties.SystemProperties; + +@ExtendWith(SystemStubsExtension.class) +class ConfigurationFileTest { + + @TempDir File tmpDir; + + @SystemStub private EnvironmentVariables environmentVariables; + + @SystemStub private SystemProperties systemProperties; + + @Test + void shouldUseEnvVar() throws IOException { + String path = createFile("config", "property1=val-env"); + environmentVariables.set("OTEL_JAVAAGENT_CONFIGURATION_FILE", path); + + Map properties = ConfigurationFile.loadConfigFile(); + + assertThat(properties).containsEntry("property1", "val-env"); + } + + @Test + void shouldUseSystemProperty() throws IOException { + String path = createFile("config", "property1=val-sys"); + systemProperties.set("otel.javaagent.configuration-file", path); + + Map properties = ConfigurationFile.loadConfigFile(); + + assertThat(properties).containsEntry("property1", "val-sys"); + } + + @Test + void shouldUseSystemPropertyOverEnvVar() throws IOException { + String pathEnv = createFile("configEnv", "property1=val-env"); + String path = createFile("config", "property1=val-sys"); + systemProperties.set("otel.javaagent.configuration-file", path); + environmentVariables.set("OTEL_JAVAAGENT_CONFIGURATION_FILE", pathEnv); + + Map properties = ConfigurationFile.loadConfigFile(); + + assertThat(properties).containsEntry("property1", "val-sys"); + } + + @Test + void shouldReturnEmptyPropertiesIfFileDoesNotExist() { + systemProperties.set("otel.javaagent.configuration-file", "somePath"); + + Map properties = ConfigurationFile.loadConfigFile(); + + assertThat(properties).isEmpty(); + } + + @Test + void shouldReturnEmptyPropertiesIfPropertyIsNotSet() { + Map properties = ConfigurationFile.loadConfigFile(); + + assertThat(properties).isEmpty(); + } + + private String createFile(String name, String contents) throws IOException { + File file = new File(tmpDir, name); + try (Writer writer = + new OutputStreamWriter(Files.newOutputStream(file.toPath()), StandardCharsets.UTF_8)) { + writer.write(contents); + } + return file.getAbsolutePath(); + } +}