Skip to content

Commit 38b8211

Browse files
Implement quarantined tests tagging (#8326)
1 parent 9af5347 commit 38b8211

File tree

182 files changed

+7908
-1763
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+7908
-1763
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ TestSuiteImpl testSuiteStart(
3131

3232
boolean isModified(TestSourceData testSourceData);
3333

34+
boolean isQuarantined(TestIdentifier test);
35+
3436
/**
3537
* Returns the reason for skipping a test, IF it can be skipped.
3638
*

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
import datadog.trace.api.civisibility.telemetry.TagValue;
1919
import datadog.trace.api.civisibility.telemetry.tag.BrowserDriver;
2020
import datadog.trace.api.civisibility.telemetry.tag.EventType;
21+
import datadog.trace.api.civisibility.telemetry.tag.HasFailedAllRetries;
2122
import datadog.trace.api.civisibility.telemetry.tag.IsModified;
2223
import datadog.trace.api.civisibility.telemetry.tag.IsNew;
24+
import datadog.trace.api.civisibility.telemetry.tag.IsQuarantined;
2325
import datadog.trace.api.civisibility.telemetry.tag.IsRetry;
2426
import datadog.trace.api.civisibility.telemetry.tag.IsRum;
2527
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
@@ -190,6 +192,10 @@ public TestIdentifier getIdentifier() {
190192
return identifier;
191193
}
192194

195+
public boolean hasFailed() {
196+
return span.isError();
197+
}
198+
193199
@Override
194200
public void setTag(String key, Object value) {
195201
span.setTag(key, value);
@@ -265,13 +271,15 @@ public void end(@Nullable Long endTime) {
265271

266272
Object retryReason = span.getTag(Tags.TEST_RETRY_REASON);
267273
metricCollector.add(
268-
CiVisibilityCountMetric.EVENT_FINISHED,
274+
CiVisibilityCountMetric.TEST_EVENT_FINISHED,
269275
1,
270276
instrumentation,
271277
EventType.TEST,
272278
span.getTag(Tags.TEST_IS_NEW) != null ? IsNew.TRUE : null,
273279
span.getTag(Tags.TEST_IS_MODIFIED) != null ? IsModified.TRUE : null,
280+
span.getTag(Tags.TEST_MANAGEMENT_IS_QUARANTINED) != null ? IsQuarantined.TRUE : null,
274281
span.getTag(Tags.TEST_IS_RETRY) != null ? IsRetry.TRUE : null,
282+
span.getTag(Tags.TEST_HAS_FAILED_ALL_RETRIES) != null ? HasFailedAllRetries.TRUE : null,
275283
retryReason instanceof TagValue ? (TagValue) retryReason : null,
276284
span.getTag(Tags.TEST_IS_RUM_ACTIVE) != null ? IsRum.TRUE : null,
277285
CIConstants.SELENIUM_BROWSER_DRIVER.equals(span.getTag(Tags.TEST_BROWSER_DRIVER))

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ public boolean isModified(TestSourceData testSourceData) {
103103
return executionStrategy.isModified(testSourceData);
104104
}
105105

106+
@Override
107+
public boolean isQuarantined(TestIdentifier test) {
108+
return executionStrategy.isQuarantined(test);
109+
}
110+
106111
@Nullable
107112
@Override
108113
public SkipReason skipReason(TestIdentifier test) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public boolean isModified(TestSourceData testSourceData) {
8888
return executionStrategy.isModified(testSourceData);
8989
}
9090

91+
@Override
92+
public boolean isQuarantined(TestIdentifier test) {
93+
return executionStrategy.isQuarantined(test);
94+
}
95+
9196
@Nullable
9297
@Override
9398
public SkipReason skipReason(TestIdentifier test) {

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

Lines changed: 5 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,8 @@ public void onTestStart(
5858
@Nullable String testParameters,
5959
@Nullable Collection<String> categories,
6060
@Nonnull TestSourceData testSourceData,
61-
RetryReason retryReason,
62-
@Nullable Long startTime) {
61+
@Nullable Long startTime,
62+
@Nullable TestExecutionHistory testExecutionHistory) {
6363
// do nothing
6464
}
6565

@@ -74,7 +74,8 @@ public void onTestFailure(TestKey descriptor, @Nullable Throwable throwable) {
7474
}
7575

7676
@Override
77-
public void onTestFinish(TestKey descriptor, @Nullable Long endTime) {
77+
public void onTestFinish(
78+
TestKey descriptor, @Nullable Long endTime, @Nullable TestExecutionHistory executionHistory) {
7879
// do nothing
7980
}
8081

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

Lines changed: 27 additions & 9 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,8 @@ 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 @Nullable Long startTime) {
143+
final @Nullable Long startTime,
144+
final @Nullable TestExecutionHistory testExecutionHistory) {
144145
if (skipTrace(testSourceData.getTestClass())) {
145146
return;
146147
}
@@ -166,6 +167,18 @@ public void onTestStart(
166167
test.setTag(Tags.TEST_IS_MODIFIED, true);
167168
}
168169

170+
if (testModule.isQuarantined(thisTest)) {
171+
test.setTag(Tags.TEST_MANAGEMENT_IS_QUARANTINED, true);
172+
}
173+
174+
if (testExecutionHistory != null) {
175+
RetryReason retryReason = testExecutionHistory.currentExecutionRetryReason();
176+
if (retryReason != null) {
177+
test.setTag(Tags.TEST_IS_RETRY, true);
178+
test.setTag(Tags.TEST_RETRY_REASON, retryReason);
179+
}
180+
}
181+
169182
if (testFramework != null) {
170183
test.setTag(Tags.TEST_FRAMEWORK, testFramework);
171184
if (testFrameworkVersion != null) {
@@ -198,11 +211,6 @@ public void onTestStart(
198211
}
199212
}
200213

201-
if (retryReason != null) {
202-
test.setTag(Tags.TEST_IS_RETRY, true);
203-
test.setTag(Tags.TEST_RETRY_REASON, retryReason);
204-
}
205-
206214
inProgressTests.put(descriptor, test);
207215
}
208216

@@ -227,12 +235,22 @@ public void onTestFailure(TestKey descriptor, @Nullable Throwable throwable) {
227235
}
228236

229237
@Override
230-
public void onTestFinish(TestKey descriptor, @Nullable Long endTime) {
238+
public void onTestFinish(
239+
TestKey descriptor,
240+
@Nullable Long endTime,
241+
@Nullable TestExecutionHistory testExecutionHistory) {
231242
TestImpl test = inProgressTests.remove(descriptor);
232243
if (test == null) {
233244
log.debug("Ignoring finish event, could not find test {}", descriptor);
234245
return;
235246
}
247+
248+
if (testExecutionHistory != null) {
249+
if (test.hasFailed() && testExecutionHistory.hasFailedAllRetries()) {
250+
test.setTag(Tags.TEST_HAS_FAILED_ALL_RETRIES, true);
251+
}
252+
}
253+
236254
test.end(endTime);
237255
}
238256

@@ -259,7 +277,7 @@ public void onTestIgnore(
259277
null,
260278
null);
261279
onTestSkip(testDescriptor, reason);
262-
onTestFinish(testDescriptor, null);
280+
onTestFinish(testDescriptor, null, null);
263281
}
264282

265283
@Override

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@ public boolean retry(boolean successful, long durationMillis) {
3131
public RetryReason currentExecutionRetryReason() {
3232
return null;
3333
}
34+
35+
@Override
36+
public boolean hasFailedAllRetries() {
37+
return false;
38+
}
3439
}

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class RetryUntilSuccessful implements TestExecutionPolicy {
1111
private final int maxExecutions;
1212
private final boolean suppressFailures;
1313
private int executions;
14+
private boolean successfulExecutionSeen;
1415

1516
/** Total execution counter that is shared by all retry policies */
1617
private final AtomicInteger totalExecutions;
@@ -25,22 +26,23 @@ public RetryUntilSuccessful(
2526

2627
@Override
2728
public boolean applicable() {
28-
return currentExecutionIsNotLast() || suppressFailures;
29+
return !currentExecutionIsLast() || suppressFailures;
2930
}
3031

3132
@Override
3233
public boolean suppressFailures() {
3334
// do not suppress failures for last execution
3435
// (unless flag to suppress all failures is set)
35-
return currentExecutionIsNotLast() || suppressFailures;
36+
return !currentExecutionIsLast() || suppressFailures;
3637
}
3738

38-
private boolean currentExecutionIsNotLast() {
39-
return executions < maxExecutions - 1;
39+
private boolean currentExecutionIsLast() {
40+
return executions == maxExecutions - 1;
4041
}
4142

4243
@Override
4344
public boolean retry(boolean successful, long durationMillis) {
45+
successfulExecutionSeen |= successful;
4446
if (!successful && ++executions < maxExecutions) {
4547
totalExecutions.incrementAndGet();
4648
return true;
@@ -58,4 +60,9 @@ public RetryReason currentExecutionRetryReason() {
5860
private boolean currentExecutionIsRetry() {
5961
return executions > 0;
6062
}
63+
64+
@Override
65+
public boolean hasFailedAllRetries() {
66+
return currentExecutionIsLast() && !successfulExecutionSeen;
67+
}
6168
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class RunNTimes implements TestExecutionPolicy {
1212
private final boolean suppressFailures;
1313
private int executions;
1414
private int maxExecutions;
15+
private boolean successfulExecutionSeen;
1516

1617
public RunNTimes(
1718
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings, boolean suppressFailures) {
@@ -23,11 +24,11 @@ public RunNTimes(
2324

2425
@Override
2526
public boolean applicable() {
26-
return currentExecutionIsNotLast() || suppressFailures();
27+
return !currentExecutionIsLast() || suppressFailures();
2728
}
2829

29-
private boolean currentExecutionIsNotLast() {
30-
return executions < maxExecutions - 1;
30+
private boolean currentExecutionIsLast() {
31+
return executions == maxExecutions - 1;
3132
}
3233

3334
@Override
@@ -37,6 +38,7 @@ public boolean suppressFailures() {
3738

3839
@Override
3940
public boolean retry(boolean successful, long durationMillis) {
41+
successfulExecutionSeen |= successful;
4042
// adjust maximum retries based on the now known test duration
4143
int maxExecutionsForGivenDuration = earlyFlakeDetectionSettings.getExecutions(durationMillis);
4244
maxExecutions = Math.min(maxExecutions, maxExecutionsForGivenDuration);
@@ -52,4 +54,9 @@ public RetryReason currentExecutionRetryReason() {
5254
private boolean currentExecutionIsRetry() {
5355
return executions > 0;
5456
}
57+
58+
@Override
59+
public boolean hasFailedAllRetries() {
60+
return currentExecutionIsLast() && !successfulExecutionSeen;
61+
}
5562
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,9 @@ public boolean retry(boolean successful, long durationMillis) {
3333
public RetryReason currentExecutionRetryReason() {
3434
return null;
3535
}
36+
37+
@Override
38+
public boolean hasFailedAllRetries() {
39+
return false;
40+
}
3641
}

0 commit comments

Comments
 (0)