Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package datadog.trace.instrumentation.junit4;

import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.extendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
Expand Down Expand Up @@ -50,7 +51,14 @@ public ElementMatcher<TypeDescription> hierarchyMatcher() {
.and(not(extendsClass(named("datadog.trace.agent.test.SpockRunner"))))
// do not instrument Karate JUnit 4 runner
// since Karate has a dedicated instrumentation
.and(not(extendsClass(named("com.intuit.karate.junit4.Karate"))));
.and(not(extendsClass(named("com.intuit.karate.junit4.Karate"))))
// PowerMock runner is being instrumented,
// so do not instrument its internal delegates
.and(
not(
implementsInterface(
named(
"org.powermock.modules.junit4.common.internal.PowerMockJUnitRunnerDelegate"))));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,8 @@ public static TestDescriptor toTestDescriptor(Description description) {
public static TestSuiteDescriptor toSuiteDescriptor(Description description) {
Class<?> testClass = description.getTestClass();
String testSuiteName = JUnit4Utils.getSuiteName(testClass, description);
return new TestSuiteDescriptor(testSuiteName, testClass);
// relying exclusively on class name: some runners (such as PowerMock) may redefine test classes
return new TestSuiteDescriptor(testSuiteName, null);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,24 @@
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;

/** Supports suite started/finished events for {@link TestCase} subclasses. */
/**
* Supports suite started/finished events for {@link TestCase} subclasses and Powermock-enabled test
* suites.
*/
@AutoService(InstrumenterModule.class)
public class JUnit38SuiteEventsInstrumentation extends InstrumenterModule.CiVisibility
implements Instrumenter.ForSingleType {
public class JUnitLegacySuiteEventsInstrumentation extends InstrumenterModule.CiVisibility
implements Instrumenter.ForKnownTypes {

public JUnit38SuiteEventsInstrumentation() {
super("ci-visibility", "junit-4", "junit-38");
public JUnitLegacySuiteEventsInstrumentation() {
super("ci-visibility", "junit-4", "junit-38", "powermock");
}

@Override
public String instrumentedType() {
return "org.junit.internal.runners.JUnit38ClassRunner";
public String[] knownMatchingTypes() {
return new String[] {
"org.junit.internal.runners.JUnit38ClassRunner",
"org.powermock.modules.junit4.PowerMockRunner"
};
}

@Override
Expand All @@ -50,10 +56,10 @@ public int order() {
public void methodAdvice(MethodTransformer transformer) {
transformer.applyAdvice(
named("run").and(takesArgument(0, named("org.junit.runner.notification.RunNotifier"))),
JUnit38SuiteEventsInstrumentation.class.getName() + "$JUnit38SuiteEventsAdvice");
JUnitLegacySuiteEventsInstrumentation.class.getName() + "$JUnitLegacySuiteEventsAdvice");
}

public static class JUnit38SuiteEventsAdvice {
public static class JUnitLegacySuiteEventsAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class)
public static void fireSuiteStartedEvent(
@Advice.Argument(0) final RunNotifier runNotifier, @Advice.This final Runner runner) {
Expand Down