Skip to content

Commit a52a400

Browse files
add new instrumentation for junit4.13
1 parent 43ffd7e commit a52a400

File tree

13 files changed

+345
-409
lines changed

13 files changed

+345
-409
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
apply from: "$rootDir/gradle/java.gradle"
2+
3+
muzzle {
4+
pass {
5+
group = 'junit'
6+
module = 'junit'
7+
versions = '[4.13,5)'
8+
assertInverse = true
9+
}
10+
}
11+
12+
addTestSuiteForDir('latestDepTest', 'test')
13+
14+
dependencies {
15+
implementation project(':dd-java-agent:instrumentation:junit-4.10')
16+
compileOnly group: 'junit', name: 'junit', version: '4.13'
17+
18+
testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility'))
19+
20+
// version used below is not the minimum one that we support,
21+
// but the tests need to use it in order to be compliant with Spock 2.x
22+
testImplementation(group: 'junit', name: 'junit') {
23+
version {
24+
strictly '4.13.2'
25+
}
26+
}
27+
28+
latestDepTestImplementation group: 'junit', name: 'junit', version: '4.+'
29+
}

dd-java-agent/instrumentation/junit-4.10/junit-4.13/gradle.lockfile

Lines changed: 228 additions & 0 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package datadog.trace.instrumentation.junit4;
2+
3+
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
4+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
5+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
6+
import datadog.trace.bootstrap.instrumentation.api.Tags;
7+
import java.lang.reflect.Method;
8+
import org.junit.After;
9+
import org.junit.AfterClass;
10+
import org.junit.Before;
11+
import org.junit.BeforeClass;
12+
13+
public class BeforeAfterOperationsTracer {
14+
public static AgentScope startTrace(final Method method) {
15+
final AgentSpan span = AgentTracer.startSpan("junit", method.getName());
16+
if (method.isAnnotationPresent(Before.class)) {
17+
span.setTag(Tags.TEST_CALLBACK, "Before");
18+
} else if (method.isAnnotationPresent(After.class)) {
19+
span.setTag(Tags.TEST_CALLBACK, "After");
20+
} else if (method.isAnnotationPresent(BeforeClass.class)) {
21+
span.setTag(Tags.TEST_CALLBACK, "BeforeClass");
22+
} else if (method.isAnnotationPresent(AfterClass.class)) {
23+
span.setTag(Tags.TEST_CALLBACK, "AfterClass");
24+
}
25+
return AgentTracer.activateSpan(span);
26+
}
27+
28+
public static void endTrace(final AgentScope scope) {
29+
final AgentSpan span = scope.span();
30+
scope.close();
31+
span.finish();
32+
}
33+
}

dd-java-agent/instrumentation/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4BeforeAfterInstrumentation.java renamed to dd-java-agent/instrumentation/junit-4.10/junit-4.13/src/main/java/datadog/trace/instrumentation/junit4/JUnit4BeforeAfterInstrumentation.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,7 @@
77
import datadog.trace.agent.tooling.Instrumenter;
88
import datadog.trace.agent.tooling.InstrumenterModule;
99
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
10-
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
11-
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
12-
import datadog.trace.bootstrap.instrumentation.api.Tags;
1310
import net.bytebuddy.asm.Advice;
14-
import org.junit.After;
15-
import org.junit.AfterClass;
16-
import org.junit.Before;
17-
import org.junit.BeforeClass;
1811
import org.junit.runners.model.FrameworkMethod;
1912

2013
@AutoService(InstrumenterModule.class)
@@ -33,6 +26,13 @@ public String[] knownMatchingTypes() {
3326
};
3427
}
3528

29+
@Override
30+
public String[] helperClassNames() {
31+
return new String[] {
32+
packageName + ".BeforeAfterOperationsTracer",
33+
};
34+
}
35+
3636
@Override
3737
public void methodAdvice(MethodTransformer transformer) {
3838
transformer.applyAdvice(
@@ -44,24 +44,12 @@ public void methodAdvice(MethodTransformer transformer) {
4444
public static class RunBeforesAftersAdvice {
4545
@Advice.OnMethodEnter(suppress = Throwable.class)
4646
public static AgentScope startCallSpan(@Advice.Argument(0) final FrameworkMethod method) {
47-
final AgentSpan span = AgentTracer.startSpan("junit", method.getMethod().getName());
48-
if (method.getMethod().isAnnotationPresent(Before.class)) {
49-
span.setTag(Tags.TEST_CALLBACK, "Before");
50-
} else if (method.getMethod().isAnnotationPresent(After.class)) {
51-
span.setTag(Tags.TEST_CALLBACK, "After");
52-
} else if (method.getMethod().isAnnotationPresent(BeforeClass.class)) {
53-
span.setTag(Tags.TEST_CALLBACK, "BeforeClass");
54-
} else if (method.getMethod().isAnnotationPresent(AfterClass.class)) {
55-
span.setTag(Tags.TEST_CALLBACK, "AfterClass");
56-
}
57-
return AgentTracer.activateSpan(span);
47+
return BeforeAfterOperationsTracer.startTrace(method.getMethod());
5848
}
5949

6050
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6151
public static void finishCallSpan(@Advice.Enter final AgentScope scope) {
62-
AgentSpan span = scope.span();
63-
scope.close();
64-
span.finish();
52+
BeforeAfterOperationsTracer.endTrace(scope);
6553
}
6654
}
6755
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import datadog.trace.api.DisableTestTrace
2+
import datadog.trace.civisibility.CiVisibilityInstrumentationTest
3+
import datadog.trace.instrumentation.junit4.TestEventsHandlerHolder
4+
import junit.runner.Version
5+
import org.example.TestSucceedBeforeAfter
6+
import org.example.TestSucceedBeforeClassAfterClass
7+
import org.junit.runner.JUnitCore
8+
9+
@DisableTestTrace(reason = "avoid self-tracing")
10+
class JUnit413Test extends CiVisibilityInstrumentationTest {
11+
12+
def runner = new JUnitCore()
13+
14+
def "test #testcaseName"() {
15+
runTests(tests)
16+
17+
assertSpansData(testcaseName, expectedTracesCount)
18+
19+
where:
20+
testcaseName | tests | expectedTracesCount
21+
"test-succeed-before-after" | [TestSucceedBeforeAfter] | 2
22+
"test-succeed-beforeclass-afterclass" | [TestSucceedBeforeClassAfterClass] | 2
23+
}
24+
25+
private void runTests(Collection<Class<?>> tests) {
26+
TestEventsHandlerHolder.start()
27+
try {
28+
Class[] array = tests.toArray(new Class[0])
29+
runner.run(array)
30+
} catch (Throwable ignored) {
31+
// Ignored
32+
}
33+
TestEventsHandlerHolder.stop()
34+
}
35+
36+
@Override
37+
String instrumentedLibraryName() {
38+
return "junit4"
39+
}
40+
41+
@Override
42+
String instrumentedLibraryVersion() {
43+
return Version.id()
44+
}
45+
}

dd-java-agent/instrumentation/junit-4.10/src/test/java/org/example/TestSucceedBeforeAfter.java renamed to dd-java-agent/instrumentation/junit-4.10/junit-4.13/src/test/java/org/example/TestSucceedBeforeAfter.java

File renamed without changes.

dd-java-agent/instrumentation/junit-4.10/src/test/java/org/example/TestSucceedBeforeClassAfterClass.java renamed to dd-java-agent/instrumentation/junit-4.10/junit-4.13/src/test/java/org/example/TestSucceedBeforeClassAfterClass.java

File renamed without changes.

dd-java-agent/instrumentation/junit-4.10/src/test/groovy/JUnit4Test.groovy

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import org.example.TestSkipped
2020
import org.example.TestSkippedClass
2121
import org.example.TestSucceed
2222
import org.example.TestSucceedAndSkipped
23-
import org.example.TestSucceedBeforeAfter
24-
import org.example.TestSucceedBeforeClassAfterClass
2523
import org.example.TestSucceedExpectedException
2624
import org.example.TestSucceedKotlin
2725
import org.example.TestSucceedLegacy
@@ -56,8 +54,6 @@ class JUnit4Test extends CiVisibilityInstrumentationTest {
5654
"test-success-and-failure" | [TestFailedAndSucceed] | 4
5755
"test-suite-teardown-failure" | [TestFailedSuiteTearDown] | 1
5856
"test-suite-setup-failure" | [TestFailedSuiteSetup] | 1
59-
"test-succeed-before-after" | [TestSucceedBeforeAfter] | 2
60-
"test-succeed-before-class-after-class" | [TestSucceedBeforeClassAfterClass] | 2
6157
"test-assumption-failure" | [TestAssumption] | 2
6258
"test-categories-are-included-in-spans" | [TestSucceedWithCategories] | 2
6359
"test-assumption-failure-during-suite-setup" | [TestFailedSuiteSetUpAssumption] | 2

dd-java-agent/instrumentation/junit-4.10/src/test/resources/test-succeed-before-after/coverages.ftl

Lines changed: 0 additions & 1 deletion
This file was deleted.

dd-java-agent/instrumentation/junit-4.10/src/test/resources/test-succeed-before-after/events.ftl

Lines changed: 0 additions & 190 deletions
This file was deleted.

0 commit comments

Comments
 (0)