diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestFrameworkModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestFrameworkModule.java index 62e1e48aec9..137ca240f19 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestFrameworkModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestFrameworkModule.java @@ -31,21 +31,12 @@ TestSuiteImpl testSuiteStart( boolean isModified(TestSourceData testSourceData); /** - * Checks if a given test should be skipped with Intelligent Test Runner or not + * Checks if a given test can be skipped with Intelligent Test Runner or not. * * @param test Test to be checked * @return {@code true} if the test can be skipped, {@code false} otherwise */ - boolean shouldBeSkipped(TestIdentifier test); - - /** - * Checks if a given test can be skipped with Intelligent Test Runner or not. If the test is - * considered skippable, the count of skippable tests is incremented. - * - * @param test Test to be checked - * @return {@code true} if the test can be skipped, {@code false} otherwise - */ - boolean skip(TestIdentifier test); + boolean isSkippable(TestIdentifier test); @Nonnull TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java index 46248ff19b1..115b140b5a8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java @@ -37,6 +37,7 @@ import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; import datadog.trace.civisibility.source.SourceResolutionException; +import datadog.trace.civisibility.test.ExecutionResults; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; @@ -50,6 +51,7 @@ public class TestImpl implements DDTest { private static final Logger log = LoggerFactory.getLogger(TestImpl.class); private final CiVisibilityMetricCollector metricCollector; + private final ExecutionResults executionResults; private final TestFrameworkInstrumentation instrumentation; private final AgentSpan span; private final DDTraceId sessionId; @@ -78,11 +80,13 @@ public TestImpl( LinesResolver linesResolver, Codeowners codeowners, CoverageStore.Factory coverageStoreFactory, + ExecutionResults executionResults, Consumer onSpanFinish) { this.instrumentation = instrumentation; this.metricCollector = metricCollector; this.sessionId = moduleSpanContext.getTraceId(); this.suiteId = suiteId; + this.executionResults = executionResults; this.onSpanFinish = onSpanFinish; this.identifier = new TestIdentifier(testSuiteName, testName, testParameters); @@ -258,6 +262,10 @@ public void end(@Nullable Long endTime) { span.finish(); } + if (InstrumentationBridge.ITR_SKIP_REASON.equals(span.getTag(Tags.TEST_SKIP_REASON))) { + executionResults.incrementTestsSkippedByItr(); + } + metricCollector.add( CiVisibilityCountMetric.EVENT_FINISHED, 1, diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java index 3318f799e1a..024f77f0b4d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java @@ -22,6 +22,7 @@ import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; import datadog.trace.civisibility.source.SourceResolutionException; +import datadog.trace.civisibility.test.ExecutionResults; import datadog.trace.civisibility.utils.SpanUtils; import java.lang.reflect.Method; import java.util.Collection; @@ -49,6 +50,7 @@ public class TestSuiteImpl implements DDTestSuite { private final Codeowners codeowners; private final LinesResolver linesResolver; private final CoverageStore.Factory coverageStoreFactory; + private final ExecutionResults executionResults; private final boolean parallelized; private final Consumer onSpanFinish; @@ -69,6 +71,7 @@ public TestSuiteImpl( Codeowners codeowners, LinesResolver linesResolver, CoverageStore.Factory coverageStoreFactory, + ExecutionResults executionResults, Consumer onSpanFinish) { this.moduleSpanContext = moduleSpanContext; this.moduleName = moduleName; @@ -84,6 +87,7 @@ public TestSuiteImpl( this.codeowners = codeowners; this.linesResolver = linesResolver; this.coverageStoreFactory = coverageStoreFactory; + this.executionResults = executionResults; this.onSpanFinish = onSpanFinish; AgentTracer.SpanBuilder spanBuilder = @@ -254,6 +258,7 @@ public TestImpl testStart( linesResolver, codeowners, coverageStoreFactory, + executionResults, SpanUtils.propagateCiVisibilityTagsTo(span)); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java index 3e903a07c51..d086c27244d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/ProxyTestModule.java @@ -25,6 +25,7 @@ import datadog.trace.civisibility.ipc.TestFramework; import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; +import datadog.trace.civisibility.test.ExecutionResults; import datadog.trace.civisibility.test.ExecutionStrategy; import java.util.Collection; import java.util.TreeSet; @@ -46,6 +47,7 @@ public class ProxyTestModule implements TestFrameworkModule { private final AgentSpanContext parentProcessModuleContext; private final String moduleName; private final ExecutionStrategy executionStrategy; + private final ExecutionResults executionResults; private final SignalClient.Factory signalClientFactory; private final ChildProcessCoverageReporter childProcessCoverageReporter; private final Config config; @@ -73,6 +75,7 @@ public ProxyTestModule( this.parentProcessModuleContext = parentProcessModuleContext; this.moduleName = moduleName; this.executionStrategy = executionStrategy; + this.executionResults = new ExecutionResults(); this.signalClientFactory = signalClientFactory; this.childProcessCoverageReporter = childProcessCoverageReporter; this.config = config; @@ -100,13 +103,8 @@ public boolean isModified(TestSourceData testSourceData) { } @Override - public boolean shouldBeSkipped(TestIdentifier test) { - return executionStrategy.shouldBeSkipped(test); - } - - @Override - public boolean skip(TestIdentifier test) { - return executionStrategy.skip(test); + public boolean isSkippable(TestIdentifier test) { + return executionStrategy.isSkippable(test); } @Override @@ -143,7 +141,7 @@ private void sendModuleExecutionResult() { boolean earlyFlakeDetectionEnabled = earlyFlakeDetectionSettings.isEnabled(); boolean earlyFlakeDetectionFaulty = earlyFlakeDetectionEnabled && executionStrategy.isEFDLimitReached(); - long testsSkippedTotal = executionStrategy.getTestsSkipped(); + long testsSkippedTotal = executionResults.getTestsSkippedByItr(); signalClient.send( new ModuleExecutionResult( @@ -185,6 +183,7 @@ public TestSuiteImpl testSuiteStart( codeowners, linesResolver, coverageStoreFactory, + executionResults, this::propagateTestFrameworkData); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestModule.java index 00833d65b7e..7d5df44490b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestModule.java @@ -22,6 +22,7 @@ import datadog.trace.civisibility.domain.TestSuiteImpl; import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; +import datadog.trace.civisibility.test.ExecutionResults; import datadog.trace.civisibility.test.ExecutionStrategy; import datadog.trace.civisibility.utils.SpanUtils; import java.util.function.Consumer; @@ -39,6 +40,7 @@ public class HeadlessTestModule extends AbstractTestModule implements TestFramew private final CoverageStore.Factory coverageStoreFactory; private final ExecutionStrategy executionStrategy; + private final ExecutionResults executionResults; public HeadlessTestModule( AgentSpanContext sessionSpanContext, @@ -67,6 +69,7 @@ public HeadlessTestModule( onSpanFinish); this.coverageStoreFactory = coverageStoreFactory; this.executionStrategy = executionStrategy; + this.executionResults = new ExecutionResults(); } @Override @@ -85,13 +88,8 @@ public boolean isModified(TestSourceData testSourceData) { } @Override - public boolean shouldBeSkipped(TestIdentifier test) { - return executionStrategy.shouldBeSkipped(test); - } - - @Override - public boolean skip(TestIdentifier test) { - return executionStrategy.skip(test); + public boolean isSkippable(TestIdentifier test) { + return executionStrategy.isSkippable(test); } @Override @@ -111,7 +109,7 @@ public void end(@Nullable Long endTime) { setTag(Tags.TEST_ITR_TESTS_SKIPPING_ENABLED, true); setTag(Tags.TEST_ITR_TESTS_SKIPPING_TYPE, "test"); - long testsSkippedTotal = executionStrategy.getTestsSkipped(); + long testsSkippedTotal = executionResults.getTestsSkippedByItr(); setTag(Tags.TEST_ITR_TESTS_SKIPPING_COUNT, testsSkippedTotal); if (testsSkippedTotal > 0) { setTag(DDTags.CI_ITR_TESTS_SKIPPED, true); @@ -154,6 +152,7 @@ public TestSuiteImpl testSuiteStart( codeowners, linesResolver, coverageStoreFactory, + executionResults, SpanUtils.propagateCiVisibilityTagsTo(span)); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java index 5c5df7d18c1..4d9d3f54e68 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/manualapi/ManualApiTestModule.java @@ -14,6 +14,7 @@ import datadog.trace.civisibility.domain.TestSuiteImpl; import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; +import datadog.trace.civisibility.test.ExecutionResults; import datadog.trace.civisibility.utils.SpanUtils; import java.util.function.Consumer; import javax.annotation.Nullable; @@ -25,6 +26,7 @@ public class ManualApiTestModule extends AbstractTestModule implements DDTestModule { private final CoverageStore.Factory coverageStoreFactory; + private final ExecutionResults executionResults = new ExecutionResults(); public ManualApiTestModule( AgentSpanContext sessionSpanContext, @@ -76,6 +78,7 @@ public TestSuiteImpl testSuiteStart( codeowners, linesResolver, coverageStoreFactory, + executionResults, SpanUtils.propagateCiVisibilityTagsTo(span)); } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/NoOpTestEventsHandler.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/NoOpTestEventsHandler.java index 30903cf1170..f5187516dad 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/NoOpTestEventsHandler.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/NoOpTestEventsHandler.java @@ -91,12 +91,7 @@ public void onTestIgnore( } @Override - public boolean skip(TestIdentifier test) { - return false; - } - - @Override - public boolean shouldBeSkipped(TestIdentifier test) { + public boolean isSkippable(TestIdentifier test) { return false; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java index 10c6f9b9274..787bc882ae4 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java @@ -187,7 +187,7 @@ public void onTestStart( test.setTag(Tags.TEST_ITR_UNSKIPPABLE, true); metricCollector.add(CiVisibilityCountMetric.ITR_UNSKIPPABLE, 1, EventType.TEST); - if (testModule.shouldBeSkipped(thisTest)) { + if (testModule.isSkippable(thisTest)) { test.setTag(Tags.TEST_ITR_FORCED_RUN, true); metricCollector.add(CiVisibilityCountMetric.ITR_FORCED_RUN, 1, EventType.TEST); } @@ -260,16 +260,6 @@ public void onTestIgnore( onTestFinish(testDescriptor, null); } - @Override - public boolean skip(TestIdentifier test) { - return testModule.skip(test); - } - - @Override - public boolean shouldBeSkipped(TestIdentifier test) { - return testModule.shouldBeSkipped(test); - } - @Override @Nonnull public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) { @@ -286,6 +276,11 @@ public boolean isFlaky(TestIdentifier test) { return testModule.isFlaky(test); } + @Override + public boolean isSkippable(TestIdentifier test) { + return testModule.isSkippable(test); + } + @Override public void close() { testModule.end(null); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionResults.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionResults.java new file mode 100644 index 00000000000..44e70b78f68 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionResults.java @@ -0,0 +1,16 @@ +package datadog.trace.civisibility.test; + +import java.util.concurrent.atomic.LongAdder; + +public class ExecutionResults { + + private final LongAdder testsSkippedByItr = new LongAdder(); + + public void incrementTestsSkippedByItr() { + testsSkippedByItr.increment(); + } + + public long getTestsSkippedByItr() { + return testsSkippedByItr.sum(); + } +} diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java index ae3fcee1792..39e781b1469 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java @@ -16,7 +16,6 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.LongAdder; import javax.annotation.Nonnull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +24,6 @@ public class ExecutionStrategy { private static final Logger LOGGER = LoggerFactory.getLogger(ExecutionStrategy.class); - private final LongAdder testsSkipped = new LongAdder(); private final AtomicInteger earlyFlakeDetectionsUsed = new AtomicInteger(0); private final AtomicInteger autoRetriesUsed = new AtomicInteger(0); @@ -50,10 +48,6 @@ public ExecutionSettings getExecutionSettings() { return executionSettings; } - public long getTestsSkipped() { - return testsSkipped.sum(); - } - public boolean isNew(TestIdentifier test) { Collection knownTests = executionSettings.getKnownTests(); return knownTests != null && !knownTests.contains(test.withoutParameters()); @@ -64,7 +58,7 @@ public boolean isFlaky(TestIdentifier test) { return flakyTests != null && flakyTests.contains(test.withoutParameters()); } - public boolean shouldBeSkipped(TestIdentifier test) { + public boolean isSkippable(TestIdentifier test) { if (test == null) { return false; } @@ -78,15 +72,6 @@ public boolean shouldBeSkipped(TestIdentifier test) { && testMetadata.isMissingLineCodeCoverage()); } - public boolean skip(TestIdentifier test) { - if (shouldBeSkipped(test)) { - testsSkipped.increment(); - return true; - } else { - return false; - } - } - @Nonnull public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) { if (test == null) { diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy index 80026ece26d..6b7cf95617b 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy @@ -16,6 +16,7 @@ import datadog.trace.civisibility.decorator.TestDecoratorImpl import datadog.trace.civisibility.source.LinesResolver import datadog.trace.civisibility.source.NoOpSourcePathResolver import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl +import datadog.trace.civisibility.test.ExecutionResults import datadog.trace.civisibility.utils.SpanUtils class TestImplTest extends SpanWriterTest { @@ -97,6 +98,7 @@ class TestImplTest extends SpanWriterTest { def testFramework = TestFrameworkInstrumentation.OTHER def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) + def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) def linesResolver = Stub(LinesResolver) @@ -123,6 +125,7 @@ class TestImplTest extends SpanWriterTest { linesResolver, codeowners, coverageStoreFactory, + executionResults, SpanUtils.DO_NOT_PROPAGATE_CI_VISIBILITY_TAGS ) } diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy index 78d53f7364b..2acfcc0dc79 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy @@ -14,6 +14,7 @@ import datadog.trace.civisibility.decorator.TestDecoratorImpl import datadog.trace.civisibility.source.LinesResolver import datadog.trace.civisibility.source.SourcePathResolver import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl +import datadog.trace.civisibility.test.ExecutionResults import datadog.trace.civisibility.utils.SpanUtils class TestSuiteImplTest extends SpanWriterTest { @@ -53,6 +54,7 @@ class TestSuiteImplTest extends SpanWriterTest { def testFramework = TestFrameworkInstrumentation.OTHER def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) + def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) def linesResolver = Stub(LinesResolver) @@ -82,6 +84,7 @@ class TestSuiteImplTest extends SpanWriterTest { codeowners, linesResolver, coverageStoreFactory, + executionResults, SpanUtils.DO_NOT_PROPAGATE_CI_VISIBILITY_TAGS ) } diff --git a/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberItrInstrumentation.java b/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberItrInstrumentation.java index 507ba3df32b..c6dce0fa24e 100644 --- a/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberItrInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberItrInstrumentation.java @@ -86,7 +86,7 @@ public static Boolean run( } TestIdentifier test = CucumberUtils.toTestIdentifier(description); - if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(test)) { + if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(test)) { notifier.fireTestAssumptionFailed( new Failure( description, diff --git a/dd-java-agent/instrumentation/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4ItrInstrumentation.java b/dd-java-agent/instrumentation/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4ItrInstrumentation.java index 78a7e575477..0755f08fbf2 100644 --- a/dd-java-agent/instrumentation/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4ItrInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-4.10/src/main/java/datadog/trace/instrumentation/junit4/JUnit4ItrInstrumentation.java @@ -99,7 +99,7 @@ public static Boolean runChild( } TestIdentifier test = JUnit4Utils.toTestIdentifier(description); - if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(test)) { + if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(test)) { Description skippedDescription = JUnit4Utils.getSkippedDescription(description); notifier.fireTestIgnored(skippedDescription); return Boolean.FALSE; diff --git a/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberItrInstrumentation.java b/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberItrInstrumentation.java index 8491e1617af..c39fa1c179e 100644 --- a/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberItrInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberItrInstrumentation.java @@ -101,7 +101,7 @@ public static void shouldBeSkipped( } TestIdentifier test = CucumberUtils.toTestIdentifier(testDescriptor); - if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(test)) { + if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(test)) { skipResult = Node.SkipResult.skip(InstrumentationBridge.ITR_SKIP_REASON); } } diff --git a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockItrInstrumentation.java b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockItrInstrumentation.java index f12efa51f98..e3f962b2bac 100644 --- a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockItrInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockItrInstrumentation.java @@ -80,6 +80,7 @@ public static void beforeSkipCheck() { CallDepthThreadLocalMap.incrementCallDepth(SpockNode.class); } + @SuppressWarnings("bytebuddy-exception-suppression") @SuppressFBWarnings( value = "UC_USELESS_OBJECT", justification = "skipResult is the return value of the instrumented method") @@ -117,21 +118,17 @@ public static void shouldBeSkipped( TestIdentifier featureIdentifier = SpockUtils.toTestIdentifier(feature); if (featureIdentifier == null - || !TestEventsHandlerHolder.TEST_EVENTS_HANDLER.shouldBeSkipped(featureIdentifier)) { + || !TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(featureIdentifier)) { return; } } - // all children are skippable - for (TestDescriptor feature : features) { - TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(SpockUtils.toTestIdentifier(feature)); - } skipResult = Node.SkipResult.skip(InstrumentationBridge.ITR_SKIP_REASON); } else { // individual test case TestIdentifier test = SpockUtils.toTestIdentifier(spockNode); - if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(test)) { + if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(test)) { skipResult = Node.SkipResult.skip(InstrumentationBridge.ITR_SKIP_REASON); } } diff --git a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/retry/JUnit5SpockParameterizedRetryInstrumentation.java b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/retry/JUnit5SpockParameterizedRetryInstrumentation.java index 1a3f54851df..a6ad4ea135d 100644 --- a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/retry/JUnit5SpockParameterizedRetryInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/retry/JUnit5SpockParameterizedRetryInstrumentation.java @@ -59,6 +59,7 @@ public void methodAdvice(MethodTransformer transformer) { public static class SpockParameterizedRetryAdvice { + @SuppressWarnings("bytebuddy-exception-suppression") @SuppressFBWarnings( value = "UC_USELESS_OBJECT", justification = "executionListener is a field in the instrumented class") diff --git a/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5ItrInstrumentation.java b/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5ItrInstrumentation.java index b3211c22883..731b48fcb9d 100644 --- a/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5ItrInstrumentation.java +++ b/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5ItrInstrumentation.java @@ -97,7 +97,7 @@ public static void shouldBeSkipped( } TestIdentifier test = JUnitPlatformUtils.toTestIdentifier(testDescriptor); - if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(test)) { + if (test != null && TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(test)) { skipResult = Node.SkipResult.skip(InstrumentationBridge.ITR_SKIP_REASON); } } diff --git a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java index 6a221b7b4f8..030d736d0ff 100644 --- a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java +++ b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java @@ -115,7 +115,7 @@ public boolean beforeScenario(ScenarioRuntime sr) { if (Config.get().isCiVisibilityTestSkippingEnabled() && !categories.contains(InstrumentationBridge.ITR_UNSKIPPABLE_TAG)) { TestIdentifier skippableTest = KarateUtils.toTestIdentifier(scenario); - if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(skippableTest)) { + if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(skippableTest)) { TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestIgnore( suiteDescriptor, testDescriptor, diff --git a/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java b/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java index 64400fa7617..4b0da0601b9 100644 --- a/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java +++ b/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/RunContext.java @@ -87,7 +87,7 @@ private Tuple2 skip( unskippableTests.add(test); return testNameAndSkipStatus; - } else if (eventHandler.skip(test)) { + } else if (eventHandler.isSkippable(test)) { skippedTests.add(test); return new Tuple2<>(testName, true); @@ -100,7 +100,7 @@ public boolean skip(TestIdentifier test, Map> tags) { if (isUnskippable(test, tags)) { unskippableTests.add(test); return false; - } else if (eventHandler.skip(test)) { + } else if (eventHandler.isSkippable(test)) { skippedTests.add(test); return true; } else { diff --git a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestNGItrInstrumentation.java b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestNGItrInstrumentation.java index df33279256e..1bba703c618 100644 --- a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestNGItrInstrumentation.java +++ b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestNGItrInstrumentation.java @@ -69,7 +69,7 @@ public static void invokeMethod( } TestIdentifier skippableTest = TestNGUtils.toTestIdentifier(method, instance, parameters); - if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skip(skippableTest)) { + if (TestEventsHandlerHolder.TEST_EVENTS_HANDLER.isSkippable(skippableTest)) { throw new SkipException(InstrumentationBridge.ITR_SKIP_REASON); } } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestEventsHandler.java b/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestEventsHandler.java index 2d2903457fd..5a30079dadb 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestEventsHandler.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/events/TestEventsHandler.java @@ -83,10 +83,6 @@ void onTestIgnore( @Nonnull TestSourceData testSourceData, @Nullable String reason); - boolean skip(TestIdentifier test); - - boolean shouldBeSkipped(TestIdentifier test); - @Nonnull TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData source); @@ -94,6 +90,8 @@ void onTestIgnore( boolean isFlaky(TestIdentifier test); + boolean isSkippable(TestIdentifier test); + @Override void close();