Skip to content

Commit ac2ce26

Browse files
Receive test management settings from CIVis settings request (#8331)
1 parent 9e8c9c2 commit ac2ce26

File tree

89 files changed

+2941
-2541
lines changed

Some content is hidden

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

89 files changed

+2941
-2541
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ private TestEventsHandlerFactory(
158158
services, repoServices, coverageServices, executionSettings);
159159
} else {
160160
sessionFactory =
161-
headlessTestFrameworkEssionFactory(
161+
headlessTestFrameworkSessionFactory(
162162
services, repoServices, coverageServices, executionSettings);
163163
}
164164
}
@@ -259,7 +259,7 @@ private static TestFrameworkSession.Factory childTestFrameworkSessionFactory(
259259
};
260260
}
261261

262-
private static TestFrameworkSession.Factory headlessTestFrameworkEssionFactory(
262+
private static TestFrameworkSession.Factory headlessTestFrameworkSessionFactory(
263263
CiVisibilityServices services,
264264
CiVisibilityRepoServices repoServices,
265265
CiVisibilityCoverageServices.Child coverageServices,

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

+24-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@ public class CiVisibilitySettings {
99

1010
public static final CiVisibilitySettings DEFAULT =
1111
new CiVisibilitySettings(
12-
false, false, false, false, false, false, false, EarlyFlakeDetectionSettings.DEFAULT);
12+
false,
13+
false,
14+
false,
15+
false,
16+
false,
17+
false,
18+
false,
19+
EarlyFlakeDetectionSettings.DEFAULT,
20+
TestManagementSettings.DEFAULT);
1321

1422
private final boolean itrEnabled;
1523
private final boolean codeCoverage;
@@ -19,6 +27,7 @@ public class CiVisibilitySettings {
1927
private final boolean impactedTestsDetectionEnabled;
2028
private final boolean knownTestsEnabled;
2129
private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
30+
private final TestManagementSettings testManagementSettings;
2231

2332
CiVisibilitySettings(
2433
boolean itrEnabled,
@@ -28,7 +37,8 @@ public class CiVisibilitySettings {
2837
boolean flakyTestRetriesEnabled,
2938
boolean impactedTestsDetectionEnabled,
3039
boolean knownTestsEnabled,
31-
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings) {
40+
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings,
41+
TestManagementSettings testManagementSettings) {
3242
this.itrEnabled = itrEnabled;
3343
this.codeCoverage = codeCoverage;
3444
this.testsSkipping = testsSkipping;
@@ -37,6 +47,7 @@ public class CiVisibilitySettings {
3747
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled;
3848
this.knownTestsEnabled = knownTestsEnabled;
3949
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
50+
this.testManagementSettings = testManagementSettings;
4051
}
4152

4253
public boolean isItrEnabled() {
@@ -71,6 +82,10 @@ public EarlyFlakeDetectionSettings getEarlyFlakeDetectionSettings() {
7182
return earlyFlakeDetectionSettings;
7283
}
7384

85+
public TestManagementSettings getTestManagementSettings() {
86+
return testManagementSettings;
87+
}
88+
7489
@Override
7590
public boolean equals(Object o) {
7691
if (this == o) {
@@ -87,7 +102,8 @@ public boolean equals(Object o) {
87102
&& flakyTestRetriesEnabled == that.flakyTestRetriesEnabled
88103
&& impactedTestsDetectionEnabled == that.impactedTestsDetectionEnabled
89104
&& knownTestsEnabled == that.knownTestsEnabled
90-
&& Objects.equals(earlyFlakeDetectionSettings, that.earlyFlakeDetectionSettings);
105+
&& Objects.equals(earlyFlakeDetectionSettings, that.earlyFlakeDetectionSettings)
106+
&& Objects.equals(testManagementSettings, that.testManagementSettings);
91107
}
92108

93109
@Override
@@ -100,7 +116,8 @@ public int hashCode() {
100116
flakyTestRetriesEnabled,
101117
impactedTestsDetectionEnabled,
102118
knownTestsEnabled,
103-
earlyFlakeDetectionSettings);
119+
earlyFlakeDetectionSettings,
120+
testManagementSettings);
104121
}
105122

106123
public interface Factory {
@@ -126,7 +143,9 @@ public CiVisibilitySettings fromJson(Map<String, Object> json) {
126143
getBoolean(json, "impacted_tests_enabled", false),
127144
getBoolean(json, "known_tests_enabled", false),
128145
EarlyFlakeDetectionSettingsJsonAdapter.INSTANCE.fromJson(
129-
(Map<String, Object>) json.get("early_flake_detection")));
146+
(Map<String, Object>) json.get("early_flake_detection")),
147+
TestManagementSettingsJsonAdapter.INSTANCE.fromJson(
148+
(Map<String, Object>) json.get("test_management")));
130149
}
131150

132151
private static boolean getBoolean(

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

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import datadog.trace.api.civisibility.telemetry.tag.ItrSkipEnabled;
2222
import datadog.trace.api.civisibility.telemetry.tag.KnownTestsEnabled;
2323
import datadog.trace.api.civisibility.telemetry.tag.RequireGit;
24+
import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled;
2425
import datadog.trace.civisibility.communication.TelemetryListener;
2526
import datadog.trace.util.RandomUtils;
2627
import java.io.File;
@@ -146,6 +147,7 @@ public CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) thr
146147
settings.isFlakyTestRetriesEnabled() ? FlakyTestRetriesEnabled.TRUE : null,
147148
settings.isKnownTestsEnabled() ? KnownTestsEnabled.TRUE : null,
148149
settings.isImpactedTestsDetectionEnabled() ? ImpactedTestsDetectionEnabled.TRUE : null,
150+
settings.getTestManagementSettings().isEnabled() ? TestManagementEnabled.TRUE : null,
149151
settings.isGitUploadRequired() ? RequireGit.TRUE : null);
150152

151153
return settings;

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

+17
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

+27-3
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ private Map<String, ExecutionSettings> doCreate(
178178
CiVisibilitySettings::isKnownTestsEnabled,
179179
Config::isCiVisibilityKnownTestsRequestEnabled);
180180

181+
TestManagementSettings testManagementSettings = getTestManagementSettings(settings);
182+
181183
LOGGER.info(
182184
"CI Visibility settings ({}, {}/{}/{}):\n"
183185
+ "Intelligent Test Runner - {},\n"
@@ -186,7 +188,8 @@ private Map<String, ExecutionSettings> doCreate(
186188
+ "Early flakiness detection - {},\n"
187189
+ "Impacted tests detection - {},\n"
188190
+ "Known tests marking - {},\n"
189-
+ "Auto test retries - {}",
191+
+ "Auto test retries - {},\n"
192+
+ "Test Management - {}",
190193
repositoryRoot,
191194
tracerEnvironment.getConfigurations().getRuntimeName(),
192195
tracerEnvironment.getConfigurations().getRuntimeVersion(),
@@ -197,7 +200,8 @@ private Map<String, ExecutionSettings> doCreate(
197200
earlyFlakeDetectionEnabled,
198201
impactedTestsEnabled,
199202
knownTestsRequest,
200-
flakyTestRetriesEnabled);
203+
flakyTestRetriesEnabled,
204+
testManagementSettings.isEnabled());
201205

202206
Future<SkippableTests> skippableTestsFuture =
203207
executor.submit(() -> getSkippableTests(tracerEnvironment, itrEnabled));
@@ -228,6 +232,7 @@ private Map<String, ExecutionSettings> doCreate(
228232
earlyFlakeDetectionEnabled
229233
? settings.getEarlyFlakeDetectionSettings()
230234
: EarlyFlakeDetectionSettings.DEFAULT,
235+
testManagementSettings,
231236
skippableTests.getCorrelationId(),
232237
skippableTests
233238
.getIdentifiersByModule()
@@ -270,6 +275,26 @@ private boolean isFeatureEnabled(
270275
return remoteSetting.apply(ciVisibilitySettings) && killSwitch.apply(config);
271276
}
272277

278+
@Nonnull
279+
private TestManagementSettings getTestManagementSettings(CiVisibilitySettings settings) {
280+
boolean testManagementEnabled =
281+
isFeatureEnabled(
282+
settings,
283+
s -> s.getTestManagementSettings().isEnabled(),
284+
Config::isCiVisibilityTestManagementEnabled);
285+
286+
if (!testManagementEnabled) {
287+
return TestManagementSettings.DEFAULT;
288+
}
289+
290+
Integer retries = config.getCiVisibilityTestManagementAttemptToFixRetries();
291+
if (retries != null) {
292+
return new TestManagementSettings(true, retries);
293+
}
294+
295+
return settings.getTestManagementSettings();
296+
}
297+
273298
@Nonnull
274299
private SkippableTests getSkippableTests(
275300
TracerEnvironment tracerEnvironment, boolean itrEnabled) {
@@ -302,7 +327,6 @@ private SkippableTests getSkippableTests(
302327
Thread.currentThread().interrupt();
303328
LOGGER.error("Interrupted while waiting for git data upload", e);
304329
return SkippableTests.EMPTY;
305-
306330
} catch (Exception e) {
307331
LOGGER.error("Could not obtain list of skippable tests, will proceed without skipping", e);
308332
return SkippableTests.EMPTY;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package datadog.trace.civisibility.config;
2+
3+
import java.util.Objects;
4+
5+
public class TestManagementSettings {
6+
7+
public static final TestManagementSettings DEFAULT = new TestManagementSettings(false, -1);
8+
9+
private final boolean enabled;
10+
private final int attemptToFixRetries;
11+
12+
public TestManagementSettings(boolean enabled, int attemptToFixRetries) {
13+
this.enabled = enabled;
14+
this.attemptToFixRetries = attemptToFixRetries;
15+
}
16+
17+
public boolean isEnabled() {
18+
return enabled;
19+
}
20+
21+
public int getAttemptToFixRetries() {
22+
return attemptToFixRetries;
23+
}
24+
25+
@Override
26+
public boolean equals(Object o) {
27+
if (this == o) {
28+
return true;
29+
}
30+
if (o == null || getClass() != o.getClass()) {
31+
return false;
32+
}
33+
34+
TestManagementSettings that = (TestManagementSettings) o;
35+
return enabled == that.enabled && attemptToFixRetries == that.attemptToFixRetries;
36+
}
37+
38+
@Override
39+
public int hashCode() {
40+
return Objects.hash(enabled, attemptToFixRetries);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package datadog.trace.civisibility.config;
2+
3+
import com.squareup.moshi.FromJson;
4+
import java.util.Map;
5+
6+
public class TestManagementSettingsJsonAdapter {
7+
public static final TestManagementSettingsJsonAdapter INSTANCE =
8+
new TestManagementSettingsJsonAdapter();
9+
10+
@FromJson
11+
public TestManagementSettings fromJson(Map<String, Object> json) {
12+
if (json == null) {
13+
return TestManagementSettings.DEFAULT;
14+
}
15+
16+
Boolean enabled = (Boolean) json.get("enabled");
17+
Double attemptToFixRetries = (Double) json.get("attempt_to_fix_retries");
18+
19+
return new TestManagementSettings(
20+
enabled != null ? enabled : false,
21+
attemptToFixRetries != null ? attemptToFixRetries.intValue() : -1);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package datadog.trace.civisibility.config;
2+
3+
import datadog.trace.civisibility.ipc.serialization.Serializer;
4+
import java.nio.ByteBuffer;
5+
6+
public class TestManagementSettingsSerializer {
7+
public static void serialize(Serializer serializer, TestManagementSettings settings) {
8+
if (!settings.isEnabled()) {
9+
serializer.write((byte) 0);
10+
return;
11+
}
12+
serializer.write((byte) 1);
13+
serializer.write(settings.getAttemptToFixRetries());
14+
}
15+
16+
public static TestManagementSettings deserialize(ByteBuffer buf) {
17+
boolean enabled = Serializer.readByte(buf) != 0;
18+
if (!enabled) {
19+
return TestManagementSettings.DEFAULT;
20+
}
21+
22+
int attemptToFixRetries = Serializer.readInt(buf);
23+
return new TestManagementSettings(enabled, attemptToFixRetries);
24+
}
25+
}

0 commit comments

Comments
 (0)