Skip to content

Commit 093e274

Browse files
committed
Refactor Continuous Testing RPC service and UI
- merge observers for test state and results - replace direct rendering of results and state by custom API object (DTO) - optimize size and structure of JSON message resolves #43067
1 parent 1c8464b commit 093e274

File tree

10 files changed

+522
-172
lines changed

10 files changed

+522
-172
lines changed

core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestClassResult.java

+15-10
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,39 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6-
public class TestClassResult implements Comparable<TestClassResult> {
6+
import io.quarkus.dev.testing.results.TestClassResultInterface;
7+
import io.quarkus.dev.testing.results.TestResultInterface;
8+
9+
public class TestClassResult implements TestClassResultInterface {
710
final String className;
811
final List<TestResult> passing;
912
final List<TestResult> failing;
1013
final List<TestResult> skipped;
1114
final long latestRunId;
1215
final long time;
1316

14-
public TestClassResult(String className, List<TestResult> passing, List<TestResult> failing, List<TestResult> skipped,
17+
public TestClassResult(
18+
String className,
19+
List<TestResult> passing,
20+
List<TestResult> failing,
21+
List<TestResult> skipped,
1522
long time) {
1623
this.className = className;
1724
this.passing = passing;
1825
this.failing = failing;
1926
this.skipped = skipped;
2027
this.time = time;
2128
long runId = 0;
22-
for (TestResult i : passing) {
23-
runId = Math.max(i.runId, runId);
29+
for (TestResultInterface i : passing) {
30+
runId = Math.max(i.getRunId(), runId);
2431
}
25-
for (TestResult i : failing) {
26-
runId = Math.max(i.runId, runId);
32+
for (TestResultInterface i : failing) {
33+
runId = Math.max(i.getRunId(), runId);
2734
}
2835
latestRunId = runId;
2936
}
3037

38+
@Override
3139
public String getClassName() {
3240
return className;
3341
}
@@ -53,15 +61,12 @@ public long getTime() {
5361
}
5462

5563
@Override
56-
public int compareTo(TestClassResult o) {
57-
return className.compareTo(o.className);
58-
}
59-
6064
public List<TestResult> getResults() {
6165
List<TestResult> ret = new ArrayList<>();
6266
ret.addAll(passing);
6367
ret.addAll(failing);
6468
ret.addAll(skipped);
6569
return ret;
6670
}
71+
6772
}

core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestResult.java

+26-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.junit.platform.engine.TestExecutionResult;
88
import org.junit.platform.engine.UniqueId;
99

10-
public class TestResult {
10+
import io.quarkus.dev.testing.results.TestResultInterface;
11+
12+
public class TestResult implements TestResultInterface {
1113

1214
final String displayName;
1315
final String testClass;
@@ -49,18 +51,22 @@ public TestExecutionResult getTestExecutionResult() {
4951
return testExecutionResult;
5052
}
5153

54+
@Override
5255
public List<String> getLogOutput() {
5356
return logOutput;
5457
}
5558

59+
@Override
5660
public String getDisplayName() {
5761
return displayName;
5862
}
5963

64+
@Override
6065
public String getTestClass() {
6166
return testClass;
6267
}
6368

69+
@Override
6470
public List<String> getTags() {
6571
return tags;
6672
}
@@ -69,23 +75,42 @@ public UniqueId getUniqueId() {
6975
return uniqueId;
7076
}
7177

78+
@Override
7279
public boolean isTest() {
7380
return test;
7481
}
7582

83+
@Override
84+
public String getId() {
85+
return uniqueId.toString();
86+
}
87+
88+
@Override
7689
public long getRunId() {
7790
return runId;
7891
}
7992

93+
@Override
8094
public long getTime() {
8195
return time;
8296
}
8397

98+
@Override
8499
public List<Throwable> getProblems() {
85100
return problems;
86101
}
87102

103+
@Override
88104
public boolean isReportable() {
89105
return reportable;
90106
}
107+
108+
@Override
109+
public State getState() {
110+
return switch (testExecutionResult.getStatus()) {
111+
case FAILED -> State.FAILED;
112+
case ABORTED -> State.SKIPPED;
113+
case SUCCESSFUL -> State.PASSED;
114+
};
115+
}
91116
}

core/deployment/src/main/java/io/quarkus/deployment/dev/testing/TestRunResults.java

+20-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import java.util.Map;
88

99
import io.quarkus.deployment.dev.ClassScanResult;
10+
import io.quarkus.dev.testing.results.TestResultInterface;
11+
import io.quarkus.dev.testing.results.TestRunResultsInterface;
1012

11-
public class TestRunResults {
13+
public class TestRunResults implements TestRunResultsInterface {
1214

1315
/**
1416
* The run id
@@ -28,7 +30,7 @@ public class TestRunResults {
2830
private final long started;
2931
private final long completed;
3032

31-
private final Map<String, TestClassResult> results;
33+
private final Map<String, ? extends TestClassResult> results;
3234
private final Map<String, TestClassResult> currentFailing = new HashMap<>();
3335
private final Map<String, TestClassResult> historicFailing = new HashMap<>();
3436
private final Map<String, TestClassResult> currentPassing = new HashMap<>();
@@ -58,9 +60,9 @@ public TestRunResults(long id, ClassScanResult trigger, boolean full, long start
5860
long currentFailedCount = 0;
5961
long currentSkippedCount = 0;
6062
for (Map.Entry<String, TestClassResult> i : results.entrySet()) {
61-
passedCount += i.getValue().getPassing().stream().filter(TestResult::isTest).count();
62-
failedCount += i.getValue().getFailing().stream().filter(TestResult::isTest).count();
63-
skippedCount += i.getValue().getSkipped().stream().filter(TestResult::isTest).count();
63+
passedCount += i.getValue().getPassing().stream().filter(TestResultInterface::isTest).count();
64+
failedCount += i.getValue().getFailing().stream().filter(TestResultInterface::isTest).count();
65+
skippedCount += i.getValue().getSkipped().stream().filter(TestResultInterface::isTest).count();
6466
currentPassedCount += i.getValue().getPassing().stream().filter(s -> s.isTest() && s.getRunId() == id).count();
6567
currentFailedCount += i.getValue().getFailing().stream().filter(s -> s.isTest() && s.getRunId() == id).count();
6668
currentSkippedCount += i.getValue().getSkipped().stream().filter(s -> s.isTest() && s.getRunId() == id).count();
@@ -98,6 +100,7 @@ public TestRunResults(long id, ClassScanResult trigger, boolean full, long start
98100
this.currentSkippedCount = currentSkippedCount;
99101
}
100102

103+
@Override
101104
public long getId() {
102105
return id;
103106
}
@@ -110,6 +113,7 @@ public boolean isFull() {
110113
return full;
111114
}
112115

116+
@Override
113117
public Map<String, TestClassResult> getResults() {
114118
return Collections.unmodifiableMap(results);
115119
}
@@ -130,14 +134,17 @@ public Map<String, TestClassResult> getHistoricPassing() {
130134
return historicPassing;
131135
}
132136

137+
@Override
133138
public long getStartedTime() {
134139
return started;
135140
}
136141

142+
@Override
137143
public long getCompletedTime() {
138144
return completed;
139145
}
140146

147+
@Override
141148
public long getTotalTime() {
142149
return completed - started;
143150
}
@@ -154,34 +161,42 @@ public List<TestClassResult> getSkipped() {
154161
return skipped;
155162
}
156163

164+
@Override
157165
public long getPassedCount() {
158166
return passedCount;
159167
}
160168

169+
@Override
161170
public long getFailedCount() {
162171
return failedCount;
163172
}
164173

174+
@Override
165175
public long getSkippedCount() {
166176
return skippedCount;
167177
}
168178

179+
@Override
169180
public long getCurrentPassedCount() {
170181
return currentPassedCount;
171182
}
172183

184+
@Override
173185
public long getCurrentFailedCount() {
174186
return currentFailedCount;
175187
}
176188

189+
@Override
177190
public long getCurrentSkippedCount() {
178191
return currentSkippedCount;
179192
}
180193

194+
@Override
181195
public long getTotalCount() {
182196
return getPassedCount() + getFailedCount() + getSkippedCount();
183197
}
184198

199+
@Override
185200
public long getCurrentTotalCount() {
186201
return getCurrentPassedCount() + getCurrentFailedCount() + getCurrentSkippedCount();
187202
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.quarkus.dev.testing.results;
2+
3+
import java.util.List;
4+
5+
public interface TestClassResultInterface extends Comparable<TestClassResultInterface> {
6+
7+
String getClassName();
8+
9+
List<? extends TestResultInterface> getResults();
10+
11+
@Override
12+
default int compareTo(TestClassResultInterface o) {
13+
return getClassName().compareTo(o.getClassName());
14+
}
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.quarkus.dev.testing.results;
2+
3+
import java.util.List;
4+
5+
public interface TestResultInterface {
6+
List<String> getLogOutput();
7+
8+
String getDisplayName();
9+
10+
String getTestClass();
11+
12+
List<String> getTags();
13+
14+
boolean isTest();
15+
16+
String getId();
17+
18+
long getRunId();
19+
20+
long getTime();
21+
22+
List<Throwable> getProblems();
23+
24+
boolean isReportable();
25+
26+
State getState();
27+
28+
enum State {
29+
PASSED,
30+
FAILED,
31+
SKIPPED
32+
}
33+
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.quarkus.dev.testing.results;
2+
3+
import java.util.Map;
4+
5+
public interface TestRunResultsInterface {
6+
long getId();
7+
8+
Map<String, ? extends TestClassResultInterface> getResults();
9+
10+
long getStartedTime();
11+
12+
long getCompletedTime();
13+
14+
long getTotalTime();
15+
16+
long getPassedCount();
17+
18+
long getFailedCount();
19+
20+
long getSkippedCount();
21+
22+
long getCurrentPassedCount();
23+
24+
long getCurrentFailedCount();
25+
26+
long getCurrentSkippedCount();
27+
28+
long getTotalCount();
29+
30+
long getCurrentTotalCount();
31+
}

extensions/vertx-http/deployment/src/main/java/io/quarkus/devui/deployment/menu/ContinuousTestingProcessor.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.quarkus.deployment.dev.testing.TestRunResults;
1717
import io.quarkus.deployment.dev.testing.TestSupport;
1818
import io.quarkus.dev.spi.DevModeType;
19+
import io.quarkus.dev.testing.results.TestRunResultsInterface;
1920
import io.quarkus.devui.deployment.InternalPageBuildItem;
2021
import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingJsonRPCService;
2122
import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingRecorder;
@@ -237,7 +238,7 @@ private void registerGetStatusMethod(LaunchModeBuildItem launchModeBuildItem, Bu
237238
}
238239

239240
private void registerGetResultsMethod(LaunchModeBuildItem launchModeBuildItem, BuildTimeActionBuildItem actions) {
240-
actions.addAction("getResults", ignored -> {
241+
actions.<TestRunResultsInterface> addAction("getResults", ignored -> {
241242
try {
242243
Optional<TestSupport> ts = TestSupport.instance();
243244
if (testsDisabled(launchModeBuildItem, ts)) {

0 commit comments

Comments
 (0)