Skip to content

Commit 3f1837b

Browse files
add test management settings to execution settings
1 parent 1397b1a commit 3f1837b

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class ExecutionSettings {
2525
false,
2626
false,
2727
EarlyFlakeDetectionSettings.DEFAULT,
28+
TestManagementSettings.DEFAULT,
2829
null,
2930
Collections.emptyMap(),
3031
Collections.emptyMap(),
@@ -39,6 +40,7 @@ public class ExecutionSettings {
3940
private final boolean flakyTestRetriesEnabled;
4041
private final boolean impactedTestsDetectionEnabled;
4142
@Nonnull private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
43+
@Nonnull private final TestManagementSettings testManagementSettings;
4244
@Nullable private final String itrCorrelationId;
4345
@Nonnull private final Map<TestIdentifier, TestMetadata> skippableTests;
4446
@Nonnull private final Map<String, BitSet> skippableTestsCoverage;
@@ -54,6 +56,7 @@ public ExecutionSettings(
5456
boolean flakyTestRetriesEnabled,
5557
boolean impactedTestsDetectionEnabled,
5658
@Nonnull EarlyFlakeDetectionSettings earlyFlakeDetectionSettings,
59+
@Nonnull TestManagementSettings testManagementSettings,
5760
@Nullable String itrCorrelationId,
5861
@Nonnull Map<TestIdentifier, TestMetadata> skippableTests,
5962
@Nonnull Map<String, BitSet> skippableTestsCoverage,
@@ -67,6 +70,7 @@ public ExecutionSettings(
6770
this.flakyTestRetriesEnabled = flakyTestRetriesEnabled;
6871
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled;
6972
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
73+
this.testManagementSettings = testManagementSettings;
7074
this.itrCorrelationId = itrCorrelationId;
7175
this.skippableTests = skippableTests;
7276
this.skippableTestsCoverage = skippableTestsCoverage;
@@ -105,6 +109,11 @@ public EarlyFlakeDetectionSettings getEarlyFlakeDetectionSettings() {
105109
return earlyFlakeDetectionSettings;
106110
}
107111

112+
@Nonnull
113+
public TestManagementSettings getTestManagementSettings() {
114+
return testManagementSettings;
115+
}
116+
108117
@Nullable
109118
public String getItrCorrelationId() {
110119
return itrCorrelationId;
@@ -162,6 +171,7 @@ public boolean equals(Object o) {
162171
&& codeCoverageEnabled == that.codeCoverageEnabled
163172
&& testSkippingEnabled == that.testSkippingEnabled
164173
&& Objects.equals(earlyFlakeDetectionSettings, that.earlyFlakeDetectionSettings)
174+
&& Objects.equals(testManagementSettings, that.testManagementSettings)
165175
&& Objects.equals(itrCorrelationId, that.itrCorrelationId)
166176
&& Objects.equals(skippableTests, that.skippableTests)
167177
&& Objects.equals(skippableTestsCoverage, that.skippableTestsCoverage)
@@ -178,6 +188,7 @@ public int hashCode() {
178188
codeCoverageEnabled,
179189
testSkippingEnabled,
180190
earlyFlakeDetectionSettings,
191+
testManagementSettings,
181192
itrCorrelationId,
182193
skippableTests,
183194
skippableTestsCoverage,
@@ -211,6 +222,8 @@ public static ByteBuffer serialize(ExecutionSettings settings) {
211222

212223
EarlyFlakeDetectionSettingsSerializer.serialize(s, settings.earlyFlakeDetectionSettings);
213224

225+
TestManagementSettingsSerializer.serialize(s, settings.testManagementSettings);
226+
214227
s.write(settings.itrCorrelationId);
215228
s.write(
216229
settings.skippableTests,
@@ -238,6 +251,9 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
238251
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings =
239252
EarlyFlakeDetectionSettingsSerializer.deserialize(buffer);
240253

254+
TestManagementSettings testManagementSettings =
255+
TestManagementSettingsSerializer.deserialize(buffer);
256+
241257
String itrCorrelationId = Serializer.readString(buffer);
242258

243259
Map<TestIdentifier, TestMetadata> skippableTests =
@@ -262,6 +278,7 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
262278
flakyTestRetriesEnabled,
263279
impactedTestsDetectionEnabled,
264280
earlyFlakeDetectionSettings,
281+
testManagementSettings,
265282
itrCorrelationId,
266283
skippableTests,
267284
skippableTestsCoverage,

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.civisibility.config;
22

33
import datadog.trace.api.Config;
4+
import datadog.trace.api.ConfigDefaults;
45
import datadog.trace.api.civisibility.CIConstants;
56
import datadog.trace.api.civisibility.CiVisibilityWellKnownTags;
67
import datadog.trace.api.civisibility.config.TestIdentifier;
@@ -27,6 +28,7 @@
2728
import java.util.concurrent.Future;
2829
import java.util.concurrent.ThreadFactory;
2930
import java.util.concurrent.TimeUnit;
31+
import java.util.function.Consumer;
3032
import java.util.function.Function;
3133
import javax.annotation.Nonnull;
3234
import javax.annotation.Nullable;
@@ -177,6 +179,17 @@ private Map<String, ExecutionSettings> doCreate(
177179
settings,
178180
CiVisibilitySettings::isKnownTestsEnabled,
179181
Config::isCiVisibilityKnownTestsRequestEnabled);
182+
boolean testManagementEnabled =
183+
isFeatureEnabled(
184+
settings,
185+
s -> s.getTestManagementSettings().isEnabled(),
186+
Config::isCiVisibilityTestManagementEnabled);
187+
if (testManagementEnabled) {
188+
overrideIntegerSetting(
189+
Config::getCiVisibilityTestManagementAttemptToFixRetries,
190+
value -> value != ConfigDefaults.DEFAULT_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES,
191+
value -> settings.getTestManagementSettings().setAttemptToFixRetries(value));
192+
}
180193

181194
LOGGER.info(
182195
"CI Visibility settings ({}, {}/{}/{}):\n"
@@ -186,7 +199,8 @@ private Map<String, ExecutionSettings> doCreate(
186199
+ "Early flakiness detection - {},\n"
187200
+ "Impacted tests detection - {},\n"
188201
+ "Known tests marking - {},\n"
189-
+ "Auto test retries - {}",
202+
+ "Auto test retries - {},\n"
203+
+ "Test Management - {}",
190204
repositoryRoot,
191205
tracerEnvironment.getConfigurations().getRuntimeName(),
192206
tracerEnvironment.getConfigurations().getRuntimeVersion(),
@@ -197,7 +211,8 @@ private Map<String, ExecutionSettings> doCreate(
197211
earlyFlakeDetectionEnabled,
198212
impactedTestsEnabled,
199213
knownTestsRequest,
200-
flakyTestRetriesEnabled);
214+
flakyTestRetriesEnabled,
215+
testManagementEnabled);
201216

202217
Future<SkippableTests> skippableTestsFuture =
203218
executor.submit(() -> getSkippableTests(tracerEnvironment, itrEnabled));
@@ -228,6 +243,9 @@ private Map<String, ExecutionSettings> doCreate(
228243
earlyFlakeDetectionEnabled
229244
? settings.getEarlyFlakeDetectionSettings()
230245
: EarlyFlakeDetectionSettings.DEFAULT,
246+
testManagementEnabled
247+
? settings.getTestManagementSettings()
248+
: TestManagementSettings.DEFAULT,
231249
skippableTests.getCorrelationId(),
232250
skippableTests
233251
.getIdentifiersByModule()
@@ -270,6 +288,14 @@ private boolean isFeatureEnabled(
270288
return remoteSetting.apply(ciVisibilitySettings) && killSwitch.apply(config);
271289
}
272290

291+
private void overrideIntegerSetting(
292+
Function<Config, Integer> valueGetter, Function<Integer, Boolean> overrideCheck, Consumer<Integer> overrideAction) {
293+
Integer value = valueGetter.apply(config);
294+
if (value != null && overrideCheck.apply(value)) {
295+
overrideAction.accept(value);
296+
}
297+
}
298+
273299
@Nonnull
274300
private SkippableTests getSkippableTests(
275301
TracerEnvironment tracerEnvironment, boolean itrEnabled) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public TestExecutionPolicy executionPolicy(TestIdentifier test, TestSourceData t
105105
config.getCiVisibilityFlakyRetryCount(), isQuarantined(test), autoRetriesUsed);
106106
}
107107

108-
if (isQuarantined(test)) {
108+
if (executionSettings.getTestManagementSettings().isEnabled() && isQuarantined(test)) {
109109
return new RunOnceIgnoreOutcome();
110110
}
111111

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ExecutionSettingsTest.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ExecutionSettingsTest extends Specification {
2626
false,
2727
false,
2828
EarlyFlakeDetectionSettings.DEFAULT,
29+
TestManagementSettings.DEFAULT,
2930
null,
3031
[:],
3132
[:],
@@ -41,6 +42,7 @@ class ExecutionSettingsTest extends Specification {
4142
true,
4243
true,
4344
new EarlyFlakeDetectionSettings(true, [], 10),
45+
new TestManagementSettings(true, 20),
4446
"",
4547
[(new TestIdentifier("bc", "def", "g")): new TestMetadata(true), (new TestIdentifier("de", "f", null)): new TestMetadata(false)],
4648
[:],
@@ -57,6 +59,7 @@ class ExecutionSettingsTest extends Specification {
5759
false,
5860
true,
5961
new EarlyFlakeDetectionSettings(true, [new EarlyFlakeDetectionSettings.ExecutionsByDuration(10, 20)], 10),
62+
new TestManagementSettings(true, 20),
6063
"itrCorrelationId",
6164
[:],
6265
["cov" : BitSet.valueOf(new byte[]{
@@ -77,6 +80,7 @@ class ExecutionSettingsTest extends Specification {
7780
true,
7881
true,
7982
new EarlyFlakeDetectionSettings(true, [new EarlyFlakeDetectionSettings.ExecutionsByDuration(10, 20), new EarlyFlakeDetectionSettings.ExecutionsByDuration(30, 40)], 10),
83+
new TestManagementSettings(true, 20),
8084
"itrCorrelationId",
8185
[(new TestIdentifier("bc", "def", null)): new TestMetadata(true), (new TestIdentifier("de", "f", null)): new TestMetadata(true)],
8286
["cov" : BitSet.valueOf(new byte[]{

dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
8080
private static volatile boolean flakyRetryEnabled = false
8181
private static volatile boolean earlyFlakinessDetectionEnabled = false
8282
private static volatile boolean impactedTestsDetectionEnabled = false
83-
private static volatile boolean quarantineEnabled = false
83+
private static volatile boolean testManagementEnabled = false
8484

8585
public static final int SLOW_TEST_THRESHOLD_MILLIS = 1000
8686
public static final int VERY_SLOW_TEST_THRESHOLD_MILLIS = 2000
@@ -117,6 +117,10 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
117117
], 0)
118118
: EarlyFlakeDetectionSettings.DEFAULT
119119

120+
def testManagementSettings = testManagementEnabled
121+
? new TestManagementSettings(true, 20)
122+
: TestManagementSettings.DEFAULT
123+
120124
Map<TestIdentifier, TestMetadata> skippableTestsWithMetadata = new HashMap<>()
121125
for (TestIdentifier skippableTest : skippableTests) {
122126
skippableTestsWithMetadata.put(skippableTest, new TestMetadata(false))
@@ -129,6 +133,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
129133
flakyRetryEnabled,
130134
impactedTestsDetectionEnabled,
131135
earlyFlakinessDetectionSettings,
136+
testManagementSettings,
132137
itrEnabled ? "itrCorrelationId" : null,
133138
skippableTestsWithMetadata,
134139
[:],
@@ -259,10 +264,10 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
259264
knownTests.clear()
260265
diff = LineDiff.EMPTY
261266
itrEnabled = false
262-
quarantineEnabled = false
263267
flakyRetryEnabled = false
264268
earlyFlakinessDetectionEnabled = false
265269
impactedTestsDetectionEnabled = false
270+
testManagementEnabled = false
266271

267272
TEST_WRITER.setFilter(spanFilter)
268273
}
@@ -288,10 +293,6 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
288293
this.diff = diff
289294
}
290295

291-
def givenQuarantineEnabled(boolean quarantineEnabled) {
292-
this.quarantineEnabled = quarantineEnabled
293-
}
294-
295296
def givenFlakyRetryEnabled(boolean flakyRetryEnabled) {
296297
this.flakyRetryEnabled = flakyRetryEnabled
297298
}
@@ -304,6 +305,10 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
304305
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled
305306
}
306307

308+
def givenTestManagementEnabled(boolean testManagementEnabled) {
309+
this.testManagementEnabled = testManagementEnabled
310+
}
311+
307312
def givenTestsOrder(String testsOrder) {
308313
injectSysConfig(CiVisibilityConfig.CIVISIBILITY_TEST_ORDER, testsOrder)
309314
}
@@ -321,6 +326,8 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
321326
injectSysConfig(CiVisibilityConfig.CIVISIBILITY_ITR_ENABLED, "true")
322327
injectSysConfig(CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ENABLED, "true")
323328
injectSysConfig(CiVisibilityConfig.CIVISIBILITY_EARLY_FLAKE_DETECTION_LOWER_LIMIT, "1")
329+
injectSysConfig(CiVisibilityConfig.TEST_MANAGEMENT_ENABLED, "true")
330+
injectSysConfig(CiVisibilityConfig.TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES, "20")
324331
}
325332

326333
def cleanupSpec() {

0 commit comments

Comments
 (0)