Skip to content

Commit 57a74ad

Browse files
Generalize TestRetryPolicy to TestExecutionPolicy (#8302)
1 parent 1759b2d commit 57a74ad

File tree

41 files changed

+309
-279
lines changed

Some content is hidden

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

41 files changed

+309
-279
lines changed

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

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

33
import datadog.trace.api.civisibility.config.TestIdentifier;
44
import datadog.trace.api.civisibility.config.TestSourceData;
5-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
5+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
66
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
77
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
88
import javax.annotation.Nonnull;
@@ -41,7 +41,7 @@ TestSuiteImpl testSuiteStart(
4141
SkipReason skipReason(TestIdentifier test);
4242

4343
@Nonnull
44-
TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource);
44+
TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData testSource);
4545

4646
void end(Long startTime);
4747
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import datadog.trace.api.civisibility.config.TestIdentifier;
66
import datadog.trace.api.civisibility.config.TestSourceData;
77
import datadog.trace.api.civisibility.coverage.CoverageStore;
8-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
8+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
99
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
1010
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
1111
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
@@ -111,8 +111,8 @@ public SkipReason skipReason(TestIdentifier test) {
111111

112112
@Override
113113
@Nonnull
114-
public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) {
115-
return executionStrategy.retryPolicy(test, testSource);
114+
public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData testSource) {
115+
return executionStrategy.executionPolicy(test, testSource);
116116
}
117117

118118
@Override

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import datadog.trace.api.civisibility.config.TestIdentifier;
77
import datadog.trace.api.civisibility.config.TestSourceData;
88
import datadog.trace.api.civisibility.coverage.CoverageStore;
9-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
9+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
1010
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
1111
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
1212
import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
@@ -96,8 +96,8 @@ public SkipReason skipReason(TestIdentifier test) {
9696

9797
@Override
9898
@Nonnull
99-
public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) {
100-
return executionStrategy.retryPolicy(test, testSource);
99+
public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData testSource) {
100+
return executionStrategy.executionPolicy(test, testSource);
101101
}
102102

103103
@Override

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
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.retry.TestRetryPolicy;
8+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
99
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;
13-
import datadog.trace.civisibility.retry.NeverRetry;
13+
import datadog.trace.civisibility.execution.Regular;
1414
import java.util.Collection;
1515
import javax.annotation.Nonnull;
1616
import javax.annotation.Nullable;
@@ -99,8 +99,8 @@ public SkipReason skipReason(TestIdentifier test) {
9999

100100
@NotNull
101101
@Override
102-
public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData source) {
103-
return NeverRetry.INSTANCE;
102+
public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData source) {
103+
return Regular.INSTANCE;
104104
}
105105

106106
@Override

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +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.retry.TestRetryPolicy;
11+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
1212
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;
1313
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
1414
import datadog.trace.api.civisibility.telemetry.tag.EventType;
@@ -264,8 +264,8 @@ public void onTestIgnore(
264264

265265
@Override
266266
@Nonnull
267-
public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) {
268-
return testModule.retryPolicy(test, testSource);
267+
public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData testSource) {
268+
return testModule.executionPolicy(test, testSource);
269269
}
270270

271271
@Override

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/retry/NeverRetry.java renamed to dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/Regular.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
package datadog.trace.civisibility.retry;
1+
package datadog.trace.civisibility.execution;
22

3-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
3+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
44
import datadog.trace.api.civisibility.telemetry.tag.RetryReason;
55
import org.jetbrains.annotations.Nullable;
66

7-
public class NeverRetry implements TestRetryPolicy {
7+
/** Regular test case execution with no alterations. */
8+
public class Regular implements TestExecutionPolicy {
89

9-
public static final TestRetryPolicy INSTANCE = new NeverRetry();
10+
public static final TestExecutionPolicy INSTANCE = new Regular();
1011

11-
private NeverRetry() {}
12+
private Regular() {}
1213

1314
@Override
14-
public boolean retriesLeft() {
15+
public boolean applicable() {
1516
return false;
1617
}
1718

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/retry/RetryIfFailed.java renamed to dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/RetryUntilSuccessful.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
1-
package datadog.trace.civisibility.retry;
1+
package datadog.trace.civisibility.execution;
22

3-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
3+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
44
import datadog.trace.api.civisibility.telemetry.tag.RetryReason;
55
import java.util.concurrent.atomic.AtomicInteger;
66
import org.jetbrains.annotations.Nullable;
77

88
/** Retries a test case if it failed, up to a maximum number of times. */
9-
public class RetryIfFailed implements TestRetryPolicy {
9+
public class RetryUntilSuccessful implements TestExecutionPolicy {
1010

1111
private final int maxExecutions;
1212
private int executions;
1313

1414
/** Total execution counter that is shared by all retry policies */
1515
private final AtomicInteger totalExecutions;
1616

17-
public RetryIfFailed(int maxExecutions, AtomicInteger totalExecutions) {
17+
public RetryUntilSuccessful(int maxExecutions, AtomicInteger totalExecutions) {
1818
this.maxExecutions = maxExecutions;
1919
this.totalExecutions = totalExecutions;
2020
this.executions = 0;
2121
}
2222

2323
@Override
24-
public boolean retriesLeft() {
24+
public boolean applicable() {
25+
// the last execution is not altered by the policy
26+
// (no retries, no exceptions suppressing)
2527
return executions < maxExecutions - 1;
2628
}
2729

2830
@Override
2931
public boolean suppressFailures() {
30-
// if this isn't the last attempt,
32+
// if this isn't the last execution,
3133
// possible failures should be suppressed
32-
return retriesLeft();
34+
return applicable();
3335
}
3436

3537
@Override

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/retry/RetryNTimes.java renamed to dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/RunNTimes.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
package datadog.trace.civisibility.retry;
1+
package datadog.trace.civisibility.execution;
22

3-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
3+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
44
import datadog.trace.api.civisibility.telemetry.tag.RetryReason;
55
import datadog.trace.civisibility.config.EarlyFlakeDetectionSettings;
66
import org.jetbrains.annotations.Nullable;
77

8-
/** Retries a test case N times (N depends on test duration) regardless of success or failure. */
9-
public class RetryNTimes implements TestRetryPolicy {
8+
/** Runs a test case N times (N depends on test duration) regardless of success or failure. */
9+
public class RunNTimes implements TestExecutionPolicy {
1010

1111
private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
1212
private int executions;
1313
private int maxExecutions;
1414

15-
public RetryNTimes(EarlyFlakeDetectionSettings earlyFlakeDetectionSettings) {
15+
public RunNTimes(EarlyFlakeDetectionSettings earlyFlakeDetectionSettings) {
1616
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
1717
this.executions = 0;
1818
this.maxExecutions = earlyFlakeDetectionSettings.getExecutions(0);
1919
}
2020

2121
@Override
22-
public boolean retriesLeft() {
22+
public boolean applicable() {
23+
// the last execution is not altered by the policy
24+
// (no retries, no exceptions suppressing)
2325
return executions < maxExecutions - 1;
2426
}
2527

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/test/ExecutionStrategy.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
import datadog.trace.api.civisibility.config.TestIdentifier;
55
import datadog.trace.api.civisibility.config.TestMetadata;
66
import datadog.trace.api.civisibility.config.TestSourceData;
7-
import datadog.trace.api.civisibility.retry.TestRetryPolicy;
7+
import datadog.trace.api.civisibility.execution.TestExecutionPolicy;
88
import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
99
import datadog.trace.civisibility.config.EarlyFlakeDetectionSettings;
1010
import datadog.trace.civisibility.config.ExecutionSettings;
11-
import datadog.trace.civisibility.retry.NeverRetry;
12-
import datadog.trace.civisibility.retry.RetryIfFailed;
13-
import datadog.trace.civisibility.retry.RetryNTimes;
11+
import datadog.trace.civisibility.execution.Regular;
12+
import datadog.trace.civisibility.execution.RetryUntilSuccessful;
13+
import datadog.trace.civisibility.execution.RunNTimes;
1414
import datadog.trace.civisibility.source.LinesResolver;
1515
import datadog.trace.civisibility.source.SourcePathResolver;
1616
import java.lang.reflect.Method;
@@ -80,9 +80,9 @@ public SkipReason skipReason(TestIdentifier test) {
8080
}
8181

8282
@Nonnull
83-
public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSource) {
83+
public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData testSource) {
8484
if (test == null) {
85-
return NeverRetry.INSTANCE;
85+
return Regular.INSTANCE;
8686
}
8787

8888
EarlyFlakeDetectionSettings efdSettings = executionSettings.getEarlyFlakeDetectionSettings();
@@ -91,7 +91,7 @@ public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSourc
9191
// check-then-act with "earlyFlakeDetectionsUsed" is not atomic here,
9292
// but we don't care if we go "a bit" over the limit, it does not have to be precise
9393
earlyFlakeDetectionsUsed.incrementAndGet();
94-
return new RetryNTimes(efdSettings);
94+
return new RunNTimes(efdSettings);
9595
}
9696
}
9797

@@ -101,10 +101,11 @@ public TestRetryPolicy retryPolicy(TestIdentifier test, TestSourceData testSourc
101101
&& autoRetriesUsed.get() < config.getCiVisibilityTotalFlakyRetryCount()) {
102102
// check-then-act with "autoRetriesUsed" is not atomic here,
103103
// but we don't care if we go "a bit" over the limit, it does not have to be precise
104-
return new RetryIfFailed(config.getCiVisibilityFlakyRetryCount(), autoRetriesUsed);
104+
return new RetryUntilSuccessful(config.getCiVisibilityFlakyRetryCount(), autoRetriesUsed);
105105
}
106106
}
107-
return NeverRetry.INSTANCE;
107+
108+
return Regular.INSTANCE;
108109
}
109110

110111
public boolean isEFDLimitReached() {

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/buildsystem/ProxyTestModuleTest.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,21 @@ class ProxyTestModuleTest extends DDSpecification {
5656
)
5757

5858
when:
59-
def retryPolicy1 = proxyTestModule.retryPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN)
59+
def retryPolicy1 = proxyTestModule.executionPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN)
6060

6161
then:
6262
retryPolicy1.retry(false, 1L) // 2nd test execution, 1st retry globally
6363
!retryPolicy1.retry(false, 1L) // asking for 3rd test execution - local limit reached
6464

6565
when:
66-
def retryPolicy2 = proxyTestModule.retryPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN)
66+
def retryPolicy2 = proxyTestModule.executionPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN)
6767

6868
then:
6969
retryPolicy2.retry(false, 1L) // 2nd test execution, 2nd retry globally (since previous test was retried too)
7070
!retryPolicy2.retry(false, 1L) // asking for 3rd test execution - local limit reached
7171

7272
when:
73-
def retryPolicy3 = proxyTestModule.retryPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN)
73+
def retryPolicy3 = proxyTestModule.executionPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN)
7474

7575
then:
7676
!retryPolicy3.retry(false, 1L) // asking for 3rd retry globally - global limit reached

0 commit comments

Comments
 (0)