Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@
import org.gradlex.javamodule.testing.internal.bridges.JavaModuleDependenciesBridge;
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestCompileArgumentProvider;
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestRuntimeArgumentProvider;
import org.jspecify.annotations.NullMarked;

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

Expand Down Expand Up @@ -251,7 +253,6 @@ private void configureJvmTestSuiteForWhitebox(
.orElseGet(() -> {
WhiteboxTestCompileArgumentProvider newProvider =
new WhiteboxTestCompileArgumentProvider(
sourcesUnderTest.getJava().getSrcDirs(),
testSources.getJava().getSrcDirs(),
moduleInfoParser,
project.getObjects());
Expand All @@ -263,6 +264,7 @@ private void configureJvmTestSuiteForWhitebox(
project.getObjects().newInstance(JavaCompileSetModulePathAction.class));
return newProvider;
});
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
argumentProvider.testRequires(
JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources));
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());
Expand All @@ -289,15 +291,15 @@ private void configureJvmTestSuiteForWhitebox(
.orElseGet(() -> {
WhiteboxTestRuntimeArgumentProvider newProvider =
new WhiteboxTestRuntimeArgumentProvider(
sourcesUnderTest.getJava().getSrcDirs(),
testSources.getJava().getClassesDirectory(),
sourcesUnderTest.getOutput().getResourcesDir(),
testSources.getOutput().getResourcesDir(),
moduleInfoParser,
project.getObjects());
test.getJvmArgumentProviders().add(newProvider);
return newProvider;
});
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
argumentProvider.setResourcesUnderTest(sourcesUnderTest.getOutput().getResourcesDir());
argumentProvider.testRequires(
JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources));
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@

import org.gradle.api.services.BuildService;
import org.gradle.api.services.BuildServiceParameters;
import org.jspecify.annotations.NullMarked;

/**
* No-op service that can serve as 'lock' to prevent multiple test tasks from running in parallel:
* usesService(gradle.sharedServices.registerIfAbsent(TaskLockService.NAME, TaskLockService::class) { maxParallelUsages = 1 })
*/
@NullMarked
public abstract class TaskLockService implements BuildService<BuildServiceParameters.None> {
public static String NAME = "taskLock";
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.tasks.SourceSet;
import org.jspecify.annotations.NullMarked;

@NullMarked
public interface WhiteboxJvmTestSuite {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
import org.gradle.api.file.RegularFile;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.ProviderFactory;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

@NullMarked
public class ModuleInfoParser {

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

@Nullable
public String moduleName(Set<File> sourceFolders) {
for (File folder : sourceFolders) {
Provider<RegularFile> moduleInfoFile =
Expand All @@ -33,6 +37,7 @@ public String moduleName(Set<File> sourceFolders) {
return null;
}

@Nullable
static String moduleName(String moduleInfoFileContent) {
boolean inComment = false;
boolean moduleKeywordFound = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.jspecify.annotations.NullMarked;

@NullMarked
public class ModuleInfoRequiresParser {
private static final String RUNTIME_KEYWORD = "/*runtime*/";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@
import org.gradle.api.Project;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

@NullMarked
public class JavaModuleDependenciesBridge {

@Nullable
public static Provider<?> create(Project project, String moduleName, SourceSet sourceSetWithModuleInfo) {
Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies");
if (javaModuleDependencies == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,29 @@
import org.gradle.api.provider.Provider;
import org.gradle.process.CommandLineArgumentProvider;
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
import org.jspecify.annotations.NullMarked;

@NullMarked
public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentProvider {
private final Set<File> mainSourceFolders;
private final Set<File> testSourceFolders;
private final ModuleInfoParser moduleInfoParser;

@SuppressWarnings("NotNullFieldNotInitialized")
private Set<File> mainSourceFolders;

private final ListProperty<String> allTestRequires;

public WhiteboxTestCompileArgumentProvider(
Set<File> mainSourceFolders,
Set<File> testSourceFolders,
ModuleInfoParser moduleInfoParser,
ObjectFactory objects) {
this.mainSourceFolders = mainSourceFolders;
Set<File> testSourceFolders, ModuleInfoParser moduleInfoParser, ObjectFactory objects) {
this.testSourceFolders = testSourceFolders;
this.moduleInfoParser = moduleInfoParser;
this.allTestRequires = objects.listProperty(String.class);
}

public void setMainSourceFolders(Set<File> mainSourceFolders) {
this.mainSourceFolders = mainSourceFolders;
}

public void testRequires(Provider<List<String>> testRequires) {
allTestRequires.addAll(testRequires);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,45 @@
import org.gradle.api.provider.Provider;
import org.gradle.process.CommandLineArgumentProvider;
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
import org.jspecify.annotations.NullMarked;

@NullMarked
public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentProvider {
private final Set<File> mainSourceFolders;
private final Provider<Directory> testClassesFolders;
private final File resourcesUnderTest;
private final File testResources;
private final ModuleInfoParser moduleInfoParser;

@SuppressWarnings("NotNullFieldNotInitialized")
private Set<File> mainSourceFolders;

@SuppressWarnings("NotNullFieldNotInitialized")
private File resourcesUnderTest;

private final ListProperty<String> allTestRequires;
private final ListProperty<String> allTestOpensTo;
private final ListProperty<String> allTestExportsTo;

public WhiteboxTestRuntimeArgumentProvider(
Set<File> mainSourceFolders,
Provider<Directory> testClassesFolders,
File resourcesUnderTest,
File testResources,
ModuleInfoParser moduleInfoParser,
ObjectFactory objects) {

this.mainSourceFolders = mainSourceFolders;
this.testClassesFolders = testClassesFolders;
this.resourcesUnderTest = resourcesUnderTest;
this.testResources = testResources;
this.moduleInfoParser = moduleInfoParser;
this.allTestRequires = objects.listProperty(String.class);
this.allTestOpensTo = objects.listProperty(String.class);
this.allTestExportsTo = objects.listProperty(String.class);
}

public void setMainSourceFolders(Set<File> mainSourceFolders) {
this.mainSourceFolders = mainSourceFolders;
}

public void setResourcesUnderTest(File resourcesUnderTest) {
this.resourcesUnderTest = resourcesUnderTest;
}

public void testRequires(Provider<List<String>> testRequires) {
allTestRequires.addAll(testRequires);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,36 @@ void can_customize_whitebox_test_suites_in_multiple_steps() {
assertThat(testResult.getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
}

@Test
void can_change_sourcesUnderTest_of_whitebox_test_suite() {
build.useTestFixturesPlugin();
build.file("app/src/testFixtures/java/module-info.java")
.writeText("""
module org.example.fixtures {
}
""");
build.file("app/src/testFixtures/java/org/example/app/Main.java")
.writeText("""
package org.example.app;
public class Main {}
""");
build.appBuildFile.appendText(
"""
javaModuleTesting.whitebox(testing.suites["test"]) {
sourcesUnderTest.set(sourceSets.testFixtures);
requires.add("org.junit.jupiter.api")
}
""");

var result = build.runTests();
var testResult = result.task(":app:test");

assertThat(result.getOutput()).contains("Main Module: org.example.fixtures");
assertThat(result.getOutput()).contains("Test Module: org.example.fixtures");
assertThat(testResult).isNotNull();
assertThat(testResult.getOutcome()).isEqualTo(TaskOutcome.SUCCESS);
}

@Test
void can_define_whitebox_test_suite_requires_in_moduleinfo_file() {
build.appModuleInfoFile.writeText("""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public GradleBuild(Path dir) {
testLogging.showStandardStreams = true
}
tasks.withType<JavaCompile>().configureEach { options.release.set(11) }
"""
"""
.formatted(launcherDependency));
file("app/src/main/java/org/example/app/Main.java")
.writeText(
Expand Down Expand Up @@ -151,15 +151,11 @@ public BuildResult fail() {
}

public GradleRunner runner(String... args) {
return runner(true, args);
}

public GradleRunner runner(boolean projectIsolation, String... args) {
boolean debugMode = ManagementFactory.getRuntimeMXBean()
.getInputArguments()
.toString()
.contains("-agentlib:jdwp");
List<String> latestFeaturesArgs = GRADLE_VERSION_UNDER_TEST != null || !projectIsolation
List<String> latestFeaturesArgs = GRADLE_VERSION_UNDER_TEST != null || debugMode
? List.of()
: List.of(
"--configuration-cache",
Expand Down
Loading