Skip to content

Commit 651b125

Browse files
committed
Completing the integration tests
InitializationTelemetryCheck now sets up a forwarder script that captures the output to a file That output is then placed into the Result object in the new field telemetryJson InitializationTelemetryTest has update to spot check the results of the Result.telemetryJson
1 parent 982282f commit 651b125

File tree

2 files changed

+87
-18
lines changed

2 files changed

+87
-18
lines changed

dd-java-agent/src/test/groovy/datadog/trace/agent/InitializationTelemetryTest.groovy

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,58 @@ class InitializationTelemetryTest extends Specification {
1010
def "block agent start-up"() {
1111
// In this case, the SecurityManager blocks loading of the Premain Class,
1212
// so the JVM is expected to terminate with an error
13-
expect:
14-
InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockAgentLoading).exitCode != 0
13+
when:
14+
def result = InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockAgentLoading)
15+
16+
then:
17+
result.exitCode != 0
18+
// JVM fails before premain, so no telemetry output
19+
result.telemetryJson == null
1520
}
1621

1722
def "normal start-up"() {
18-
expect:
19-
InitializationTelemetryCheck.runTestJvm(null).exitCode == 0
23+
when:
24+
def result = InitializationTelemetryCheck.runTestJvm(null)
25+
26+
then:
27+
result.exitCode == 0
28+
result.telemetryJson.contains('library_entrypoint.complete')
2029
}
2130

2231
def "incomplete agent start-up"() {
2332
// In this case, the SecurityManager blocks a custom permission that is checked by bytebuddy causing
2433
// agent initialization to fail. However, we should catch the exception allowing the application
2534
// to run normally.
26-
expect:
27-
InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockByteBuddy).exitCode == 0
35+
when:
36+
def result = InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockByteBuddy)
37+
38+
then:
39+
result.exitCode == 0
40+
!result.telemetryJson.contains('library_entrypoint.complete')
41+
result.telemetryJson.contains('error_type:java.lang.IllegalStateException')
2842
}
2943

3044
def "block forwarder env var"() {
3145
// In this case, the SecurityManager blocks access to the forwarder environment variable,
3246
// so the tracer is unable to report initialization telemetry
33-
expect:
34-
InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockForwarderEnvVar, true).exitCode == 0
47+
when:
48+
def result = InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockForwarderEnvVar, true)
49+
50+
then:
51+
result.exitCode == 0
52+
// forwarder env var unreadable, so no telemetry output
53+
result.telemetryJson == null
3554
}
3655

3756
def "block forwarder execution"() {
3857
// In this case, the SecurityManager blocks access to process execution, so the tracer is
3958
// unable to invoke the forwarder executable
40-
expect:
41-
InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockForwarderExecution, true).exitCode == 0
59+
when:
60+
def result = InitializationTelemetryCheck.runTestJvm(InitializationTelemetryCheck.BlockForwarderExecution, true)
61+
62+
then:
63+
result.exitCode == 0
64+
// forwarder execution is blocked, so no telemetry output
65+
result.telemetryJson == null
4266
}
4367
}

dd-java-agent/src/test/java/jvmbootstraptest/InitializationTelemetryCheck.java

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
package jvmbootstraptest;
22

3-
import datadog.trace.agent.test.IntegrationTestUtils;
43
import java.io.File;
54
import java.io.FilePermission;
5+
import java.io.IOException;
6+
import java.nio.charset.StandardCharsets;
7+
import java.nio.file.Files;
8+
import java.nio.file.Path;
9+
import java.nio.file.attribute.PosixFilePermission;
10+
import java.nio.file.attribute.PosixFilePermissions;
11+
import java.util.Arrays;
612
import java.util.HashMap;
713
import java.util.Map;
14+
import java.util.Set;
15+
16+
import datadog.trace.agent.test.IntegrationTestUtils;
817

918
/**
1019
* Basic sanity check that InitializationTelemetry is functioning
@@ -69,22 +78,56 @@ public static final Result runTestJvm(Class<? extends TestSecurityManager> secur
6978
public static final Result runTestJvm(
7079
Class<? extends TestSecurityManager> securityManagerClass, boolean printStreams)
7180
throws Exception {
72-
File jarFile =
81+
82+
File jarFile =
7383
IntegrationTestUtils.createJarFileWithClasses(requiredClasses(securityManagerClass));
84+
85+
File forwarderFile = createTempFile("forwarder", "sh", PosixFilePermissions.fromString("rwxr--r--"));
86+
File outputFile = new File(forwarderFile.getAbsoluteFile() + ".out");
87+
88+
write(forwarderFile,
89+
"#!/usr/bin/env bash\n",
90+
"echo \"$1 $(cat -)\" >> " + outputFile.getAbsolutePath() + "\n");
91+
7492
try {
7593
int exitCode = IntegrationTestUtils.runOnSeparateJvm(
7694
InitializationTelemetryCheck.class.getName(),
7795
InitializationTelemetryCheck.jvmArgs(securityManagerClass),
7896
InitializationTelemetryCheck.mainArgs(),
79-
InitializationTelemetryCheck.envVars(),
97+
InitializationTelemetryCheck.envVars(forwarderFile),
8098
jarFile,
8199
printStreams);
82100

83-
return new Result(exitCode);
101+
return new Result(exitCode, read(outputFile));
84102
} finally {
85-
jarFile.delete();
103+
delete(jarFile, forwarderFile, outputFile);
86104
}
87105
}
106+
107+
static final File createTempFile(String baseName, String extension, Set<PosixFilePermission> perms) throws IOException {
108+
Path path = Files.createTempFile(baseName + "-integration-telemetry-check", "." + extension, PosixFilePermissions.asFileAttribute(perms));
109+
File file = path.toFile();
110+
file.deleteOnExit();
111+
return file;
112+
}
113+
114+
static final void write(File file, String... lines) throws IOException {
115+
Files.write(file.toPath(), Arrays.asList(lines));
116+
}
117+
118+
static final String read(File file) throws IOException {
119+
try {
120+
return new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
121+
} catch ( IOException e ) {
122+
return null;
123+
}
124+
}
125+
126+
static final void delete(File... tempFiles) {
127+
for ( File file: tempFiles ) {
128+
file.delete();
129+
}
130+
}
88131

89132
public static final Class<?>[] requiredClasses(
90133
Class<? extends TestSecurityManager> securityManagerClass) {
@@ -116,17 +159,19 @@ public static final String[] mainArgs() {
116159
return new String[] {};
117160
}
118161

119-
public static final Map<String, String> envVars() {
162+
public static final Map<String, String> envVars(File forwarderFile) {
120163
Map<String, String> envVars = new HashMap<>();
121-
envVars.put("DD_TELEMETRY_FORWARDER_PATH", "/dummy/path");
164+
envVars.put("DD_TELEMETRY_FORWARDER_PATH", forwarderFile.getAbsolutePath());
122165
return envVars;
123166
}
124167

125168
public static final class Result {
126169
public final int exitCode;
170+
public final String telemetryJson;
127171

128-
public Result(int exitCode) {
172+
public Result(int exitCode, String telemetryJson) {
129173
this.exitCode = exitCode;
174+
this.telemetryJson = telemetryJson;
130175
}
131176
}
132177
}

0 commit comments

Comments
 (0)