Skip to content

Commit 1e47b66

Browse files
committed
Write all output files to same output directory
1 parent 2e4535b commit 1e47b66

File tree

37 files changed

+258
-122
lines changed

37 files changed

+258
-122
lines changed

documentation/documentation.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ tasks {
147147

148148
val consoleLauncherTestReportsDir = project.layout.buildDirectory.dir("console-launcher-test-results")
149149
val consoleLauncherTestEventXmlFiles =
150-
files(consoleLauncherTestReportsDir.map { it.asFileTree.matching { include("junit-platform-events-*.xml") } })
150+
files(consoleLauncherTestReportsDir.map { it.asFileTree.matching { include("junit-*/open-test-report.xml") } })
151151

152152
val consoleLauncherTest by registering(RunConsoleLauncher::class) {
153153
args.addAll("execute")

gradle/plugins/common/src/main/kotlin/junitbuild.testing-conventions.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ val generateOpenTestHtmlReport by tasks.registering(JavaExec::class) {
2626
eventXmlFiles.from(tasks.withType<Test>().map {
2727
objects.fileTree()
2828
.from(it.reports.junitXml.outputLocation)
29-
.include("junit-platform-events-*.xml")
29+
.include("junit-*/open-test-report.xml")
3030
})
3131
outputLocation = layout.buildDirectory.file("reports/open-test-report.html")
3232
}
@@ -117,7 +117,7 @@ tasks.withType<Test>().configureEach {
117117
)
118118
}
119119

120-
val reportFiles = objects.fileTree().from(reports.junitXml.outputLocation).matching { include("junit-platform-events-*.xml") }
120+
val reportFiles = objects.fileTree().from(reports.junitXml.outputLocation).matching { include("junit-*/open-test-report.xml") }
121121
doFirst {
122122
reportFiles.files.forEach {
123123
Files.delete(it.toPath())

junit-platform-engine/src/main/java/org/junit/platform/engine/reporting/OutputDirectoryProvider.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,17 @@
1212

1313
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
1414

15-
import java.io.Closeable;
1615
import java.io.IOException;
1716
import java.nio.file.Path;
1817

1918
import org.apiguardian.api.API;
2019
import org.junit.platform.engine.TestDescriptor;
2120

2221
@API(status = EXPERIMENTAL, since = "1.12")
23-
public interface OutputDirectoryProvider extends Closeable {
22+
public interface OutputDirectoryProvider {
23+
24+
Path getRootDirectory();
2425

2526
Path createOutputDirectory(TestDescriptor testDescriptor) throws IOException;
2627

27-
@Override
28-
default void close() throws IOException {
29-
// do nothing
30-
}
3128
}

junit-platform-launcher/junit-platform-launcher.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ dependencies {
1111

1212
compileOnlyApi(libs.apiguardian)
1313

14-
testFixturesImplementation(libs.jimfs)
15-
1614
osgiVerification(projects.junitJupiterEngine)
1715
}
1816

junit-platform-launcher/src/main/java/org/junit/platform/launcher/TestPlan.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.junit.platform.engine.ConfigurationParameters;
3535
import org.junit.platform.engine.TestDescriptor;
3636
import org.junit.platform.engine.UniqueId;
37+
import org.junit.platform.engine.reporting.OutputDirectoryProvider;
3738

3839
/**
3940
* {@code TestPlan} describes the tree of tests and containers as discovered
@@ -70,6 +71,7 @@ public class TestPlan {
7071
private final boolean containsTests;
7172

7273
private final ConfigurationParameters configurationParameters;
74+
private final OutputDirectoryProvider outputDirectoryProvider;
7375

7476
/**
7577
* Construct a new {@code TestPlan} from the supplied collection of
@@ -82,24 +84,28 @@ public class TestPlan {
8284
* plan should be created; never {@code null}
8385
* @param configurationParameters the {@code ConfigurationParameters} for
8486
* this test plan; never {@code null}
87+
* @param outputDirectoryProvider the {@code OutputDirectoryProvider} for
88+
* this test plan; never {@code null}
8589
* @return a new test plan
8690
*/
8791
@API(status = INTERNAL, since = "1.0")
8892
public static TestPlan from(Collection<TestDescriptor> engineDescriptors,
89-
ConfigurationParameters configurationParameters) {
93+
ConfigurationParameters configurationParameters, OutputDirectoryProvider outputDirectoryProvider) {
9094
Preconditions.notNull(engineDescriptors, "Cannot create TestPlan from a null collection of TestDescriptors");
9195
Preconditions.notNull(configurationParameters, "Cannot create TestPlan from null ConfigurationParameters");
9296
TestPlan testPlan = new TestPlan(engineDescriptors.stream().anyMatch(TestDescriptor::containsTests),
93-
configurationParameters);
97+
configurationParameters, outputDirectoryProvider);
9498
TestDescriptor.Visitor visitor = descriptor -> testPlan.addInternal(TestIdentifier.from(descriptor));
9599
engineDescriptors.forEach(engineDescriptor -> engineDescriptor.accept(visitor));
96100
return testPlan;
97101
}
98102

99103
@API(status = INTERNAL, since = "1.4")
100-
protected TestPlan(boolean containsTests, ConfigurationParameters configurationParameters) {
104+
protected TestPlan(boolean containsTests, ConfigurationParameters configurationParameters,
105+
OutputDirectoryProvider outputDirectoryProvider) {
101106
this.containsTests = containsTests;
102107
this.configurationParameters = configurationParameters;
108+
this.outputDirectoryProvider = outputDirectoryProvider;
103109
}
104110

105111
/**
@@ -291,6 +297,10 @@ public ConfigurationParameters getConfigurationParameters() {
291297
return this.configurationParameters;
292298
}
293299

300+
public OutputDirectoryProvider getOutputDirectoryProvider() {
301+
return this.outputDirectoryProvider;
302+
}
303+
294304
/**
295305
* Accept the supplied {@link Visitor} for a depth-first traversal of the
296306
* test plan.

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultDiscoveryRequest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import static java.util.Collections.unmodifiableList;
1414
import static java.util.stream.Collectors.toList;
15-
import static org.junit.platform.launcher.LauncherConstants.OUTPUT_DIR_PROPERTY_NAME;
1615

1716
import java.util.List;
1817

@@ -26,7 +25,6 @@
2625
import org.junit.platform.launcher.LauncherDiscoveryListener;
2726
import org.junit.platform.launcher.LauncherDiscoveryRequest;
2827
import org.junit.platform.launcher.PostDiscoveryFilter;
29-
import org.junit.platform.launcher.listeners.OutputDir;
3028

3129
/**
3230
* {@code DefaultDiscoveryRequest} is the default implementation of the
@@ -54,15 +52,19 @@ final class DefaultDiscoveryRequest implements LauncherDiscoveryRequest {
5452
// Listener for test discovery that may abort on errors.
5553
private final LauncherDiscoveryListener discoveryListener;
5654

55+
private final OutputDirectoryProvider outputDirectoryProvider;
56+
5757
DefaultDiscoveryRequest(List<DiscoverySelector> selectors, List<EngineFilter> engineFilters,
5858
List<DiscoveryFilter<?>> discoveryFilters, List<PostDiscoveryFilter> postDiscoveryFilters,
59-
LauncherConfigurationParameters configurationParameters, LauncherDiscoveryListener discoveryListener) {
59+
LauncherConfigurationParameters configurationParameters, LauncherDiscoveryListener discoveryListener,
60+
OutputDirectoryProvider outputDirectoryProvider) {
6061
this.selectors = selectors;
6162
this.engineFilters = engineFilters;
6263
this.discoveryFilters = discoveryFilters;
6364
this.postDiscoveryFilters = postDiscoveryFilters;
6465
this.configurationParameters = configurationParameters;
6566
this.discoveryListener = discoveryListener;
67+
this.outputDirectoryProvider = outputDirectoryProvider;
6668
}
6769

6870
@Override
@@ -94,14 +96,11 @@ public ConfigurationParameters getConfigurationParameters() {
9496

9597
@Override
9698
public LauncherDiscoveryListener getDiscoveryListener() {
97-
return discoveryListener;
99+
return this.discoveryListener;
98100
}
99101

100102
@Override
101103
public OutputDirectoryProvider getOutputDirectoryProvider() {
102-
return new HierarchicalOutputDirectoryProvider(() -> {
103-
OutputDir outputDir = OutputDir.create(configurationParameters.get(OUTPUT_DIR_PROPERTY_NAME));
104-
return outputDir.createDir("junit");
105-
});
104+
return this.outputDirectoryProvider;
106105
}
107106
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineDiscoveryOrchestrator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public EngineDiscoveryOrchestrator(Iterable<TestEngine> testEngines,
7676
*/
7777
public LauncherDiscoveryResult discover(LauncherDiscoveryRequest request, Phase phase) {
7878
Map<TestEngine, TestDescriptor> result = discover(request, phase, UniqueId::forEngine);
79-
return new LauncherDiscoveryResult(result, request.getConfigurationParameters());
79+
return new LauncherDiscoveryResult(result, request.getConfigurationParameters(),
80+
request.getOutputDirectoryProvider());
8081
}
8182

8283
/**
@@ -95,7 +96,8 @@ public LauncherDiscoveryResult discover(LauncherDiscoveryRequest request, Phase
9596
*/
9697
public LauncherDiscoveryResult discover(LauncherDiscoveryRequest request, Phase phase, UniqueId parentId) {
9798
Map<TestEngine, TestDescriptor> testEngines = discover(request, phase, parentId::appendEngine);
98-
LauncherDiscoveryResult result = new LauncherDiscoveryResult(testEngines, request.getConfigurationParameters());
99+
LauncherDiscoveryResult result = new LauncherDiscoveryResult(testEngines, request.getConfigurationParameters(),
100+
request.getOutputDirectoryProvider());
99101
return result.withRetainedEngines(TestDescriptor::containsTests);
100102
}
101103

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/HierarchicalOutputDirectoryProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class HierarchicalOutputDirectoryProvider implements OutputDirectoryProvider {
3333
private static final char REPLACEMENT = '_';
3434

3535
private final Supplier<Path> rootDirSupplier;
36-
private Path rootDir;
36+
private volatile Path rootDir;
3737

3838
HierarchicalOutputDirectoryProvider(Supplier<Path> rootDirSupplier) {
3939
this.rootDirSupplier = rootDirSupplier;
@@ -48,10 +48,11 @@ public Path createOutputDirectory(TestDescriptor testDescriptor) throws IOExcept
4848
.map(Segment::getValue) //
4949
.map(HierarchicalOutputDirectoryProvider::sanitizeName).map(Paths::get) //
5050
.reduce(Paths.get(firstSegment.getValue()), Path::resolve);
51-
return Files.createDirectories(resolveRootDir().resolve(relativePath));
51+
return Files.createDirectories(getRootDirectory().resolve(relativePath));
5252
}
5353

54-
private synchronized Path resolveRootDir() {
54+
@Override
55+
public synchronized Path getRootDirectory() {
5556
if (rootDir == null) {
5657
rootDir = rootDirSupplier.get();
5758
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/InternalTestPlan.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ class InternalTestPlan extends TestPlan {
3131

3232
static InternalTestPlan from(LauncherDiscoveryResult discoveryResult) {
3333
TestPlan delegate = TestPlan.from(discoveryResult.getEngineTestDescriptors(),
34-
discoveryResult.getConfigurationParameters());
34+
discoveryResult.getConfigurationParameters(), discoveryResult.getOutputDirectoryProvider());
3535
return new InternalTestPlan(discoveryResult, delegate);
3636
}
3737

3838
private InternalTestPlan(LauncherDiscoveryResult discoveryResult, TestPlan delegate) {
39-
super(delegate.containsTests(), delegate.getConfigurationParameters());
39+
super(delegate.containsTests(), delegate.getConfigurationParameters(), delegate.getOutputDirectoryProvider());
4040
this.discoveryResult = discoveryResult;
4141
this.delegate = delegate;
4242
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherDiscoveryRequestBuilder.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import static org.apiguardian.api.API.Status.DEPRECATED;
1414
import static org.apiguardian.api.API.Status.STABLE;
15+
import static org.junit.platform.launcher.LauncherConstants.OUTPUT_DIR_PROPERTY_NAME;
1516

1617
import java.util.ArrayList;
1718
import java.util.Arrays;
@@ -27,11 +28,13 @@
2728
import org.junit.platform.engine.DiscoveryFilter;
2829
import org.junit.platform.engine.DiscoverySelector;
2930
import org.junit.platform.engine.Filter;
31+
import org.junit.platform.engine.reporting.OutputDirectoryProvider;
3032
import org.junit.platform.launcher.EngineFilter;
3133
import org.junit.platform.launcher.LauncherDiscoveryListener;
3234
import org.junit.platform.launcher.LauncherDiscoveryRequest;
3335
import org.junit.platform.launcher.PostDiscoveryFilter;
3436
import org.junit.platform.launcher.core.LauncherConfigurationParameters.Builder;
37+
import org.junit.platform.launcher.listeners.OutputDir;
3538
import org.junit.platform.launcher.listeners.discovery.LauncherDiscoveryListeners;
3639

3740
/**
@@ -107,6 +110,7 @@ public final class LauncherDiscoveryRequestBuilder {
107110
private final List<LauncherDiscoveryListener> discoveryListeners = new ArrayList<>();
108111
private boolean implicitConfigurationParametersEnabled = true;
109112
private ConfigurationParameters parentConfigurationParameters;
113+
private OutputDirectoryProvider outputDirectoryProvider;
110114

111115
/**
112116
* Create a new {@code LauncherDiscoveryRequestBuilder}.
@@ -283,6 +287,12 @@ public LauncherDiscoveryRequestBuilder listeners(LauncherDiscoveryListener... li
283287
return this;
284288
}
285289

290+
public LauncherDiscoveryRequestBuilder outputDirectoryProvider(OutputDirectoryProvider outputDirectoryProvider) {
291+
this.outputDirectoryProvider = Preconditions.notNull(outputDirectoryProvider,
292+
"outputDirectoryProvider must not be null");
293+
return this;
294+
}
295+
286296
private void storeFilter(Filter<?> filter) {
287297
if (filter instanceof EngineFilter) {
288298
this.engineFilters.add((EngineFilter) filter);
@@ -307,8 +317,20 @@ else if (filter instanceof DiscoveryFilter<?>) {
307317
public LauncherDiscoveryRequest build() {
308318
LauncherConfigurationParameters launcherConfigurationParameters = buildLauncherConfigurationParameters();
309319
LauncherDiscoveryListener discoveryListener = getLauncherDiscoveryListener(launcherConfigurationParameters);
320+
OutputDirectoryProvider outputDirectoryProvider = getOutputDirectoryProvider(launcherConfigurationParameters);
310321
return new DefaultDiscoveryRequest(this.selectors, this.engineFilters, this.discoveryFilters,
311-
this.postDiscoveryFilters, launcherConfigurationParameters, discoveryListener);
322+
this.postDiscoveryFilters, launcherConfigurationParameters, discoveryListener, outputDirectoryProvider);
323+
}
324+
325+
private OutputDirectoryProvider getOutputDirectoryProvider(
326+
LauncherConfigurationParameters configurationParameters) {
327+
if (this.outputDirectoryProvider != null) {
328+
return this.outputDirectoryProvider;
329+
}
330+
return new HierarchicalOutputDirectoryProvider(() -> {
331+
OutputDir outputDir = OutputDir.create(configurationParameters.get(OUTPUT_DIR_PROPERTY_NAME));
332+
return outputDir.createDir("junit");
333+
});
312334
}
313335

314336
private LauncherConfigurationParameters buildLauncherConfigurationParameters() {

0 commit comments

Comments
 (0)