Skip to content

Commit 28c788c

Browse files
committed
Fix: sourcesUnderTest can be reconfigured
1 parent 9c1d44b commit 28c788c

File tree

10 files changed

+78
-22
lines changed

10 files changed

+78
-22
lines changed

src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
import org.gradlex.javamodule.testing.internal.bridges.JavaModuleDependenciesBridge;
3131
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestCompileArgumentProvider;
3232
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestRuntimeArgumentProvider;
33+
import org.jspecify.annotations.NullMarked;
3334

3435
@SuppressWarnings("UnstableApiUsage")
36+
@NullMarked
3537
public abstract class JavaModuleTestingExtension {
3638
private static final Action<WhiteboxJvmTestSuite> NO_OP_ACTION = c -> {};
3739

@@ -251,7 +253,6 @@ private void configureJvmTestSuiteForWhitebox(
251253
.orElseGet(() -> {
252254
WhiteboxTestCompileArgumentProvider newProvider =
253255
new WhiteboxTestCompileArgumentProvider(
254-
sourcesUnderTest.getJava().getSrcDirs(),
255256
testSources.getJava().getSrcDirs(),
256257
moduleInfoParser,
257258
project.getObjects());
@@ -263,6 +264,7 @@ private void configureJvmTestSuiteForWhitebox(
263264
project.getObjects().newInstance(JavaCompileSetModulePathAction.class));
264265
return newProvider;
265266
});
267+
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
266268
argumentProvider.testRequires(
267269
JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources));
268270
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());
@@ -289,15 +291,15 @@ private void configureJvmTestSuiteForWhitebox(
289291
.orElseGet(() -> {
290292
WhiteboxTestRuntimeArgumentProvider newProvider =
291293
new WhiteboxTestRuntimeArgumentProvider(
292-
sourcesUnderTest.getJava().getSrcDirs(),
293294
testSources.getJava().getClassesDirectory(),
294-
sourcesUnderTest.getOutput().getResourcesDir(),
295295
testSources.getOutput().getResourcesDir(),
296296
moduleInfoParser,
297297
project.getObjects());
298298
test.getJvmArgumentProviders().add(newProvider);
299299
return newProvider;
300300
});
301+
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
302+
argumentProvider.setResourcesUnderTest(sourcesUnderTest.getOutput().getResourcesDir());
301303
argumentProvider.testRequires(
302304
JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources));
303305
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());

src/main/java/org/gradlex/javamodule/testing/TaskLockService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44
import org.gradle.api.services.BuildService;
55
import org.gradle.api.services.BuildServiceParameters;
6+
import org.jspecify.annotations.NullMarked;
67

78
/**
89
* No-op service that can serve as 'lock' to prevent multiple test tasks from running in parallel:
910
* usesService(gradle.sharedServices.registerIfAbsent(TaskLockService.NAME, TaskLockService::class) { maxParallelUsages = 1 })
1011
*/
12+
@NullMarked
1113
public abstract class TaskLockService implements BuildService<BuildServiceParameters.None> {
1214
public static String NAME = "taskLock";
1315
}

src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import org.gradle.api.provider.ListProperty;
55
import org.gradle.api.provider.Property;
66
import org.gradle.api.tasks.SourceSet;
7+
import org.jspecify.annotations.NullMarked;
78

9+
@NullMarked
810
public interface WhiteboxJvmTestSuite {
911

1012
/**

src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import org.gradle.api.file.RegularFile;
1010
import org.gradle.api.provider.Provider;
1111
import org.gradle.api.provider.ProviderFactory;
12+
import org.jspecify.annotations.NullMarked;
13+
import org.jspecify.annotations.Nullable;
1214

15+
@NullMarked
1316
public class ModuleInfoParser {
1417

1518
private final ProjectLayout layout;
@@ -20,6 +23,7 @@ public ModuleInfoParser(ProjectLayout layout, ProviderFactory providers) {
2023
this.providers = providers;
2124
}
2225

26+
@Nullable
2327
public String moduleName(Set<File> sourceFolders) {
2428
for (File folder : sourceFolders) {
2529
Provider<RegularFile> moduleInfoFile =
@@ -33,6 +37,7 @@ public String moduleName(Set<File> sourceFolders) {
3337
return null;
3438
}
3539

40+
@Nullable
3641
static String moduleName(String moduleInfoFileContent) {
3742
boolean inComment = false;
3843
boolean moduleKeywordFound = false;

src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoRequiresParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import java.util.ArrayList;
55
import java.util.Arrays;
66
import java.util.List;
7+
import org.jspecify.annotations.NullMarked;
78

9+
@NullMarked
810
public class ModuleInfoRequiresParser {
911
private static final String RUNTIME_KEYWORD = "/*runtime*/";
1012

src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@
77
import org.gradle.api.Project;
88
import org.gradle.api.provider.Provider;
99
import org.gradle.api.tasks.SourceSet;
10+
import org.jspecify.annotations.NullMarked;
11+
import org.jspecify.annotations.Nullable;
1012

13+
@NullMarked
1114
public class JavaModuleDependenciesBridge {
1215

16+
@Nullable
1317
public static Provider<?> create(Project project, String moduleName, SourceSet sourceSetWithModuleInfo) {
1418
Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies");
1519
if (javaModuleDependencies == null) {

src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,29 @@
1111
import org.gradle.api.provider.Provider;
1212
import org.gradle.process.CommandLineArgumentProvider;
1313
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
14+
import org.jspecify.annotations.NullMarked;
1415

16+
@NullMarked
1517
public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentProvider {
16-
private final Set<File> mainSourceFolders;
1718
private final Set<File> testSourceFolders;
1819
private final ModuleInfoParser moduleInfoParser;
1920

21+
@SuppressWarnings("NotNullFieldNotInitialized")
22+
private Set<File> mainSourceFolders;
23+
2024
private final ListProperty<String> allTestRequires;
2125

2226
public WhiteboxTestCompileArgumentProvider(
23-
Set<File> mainSourceFolders,
24-
Set<File> testSourceFolders,
25-
ModuleInfoParser moduleInfoParser,
26-
ObjectFactory objects) {
27-
this.mainSourceFolders = mainSourceFolders;
27+
Set<File> testSourceFolders, ModuleInfoParser moduleInfoParser, ObjectFactory objects) {
2828
this.testSourceFolders = testSourceFolders;
2929
this.moduleInfoParser = moduleInfoParser;
3030
this.allTestRequires = objects.listProperty(String.class);
3131
}
3232

33+
public void setMainSourceFolders(Set<File> mainSourceFolders) {
34+
this.mainSourceFolders = mainSourceFolders;
35+
}
36+
3337
public void testRequires(Provider<List<String>> testRequires) {
3438
allTestRequires.addAll(testRequires);
3539
}

src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,45 @@
1212
import org.gradle.api.provider.Provider;
1313
import org.gradle.process.CommandLineArgumentProvider;
1414
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
15+
import org.jspecify.annotations.NullMarked;
1516

17+
@NullMarked
1618
public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentProvider {
17-
private final Set<File> mainSourceFolders;
1819
private final Provider<Directory> testClassesFolders;
19-
private final File resourcesUnderTest;
2020
private final File testResources;
2121
private final ModuleInfoParser moduleInfoParser;
2222

23+
@SuppressWarnings("NotNullFieldNotInitialized")
24+
private Set<File> mainSourceFolders;
25+
26+
@SuppressWarnings("NotNullFieldNotInitialized")
27+
private File resourcesUnderTest;
28+
2329
private final ListProperty<String> allTestRequires;
2430
private final ListProperty<String> allTestOpensTo;
2531
private final ListProperty<String> allTestExportsTo;
2632

2733
public WhiteboxTestRuntimeArgumentProvider(
28-
Set<File> mainSourceFolders,
2934
Provider<Directory> testClassesFolders,
30-
File resourcesUnderTest,
3135
File testResources,
3236
ModuleInfoParser moduleInfoParser,
3337
ObjectFactory objects) {
34-
35-
this.mainSourceFolders = mainSourceFolders;
3638
this.testClassesFolders = testClassesFolders;
37-
this.resourcesUnderTest = resourcesUnderTest;
3839
this.testResources = testResources;
3940
this.moduleInfoParser = moduleInfoParser;
4041
this.allTestRequires = objects.listProperty(String.class);
4142
this.allTestOpensTo = objects.listProperty(String.class);
4243
this.allTestExportsTo = objects.listProperty(String.class);
4344
}
4445

46+
public void setMainSourceFolders(Set<File> mainSourceFolders) {
47+
this.mainSourceFolders = mainSourceFolders;
48+
}
49+
50+
public void setResourcesUnderTest(File resourcesUnderTest) {
51+
this.resourcesUnderTest = resourcesUnderTest;
52+
}
53+
4554
public void testRequires(Provider<List<String>> testRequires) {
4655
allTestRequires.addAll(testRequires);
4756
}

src/test/java/org/gradlex/javamodule/testing/test/CustomizationTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,36 @@ void can_customize_whitebox_test_suites_in_multiple_steps() {
3636
assertThat(testResult.getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
3737
}
3838

39+
@Test
40+
void can_change_sourcesUnderTest_of_whitebox_test_suite() {
41+
build.useTestFixturesPlugin();
42+
build.file("app/src/testFixtures/java/module-info.java")
43+
.writeText("""
44+
module org.example.fixtures {
45+
}
46+
""");
47+
build.file("app/src/testFixtures/java/org/example/app/Main.java")
48+
.writeText("""
49+
package org.example.app;
50+
public class Main {}
51+
""");
52+
build.appBuildFile.appendText(
53+
"""
54+
javaModuleTesting.whitebox(testing.suites["test"]) {
55+
sourcesUnderTest = sourceSets.testFixtures;
56+
requires.add("org.junit.jupiter.api")
57+
}
58+
""");
59+
60+
var result = build.runTests();
61+
var testResult = result.task(":app:test");
62+
63+
assertThat(result.getOutput()).contains("Main Module: org.example.fixtures");
64+
assertThat(result.getOutput()).contains("Test Module: org.example.fixtures");
65+
assertThat(testResult).isNotNull();
66+
assertThat(testResult.getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
67+
}
68+
3969
@Test
4070
void can_define_whitebox_test_suite_requires_in_moduleinfo_file() {
4171
build.appModuleInfoFile.writeText("""

src/test/java/org/gradlex/javamodule/testing/test/fixture/GradleBuild.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public GradleBuild(Path dir) {
7474
testLogging.showStandardStreams = true
7575
}
7676
tasks.withType<JavaCompile>().configureEach { options.release.set(11) }
77-
"""
77+
"""
7878
.formatted(launcherDependency));
7979
file("app/src/main/java/org/example/app/Main.java")
8080
.writeText(
@@ -151,15 +151,11 @@ public BuildResult fail() {
151151
}
152152

153153
public GradleRunner runner(String... args) {
154-
return runner(true, args);
155-
}
156-
157-
public GradleRunner runner(boolean projectIsolation, String... args) {
158154
boolean debugMode = ManagementFactory.getRuntimeMXBean()
159155
.getInputArguments()
160156
.toString()
161157
.contains("-agentlib:jdwp");
162-
List<String> latestFeaturesArgs = GRADLE_VERSION_UNDER_TEST != null || !projectIsolation
158+
List<String> latestFeaturesArgs = GRADLE_VERSION_UNDER_TEST != null || debugMode
163159
? List.of()
164160
: List.of(
165161
"--configuration-cache",

0 commit comments

Comments
 (0)