Skip to content

Commit 962118d

Browse files
refactor: extract common dto logic
1 parent 19cd3a7 commit 962118d

File tree

4 files changed

+132
-227
lines changed

4 files changed

+132
-227
lines changed

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

Lines changed: 3 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package datadog.trace.civisibility.config;
22

3-
import com.squareup.moshi.FromJson;
43
import com.squareup.moshi.Json;
54
import com.squareup.moshi.JsonAdapter;
65
import com.squareup.moshi.Moshi;
7-
import com.squareup.moshi.ToJson;
86
import com.squareup.moshi.Types;
97
import datadog.communication.BackendApi;
108
import datadog.communication.http.OkHttpUtils;
@@ -27,10 +25,8 @@
2725
import datadog.trace.api.civisibility.telemetry.tag.TestManagementEnabled;
2826
import datadog.trace.civisibility.communication.TelemetryListener;
2927
import datadog.trace.util.RandomUtils;
30-
import java.io.File;
3128
import java.io.IOException;
3229
import java.lang.reflect.ParameterizedType;
33-
import java.util.Base64;
3430
import java.util.BitSet;
3531
import java.util.Collection;
3632
import java.util.Collections;
@@ -87,7 +83,7 @@ public ConfigurationApiImpl(BackendApi backendApi, CiVisibilityMetricCollector m
8783
.add(ConfigurationsJsonAdapter.INSTANCE)
8884
.add(CiVisibilitySettings.JsonAdapter.INSTANCE)
8985
.add(EarlyFlakeDetectionSettings.JsonAdapter.INSTANCE)
90-
.add(MetaDtoJsonAdapter.INSTANCE)
86+
.add(MetaDto.JsonAdapter.INSTANCE)
9187
.build();
9288

9389
ParameterizedType requestType =
@@ -208,7 +204,7 @@ public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) thr
208204
metricCollector.add(
209205
CiVisibilityCountMetric.ITR_SKIPPABLE_TESTS_RESPONSE_TESTS, response.data.size());
210206

211-
String correlationId = response.meta != null ? response.meta.correlation_id : null;
207+
String correlationId = response.meta != null ? response.meta.correlationId : null;
212208
Map<String, BitSet> coveredLinesByRelativeSourcePath =
213209
response.meta != null && response.meta.coverage != null
214210
? response.meta.coverage
@@ -499,6 +495,7 @@ private MultiEnvelopeDto(Collection<DataDto<T>> data, MetaDto meta) {
499495
}
500496

501497
private static final class DataDto<T> {
498+
// TODO: extract all DTO logic to common utilities
502499
private final String id;
503500
private final String type;
504501
private final T attributes;
@@ -514,52 +511,6 @@ public T getAttributes() {
514511
}
515512
}
516513

517-
private static final class MetaDto {
518-
private final String correlation_id;
519-
private final Map<String, BitSet> coverage;
520-
521-
private MetaDto(String correlation_id, Map<String, BitSet> coverage) {
522-
this.correlation_id = correlation_id;
523-
this.coverage = coverage;
524-
}
525-
}
526-
527-
private static final class MetaDtoJsonAdapter {
528-
529-
private static final MetaDtoJsonAdapter INSTANCE = new MetaDtoJsonAdapter();
530-
531-
@FromJson
532-
public MetaDto fromJson(Map<String, Object> json) {
533-
if (json == null) {
534-
return null;
535-
}
536-
537-
Map<String, BitSet> coverage;
538-
Map<String, String> encodedCoverage = (Map<String, String>) json.get("coverage");
539-
if (encodedCoverage != null) {
540-
coverage = new HashMap<>();
541-
for (Map.Entry<String, String> e : encodedCoverage.entrySet()) {
542-
String relativeSourceFilePath = e.getKey();
543-
String normalizedSourceFilePath =
544-
relativeSourceFilePath.startsWith(File.separator)
545-
? relativeSourceFilePath.substring(1)
546-
: relativeSourceFilePath;
547-
byte[] decodedLines = Base64.getDecoder().decode(e.getValue());
548-
coverage.put(normalizedSourceFilePath, BitSet.valueOf(decodedLines));
549-
}
550-
} else {
551-
coverage = null;
552-
}
553-
554-
return new MetaDto((String) json.get("correlation_id"), coverage);
555-
}
556-
557-
@ToJson
558-
public Map<String, Object> toJson(MetaDto metaDto) {
559-
throw new UnsupportedOperationException();
560-
}
561-
}
562-
563514
private static final class KnownTestsDto {
564515
private final Map<String, Map<String, List<String>>> tests;
565516

@@ -648,66 +599,4 @@ private TestManagementDto(
648599
this.branch = branch;
649600
}
650601
}
651-
652-
private static final class TestManagementTestsDto {
653-
private static final class Properties {
654-
private final Map<String, Boolean> properties;
655-
656-
private Properties(Map<String, Boolean> properties) {
657-
this.properties = properties;
658-
}
659-
660-
public Boolean isQuarantined() {
661-
return properties != null
662-
? properties.getOrDefault(TestSetting.QUARANTINED.asString(), false)
663-
: false;
664-
}
665-
666-
public Boolean isDisabled() {
667-
return properties != null
668-
? properties.getOrDefault(TestSetting.DISABLED.asString(), false)
669-
: false;
670-
}
671-
672-
public Boolean isAttemptToFix() {
673-
return properties != null
674-
? properties.getOrDefault(TestSetting.ATTEMPT_TO_FIX.asString(), false)
675-
: false;
676-
}
677-
}
678-
679-
private static final class Tests {
680-
private final Map<String, Properties> tests;
681-
682-
private Tests(Map<String, Properties> tests) {
683-
this.tests = tests;
684-
}
685-
686-
public Map<String, Properties> getTests() {
687-
return tests != null ? tests : Collections.emptyMap();
688-
}
689-
}
690-
691-
private static final class Suites {
692-
private final Map<String, Tests> suites;
693-
694-
private Suites(Map<String, Tests> suites) {
695-
this.suites = suites;
696-
}
697-
698-
public Map<String, Tests> getSuites() {
699-
return suites != null ? suites : Collections.emptyMap();
700-
}
701-
}
702-
703-
private final Map<String, Suites> modules;
704-
705-
private TestManagementTestsDto(Map<String, Suites> modules) {
706-
this.modules = modules;
707-
}
708-
709-
public Map<String, Suites> getModules() {
710-
return modules != null ? modules : Collections.emptyMap();
711-
}
712-
}
713602
}

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

Lines changed: 23 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package datadog.trace.civisibility.config;
22

3-
import com.squareup.moshi.FromJson;
43
import com.squareup.moshi.JsonAdapter;
54
import com.squareup.moshi.Moshi;
6-
import com.squareup.moshi.ToJson;
75
import com.squareup.moshi.Types;
86
import datadog.trace.api.civisibility.config.Configurations;
97
import datadog.trace.api.civisibility.config.TestFQN;
108
import datadog.trace.api.civisibility.config.TestIdentifier;
119
import datadog.trace.api.civisibility.config.TestMetadata;
12-
import java.io.File;
1310
import java.io.IOException;
1411
import java.lang.reflect.ParameterizedType;
1512
import java.nio.file.Path;
16-
import java.util.Base64;
1713
import java.util.BitSet;
1814
import java.util.Collection;
1915
import java.util.Collections;
@@ -68,7 +64,7 @@ public FileBasedConfigurationApi(
6864
.add(CiVisibilitySettings.JsonAdapter.INSTANCE)
6965
.add(EarlyFlakeDetectionSettings.JsonAdapter.INSTANCE)
7066
.add(TestManagementSettings.JsonAdapter.INSTANCE)
71-
.add(MetaDtoJsonAdapter.INSTANCE)
67+
.add(MetaDto.JsonAdapter.INSTANCE)
7268
.build();
7369

7470
settingsAdapter = moshi.adapter(SettingsEnvelope.class);
@@ -248,29 +244,28 @@ private Map<TestSetting, Map<String, Collection<TestFQN>>> parseTestManagementTe
248244
Map<String, Collection<TestFQN>> disabled = new HashMap<>();
249245
Map<String, Collection<TestFQN>> attemptToFix = new HashMap<>();
250246

251-
if (dto.modules != null) {
252-
for (Map.Entry<String, TestManagementTestsDto.Suites> moduleEntry : dto.modules.entrySet()) {
253-
String moduleName = moduleEntry.getKey();
254-
Map<String, TestManagementTestsDto.Tests> suites = moduleEntry.getValue().getSuites();
255-
256-
for (Map.Entry<String, TestManagementTestsDto.Tests> suiteEntry : suites.entrySet()) {
257-
String suiteName = suiteEntry.getKey();
258-
Map<String, TestManagementTestsDto.Properties> tests = suiteEntry.getValue().getTests();
259-
260-
for (Map.Entry<String, TestManagementTestsDto.Properties> testEntry : tests.entrySet()) {
261-
String testName = testEntry.getKey();
262-
TestManagementTestsDto.Properties props = testEntry.getValue();
263-
TestFQN fqn = new TestFQN(suiteName, testName);
264-
265-
if (props.isQuarantined()) {
266-
quarantined.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
267-
}
268-
if (props.isDisabled()) {
269-
disabled.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
270-
}
271-
if (props.isAttemptToFix()) {
272-
attemptToFix.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
273-
}
247+
for (Map.Entry<String, TestManagementTestsDto.Suites> moduleEntry :
248+
dto.getModules().entrySet()) {
249+
String moduleName = moduleEntry.getKey();
250+
Map<String, TestManagementTestsDto.Tests> suites = moduleEntry.getValue().getSuites();
251+
252+
for (Map.Entry<String, TestManagementTestsDto.Tests> suiteEntry : suites.entrySet()) {
253+
String suiteName = suiteEntry.getKey();
254+
Map<String, TestManagementTestsDto.Properties> tests = suiteEntry.getValue().getTests();
255+
256+
for (Map.Entry<String, TestManagementTestsDto.Properties> testEntry : tests.entrySet()) {
257+
String testName = testEntry.getKey();
258+
TestManagementTestsDto.Properties props = testEntry.getValue();
259+
TestFQN fqn = new TestFQN(suiteName, testName);
260+
261+
if (props.isQuarantined()) {
262+
quarantined.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
263+
}
264+
if (props.isDisabled()) {
265+
disabled.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
266+
}
267+
if (props.isAttemptToFix()) {
268+
attemptToFix.computeIfAbsent(moduleName, k -> new HashSet<>()).add(fqn);
274269
}
275270
}
276271
}
@@ -322,89 +317,4 @@ static final class TestIdentifierDataDto {
322317
String type;
323318
TestIdentifierJson attributes;
324319
}
325-
326-
static final class MetaDto {
327-
final String correlationId;
328-
final Map<String, BitSet> coverage;
329-
330-
MetaDto(String correlationId, Map<String, BitSet> coverage) {
331-
this.correlationId = correlationId;
332-
this.coverage = coverage;
333-
}
334-
}
335-
336-
static final class MetaDtoJsonAdapter {
337-
static final MetaDtoJsonAdapter INSTANCE = new MetaDtoJsonAdapter();
338-
339-
@SuppressWarnings("unchecked")
340-
@FromJson
341-
public MetaDto fromJson(Map<String, Object> json) {
342-
if (json == null) {
343-
return null;
344-
}
345-
346-
Map<String, BitSet> coverage;
347-
Map<String, String> encodedCoverage = (Map<String, String>) json.get("coverage");
348-
if (encodedCoverage != null) {
349-
coverage = new HashMap<>();
350-
for (Map.Entry<String, String> e : encodedCoverage.entrySet()) {
351-
String relativeSourceFilePath = e.getKey();
352-
String normalizedPath =
353-
relativeSourceFilePath.startsWith(File.separator)
354-
? relativeSourceFilePath.substring(1)
355-
: relativeSourceFilePath;
356-
byte[] decodedLines = Base64.getDecoder().decode(e.getValue());
357-
coverage.put(normalizedPath, BitSet.valueOf(decodedLines));
358-
}
359-
} else {
360-
coverage = null;
361-
}
362-
363-
return new MetaDto((String) json.get("correlation_id"), coverage);
364-
}
365-
366-
@ToJson
367-
public Map<String, Object> toJson(MetaDto metaDto) {
368-
throw new UnsupportedOperationException();
369-
}
370-
}
371-
372-
static final class TestManagementTestsDto {
373-
Map<String, Suites> modules;
374-
375-
static final class Properties {
376-
Map<String, Boolean> properties;
377-
378-
boolean isQuarantined() {
379-
return properties != null
380-
&& properties.getOrDefault(TestSetting.QUARANTINED.asString(), false);
381-
}
382-
383-
boolean isDisabled() {
384-
return properties != null
385-
&& properties.getOrDefault(TestSetting.DISABLED.asString(), false);
386-
}
387-
388-
boolean isAttemptToFix() {
389-
return properties != null
390-
&& properties.getOrDefault(TestSetting.ATTEMPT_TO_FIX.asString(), false);
391-
}
392-
}
393-
394-
static final class Tests {
395-
Map<String, Properties> tests;
396-
397-
Map<String, Properties> getTests() {
398-
return tests != null ? tests : Collections.emptyMap();
399-
}
400-
}
401-
402-
static final class Suites {
403-
Map<String, Tests> suites;
404-
405-
Map<String, Tests> getSuites() {
406-
return suites != null ? suites : Collections.emptyMap();
407-
}
408-
}
409-
}
410320
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package datadog.trace.civisibility.config;
2+
3+
import com.squareup.moshi.FromJson;
4+
import com.squareup.moshi.ToJson;
5+
import java.io.File;
6+
import java.util.Base64;
7+
import java.util.BitSet;
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
import javax.annotation.Nullable;
11+
12+
final class MetaDto {
13+
14+
@Nullable final String correlationId;
15+
@Nullable final Map<String, BitSet> coverage;
16+
17+
MetaDto(@Nullable String correlationId, @Nullable Map<String, BitSet> coverage) {
18+
this.correlationId = correlationId;
19+
this.coverage = coverage;
20+
}
21+
22+
static final class JsonAdapter {
23+
24+
static final JsonAdapter INSTANCE = new JsonAdapter();
25+
26+
@SuppressWarnings("unchecked")
27+
@FromJson
28+
public MetaDto fromJson(Map<String, Object> json) {
29+
if (json == null) {
30+
return null;
31+
}
32+
33+
Map<String, BitSet> coverage;
34+
Map<String, String> encodedCoverage = (Map<String, String>) json.get("coverage");
35+
if (encodedCoverage != null) {
36+
coverage = new HashMap<>();
37+
for (Map.Entry<String, String> e : encodedCoverage.entrySet()) {
38+
String relativeSourceFilePath = e.getKey();
39+
String normalizedPath =
40+
relativeSourceFilePath.startsWith(File.separator)
41+
? relativeSourceFilePath.substring(1)
42+
: relativeSourceFilePath;
43+
byte[] decodedLines = Base64.getDecoder().decode(e.getValue());
44+
coverage.put(normalizedPath, BitSet.valueOf(decodedLines));
45+
}
46+
} else {
47+
coverage = null;
48+
}
49+
50+
return new MetaDto((String) json.get("correlation_id"), coverage);
51+
}
52+
53+
@ToJson
54+
public Map<String, Object> toJson(MetaDto metaDto) {
55+
throw new UnsupportedOperationException();
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)