Skip to content

Commit 9ec150b

Browse files
Has failed all retries tagging
1 parent 0c58002 commit 9ec150b

File tree

39 files changed

+293
-185
lines changed

39 files changed

+293
-185
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ public TestIdentifier getIdentifier() {
192192
return identifier;
193193
}
194194

195+
public boolean hasFailed() {
196+
return span.isError();
197+
}
198+
195199
@Override
196200
public void setTag(String key, Object value) {
197201
span.setTag(key, value);

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/NoOpTestEventsHandler.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import datadog.trace.api.civisibility.config.TestIdentifier;
66
import datadog.trace.api.civisibility.config.TestSourceData;
77
import datadog.trace.api.civisibility.events.TestEventsHandler;
8+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
89
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
9-
import datadog.trace.api.civisibility.telemetry.tag.RetryReason;
1010
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
1111
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
1212
import datadog.trace.bootstrap.ContextStore;
@@ -58,8 +58,6 @@ public void onTestStart(
5858
@Nullable String testParameters,
5959
@Nullable Collection<String> categories,
6060
@Nonnull TestSourceData testSourceData,
61-
RetryReason retryReason,
62-
boolean hasFailedAllRetries,
6361
@Nullable Long startTime) {
6462
// do nothing
6563
}
@@ -75,7 +73,8 @@ public void onTestFailure(TestKey descriptor, @Nullable Throwable throwable) {
7573
}
7674

7775
@Override
78-
public void onTestFinish(TestKey descriptor, @Nullable Long endTime) {
76+
public void onTestFinish(
77+
TestKey descriptor, @Nullable Long endTime, @Nullable TestExecutionHistory executionHistory) {
7978
// do nothing
8079
}
8180

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestEventsHandlerImpl.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import datadog.trace.api.civisibility.config.TestIdentifier;
99
import datadog.trace.api.civisibility.config.TestSourceData;
1010
import datadog.trace.api.civisibility.events.TestEventsHandler;
11+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
1112
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
1213
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;
1314
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
@@ -139,8 +140,6 @@ public void onTestStart(
139140
final @Nullable String testParameters,
140141
final @Nullable Collection<String> categories,
141142
final @Nonnull TestSourceData testSourceData,
142-
final @Nullable RetryReason retryReason,
143-
final boolean hasFailedAllRetries,
144143
final @Nullable Long startTime) {
145144
if (skipTrace(testSourceData.getTestClass())) {
146145
return;
@@ -171,10 +170,6 @@ public void onTestStart(
171170
test.setTag(Tags.TEST_MANAGEMENT_IS_QUARANTINED, true);
172171
}
173172

174-
if (hasFailedAllRetries) {
175-
test.setTag(Tags.TEST_HAS_FAILED_ALL_RETRIES, true);
176-
}
177-
178173
if (testFramework != null) {
179174
test.setTag(Tags.TEST_FRAMEWORK, testFramework);
180175
if (testFrameworkVersion != null) {
@@ -207,11 +202,6 @@ public void onTestStart(
207202
}
208203
}
209204

210-
if (retryReason != null) {
211-
test.setTag(Tags.TEST_IS_RETRY, true);
212-
test.setTag(Tags.TEST_RETRY_REASON, retryReason);
213-
}
214-
215205
inProgressTests.put(descriptor, test);
216206
}
217207

@@ -236,12 +226,28 @@ public void onTestFailure(TestKey descriptor, @Nullable Throwable throwable) {
236226
}
237227

238228
@Override
239-
public void onTestFinish(TestKey descriptor, @Nullable Long endTime) {
229+
public void onTestFinish(
230+
TestKey descriptor,
231+
@Nullable Long endTime,
232+
@Nullable TestExecutionHistory testExecutionHistory) {
240233
TestImpl test = inProgressTests.remove(descriptor);
241234
if (test == null) {
242235
log.debug("Ignoring finish event, could not find test {}", descriptor);
243236
return;
244237
}
238+
239+
if (testExecutionHistory != null) {
240+
RetryReason retryReason = testExecutionHistory.currentExecutionRetryReason();
241+
if (retryReason != null) {
242+
test.setTag(Tags.TEST_IS_RETRY, true);
243+
test.setTag(Tags.TEST_RETRY_REASON, retryReason);
244+
}
245+
246+
if (test.hasFailed() && testExecutionHistory.hasFailedAllRetries()) {
247+
test.setTag(Tags.TEST_HAS_FAILED_ALL_RETRIES, true);
248+
}
249+
}
250+
245251
test.end(endTime);
246252
}
247253

@@ -265,11 +271,9 @@ public void onTestIgnore(
265271
testParameters,
266272
categories,
267273
testSourceData,
268-
null,
269-
false,
270274
null);
271275
onTestSkip(testDescriptor, reason);
272-
onTestFinish(testDescriptor, null);
276+
onTestFinish(testDescriptor, null, null);
273277
}
274278

275279
@Override

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/RetryUntilSuccessful.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ public RetryUntilSuccessful(
2626

2727
@Override
2828
public boolean applicable() {
29-
return currentExecutionIsNotLast() || suppressFailures;
29+
return !currentExecutionIsLast() || suppressFailures;
3030
}
3131

3232
@Override
3333
public boolean suppressFailures() {
3434
// do not suppress failures for last execution
3535
// (unless flag to suppress all failures is set)
36-
return currentExecutionIsNotLast() || suppressFailures;
36+
return !currentExecutionIsLast() || suppressFailures;
3737
}
3838

39-
private boolean currentExecutionIsNotLast() {
40-
return executions < maxExecutions - 1;
39+
private boolean currentExecutionIsLast() {
40+
return executions == maxExecutions - 1;
4141
}
4242

4343
@Override
@@ -63,6 +63,6 @@ private boolean currentExecutionIsRetry() {
6363

6464
@Override
6565
public boolean hasFailedAllRetries() {
66-
return executions == maxExecutions && !successfulExecutionSeen;
66+
return currentExecutionIsLast() && !successfulExecutionSeen;
6767
}
6868
}

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/RunNTimes.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ public RunNTimes(
2424

2525
@Override
2626
public boolean applicable() {
27-
return currentExecutionIsNotLast() || suppressFailures();
27+
return !currentExecutionIsLast() || suppressFailures();
2828
}
2929

30-
private boolean currentExecutionIsNotLast() {
31-
return executions < maxExecutions - 1;
30+
private boolean currentExecutionIsLast() {
31+
return executions == maxExecutions - 1;
3232
}
3333

3434
@Override
@@ -57,6 +57,6 @@ private boolean currentExecutionIsRetry() {
5757

5858
@Override
5959
public boolean hasFailedAllRetries() {
60-
return executions == maxExecutions && !successfulExecutionSeen;
60+
return currentExecutionIsLast() && !successfulExecutionSeen;
6161
}
6262
}

dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/CucumberTracingListener.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import datadog.trace.api.civisibility.coverage.CoveragePerTestBridge;
55
import datadog.trace.api.civisibility.events.TestDescriptor;
66
import datadog.trace.api.civisibility.events.TestSuiteDescriptor;
7-
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
7+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
88
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
99
import datadog.trace.bootstrap.ContextStore;
1010
import io.cucumber.core.gherkin.Pickle;
@@ -29,13 +29,13 @@ public class CucumberTracingListener extends TracingListener {
2929
public static final String FRAMEWORK_NAME = "cucumber";
3030
public static final String FRAMEWORK_VERSION = CucumberUtils.getVersion();
3131

32-
private final ContextStore<Description, TestExecutionPolicy> executionPolicies;
32+
private final ContextStore<Description, TestExecutionHistory> executionHistories;
3333
private final Map<Object, Pickle> pickleById;
3434

3535
public CucumberTracingListener(
36-
ContextStore<Description, TestExecutionPolicy> executionPolicies,
36+
ContextStore<Description, TestExecutionHistory> executionHistories,
3737
List<ParentRunner<?>> featureRunners) {
38-
this.executionPolicies = executionPolicies;
38+
this.executionHistories = executionHistories;
3939
pickleById = CucumberUtils.getPicklesById(featureRunners);
4040
}
4141

@@ -71,7 +71,6 @@ public void testStarted(final Description description) {
7171
String testName = CucumberUtils.getTestNameForScenario(description);
7272
List<String> categories = getCategories(description);
7373

74-
TestExecutionPolicy executionPolicy = executionPolicies.get(description);
7574
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestStart(
7675
new TestSuiteDescriptor(testSuiteName, null),
7776
CucumberUtils.toTestDescriptor(description),
@@ -81,8 +80,6 @@ public void testStarted(final Description description) {
8180
null,
8281
categories,
8382
TestSourceData.UNKNOWN,
84-
executionPolicy != null ? executionPolicy.currentExecutionRetryReason() : null,
85-
executionPolicy != null && executionPolicy.hasFailedAllRetries(),
8683
null);
8784

8885
recordFeatureFileCodeCoverage(description);
@@ -101,7 +98,9 @@ private static void recordFeatureFileCodeCoverage(Description scenarioDescriptio
10198
@Override
10299
public void testFinished(final Description description) {
103100
TestDescriptor testDescriptor = CucumberUtils.toTestDescriptor(description);
104-
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(testDescriptor, null);
101+
TestExecutionHistory executionHistory = executionHistories.get(description);
102+
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(
103+
testDescriptor, null, executionHistory);
105104
}
106105

107106
// same callback is executed both for test cases and test suites (for setup/teardown errors)

dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/JUnit4CucumberInstrumentation.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import datadog.trace.agent.tooling.Instrumenter;
88
import datadog.trace.agent.tooling.InstrumenterModule;
99
import datadog.trace.agent.tooling.muzzle.Reference;
10-
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
10+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
1111
import datadog.trace.bootstrap.InstrumentationContext;
1212
import java.util.Collections;
1313
import java.util.List;
@@ -46,7 +46,7 @@ public String[] helperClassNames() {
4646
@Override
4747
public Map<String, String> contextStore() {
4848
return Collections.singletonMap(
49-
"org.junit.runner.Description", TestExecutionPolicy.class.getName());
49+
"org.junit.runner.Description", TestExecutionHistory.class.getName());
5050
}
5151

5252
@Override
@@ -84,7 +84,7 @@ public static void addTracingListener(
8484

8585
replacedNotifier.addListener(
8686
new CucumberTracingListener(
87-
InstrumentationContext.get(Description.class, TestExecutionPolicy.class), children));
87+
InstrumentationContext.get(Description.class, TestExecutionHistory.class), children));
8888
runNotifier = replacedNotifier;
8989
}
9090
}

dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/src/main/java/datadog/trace/instrumentation/junit4/execution/Cucumber4ExecutionInstrumentation.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import datadog.trace.api.Config;
1111
import datadog.trace.api.civisibility.config.TestIdentifier;
1212
import datadog.trace.api.civisibility.config.TestSourceData;
13+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
1314
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
1415
import datadog.trace.bootstrap.InstrumentationContext;
1516
import datadog.trace.instrumentation.junit4.CucumberUtils;
@@ -62,7 +63,7 @@ public String[] helperClassNames() {
6263
@Override
6364
public Map<String, String> contextStore() {
6465
return Collections.singletonMap(
65-
"org.junit.runner.Description", TestExecutionPolicy.class.getName());
66+
"org.junit.runner.Description", TestExecutionHistory.class.getName());
6667
}
6768

6869
@Override
@@ -103,7 +104,7 @@ public static Boolean execute(
103104
return null;
104105
}
105106

106-
InstrumentationContext.get(Description.class, TestExecutionPolicy.class)
107+
InstrumentationContext.get(Description.class, TestExecutionHistory.class)
107108
.put(description, executionPolicy);
108109

109110
FailureSuppressingNotifier failureSuppressingNotifier =

dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitInstrumentation.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.google.auto.service.AutoService;
77
import datadog.trace.agent.tooling.Instrumenter;
88
import datadog.trace.agent.tooling.InstrumenterModule;
9-
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
9+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
1010
import datadog.trace.bootstrap.InstrumentationContext;
1111
import java.util.Collections;
1212
import java.util.List;
@@ -44,7 +44,7 @@ public String[] helperClassNames() {
4444
@Override
4545
public Map<String, String> contextStore() {
4646
return Collections.singletonMap(
47-
"org.junit.runner.Description", TestExecutionPolicy.class.getName());
47+
"org.junit.runner.Description", TestExecutionHistory.class.getName());
4848
}
4949

5050
@Override
@@ -75,7 +75,7 @@ public static void addTracingListener(
7575

7676
replacedNotifier.addListener(
7777
new MUnitTracingListener(
78-
InstrumentationContext.get(Description.class, TestExecutionPolicy.class)));
78+
InstrumentationContext.get(Description.class, TestExecutionHistory.class)));
7979
runNotifier = replacedNotifier;
8080
}
8181
}

dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitTracingListener.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import datadog.trace.api.civisibility.events.TestDescriptor;
44
import datadog.trace.api.civisibility.events.TestSuiteDescriptor;
5-
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
5+
import datadog.trace.api.civisibility.execution.TestExecutionHistory;
66
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
77
import datadog.trace.bootstrap.ContextStore;
88
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
@@ -23,10 +23,10 @@ public class MUnitTracingListener extends TracingListener {
2323

2424
public static final String FRAMEWORK_NAME = "munit";
2525
public static final String FRAMEWORK_VERSION = getVersion();
26-
private final ContextStore<Description, TestExecutionPolicy> executionPolicies;
26+
private final ContextStore<Description, TestExecutionHistory> executionHistories;
2727

28-
public MUnitTracingListener(ContextStore<Description, TestExecutionPolicy> executionPolicies) {
29-
this.executionPolicies = executionPolicies;
28+
public MUnitTracingListener(ContextStore<Description, TestExecutionHistory> executionHistories) {
29+
this.executionHistories = executionHistories;
3030
}
3131

3232
public static String getVersion() {
@@ -76,7 +76,6 @@ public void testStarted(final Description description) {
7676
TestDescriptor testDescriptor = MUnitUtils.toTestDescriptor(description);
7777
String testName = description.getMethodName();
7878
List<String> categories = getCategories(description);
79-
TestExecutionPolicy executionPolicy = executionPolicies.get(description);
8079
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestStart(
8180
suiteDescriptor,
8281
testDescriptor,
@@ -86,15 +85,15 @@ public void testStarted(final Description description) {
8685
null,
8786
categories,
8887
JUnit4Utils.toTestSourceData(description),
89-
executionPolicy != null ? executionPolicy.currentExecutionRetryReason() : null,
90-
executionPolicy != null && executionPolicy.hasFailedAllRetries(),
9188
null);
9289
}
9390

9491
@Override
9592
public void testFinished(final Description description) {
9693
TestDescriptor testDescriptor = MUnitUtils.toTestDescriptor(description);
97-
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(testDescriptor, null);
94+
TestExecutionHistory executionHistory = executionHistories.get(description);
95+
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(
96+
testDescriptor, null, executionHistory);
9897
}
9998

10099
// same callback is executed both for test cases and test suites (for setup/teardown errors)
@@ -161,12 +160,10 @@ public void testIgnored(final Description description) {
161160
null,
162161
categories,
163162
JUnit4Utils.toTestSourceData(description),
164-
null,
165-
false,
166163
null);
167164
}
168165
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSkip(testDescriptor, null);
169-
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(testDescriptor, null);
166+
TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(testDescriptor, null, null);
170167

171168
} else if (testClass != null) {
172169
TestSuiteDescriptor suiteDescriptor = MUnitUtils.toSuiteDescriptor(description);

0 commit comments

Comments
 (0)