Skip to content

Commit f4725bf

Browse files
committed
Remove current extendsFrom and cleanup code
1 parent b7bf6f2 commit f4725bf

File tree

3 files changed

+67
-70
lines changed

3 files changed

+67
-70
lines changed

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

Lines changed: 57 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33

44
import java.io.File;
55
import java.util.Collections;
6+
import java.util.HashMap;
67
import java.util.List;
8+
import java.util.Map;
79
import java.util.stream.Collectors;
810
import javax.inject.Inject;
911
import org.gradle.api.Action;
1012
import org.gradle.api.Describable;
1113
import org.gradle.api.Project;
12-
import org.gradle.api.artifacts.Configuration;
1314
import org.gradle.api.artifacts.ConfigurationContainer;
1415
import org.gradle.api.artifacts.dsl.DependencyHandler;
1516
import org.gradle.api.file.RegularFile;
@@ -39,6 +40,9 @@ public abstract class JavaModuleTestingExtension {
3940

4041
private final Project project;
4142

43+
// for late 'extendsFrom' configuration
44+
private final Map<SourceSet, SourceSet> whiteboxOrClasspathTestSuites = new HashMap<>();
45+
4246
@Inject
4347
public JavaModuleTestingExtension(Project project) {
4448
this.project = project;
@@ -148,6 +152,8 @@ public void whitebox(TestSuite jvmTestSuite, Action<WhiteboxJvmTestSuite> conf)
148152
.convention(project.getExtensions()
149153
.getByType(SourceSetContainer.class)
150154
.getByName(SourceSet.MAIN_SOURCE_SET_NAME));
155+
156+
// Improve: requiresFromModuleInfo is done multiple times when 'whitebox' is called multiple times
151157
whiteboxJvmTestSuite
152158
.getRequires()
153159
.addAll(requiresFromModuleInfo(
@@ -156,6 +162,7 @@ public void whitebox(TestSuite jvmTestSuite, Action<WhiteboxJvmTestSuite> conf)
156162
.getRequiresRuntime()
157163
.addAll(requiresFromModuleInfo(
158164
(JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite.getSourcesUnderTest(), true));
165+
159166
conf.execute(whiteboxJvmTestSuite);
160167
configureJvmTestSuiteForWhitebox((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite);
161168
}
@@ -224,24 +231,17 @@ private void configureJvmTestSuiteForBlackbox(JvmTestSuite jvmTestSuite) {
224231
private void configureJvmTestSuiteForWhitebox(
225232
JvmTestSuite jvmTestSuite, WhiteboxJvmTestSuite whiteboxJvmTestSuite) {
226233
ConfigurationContainer configurations = project.getConfigurations();
227-
DependencyHandler dependencies = project.getDependencies();
228234
TaskContainer tasks = project.getTasks();
229235
ModuleInfoParser moduleInfoParser = new ModuleInfoParser(project.getLayout(), project.getProviders());
230236

231237
SourceSet testSources = jvmTestSuite.getSources();
238+
SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get();
239+
whiteboxOrClasspathTestSuites.put(testSources, sourcesUnderTest);
240+
232241
JavaModuleDependenciesBridge.addRequiresRuntimeSupport(
233242
project, whiteboxJvmTestSuite.getSourcesUnderTest().get(), jvmTestSuite.getSources());
234243

235244
tasks.named(testSources.getCompileJavaTaskName(), JavaCompile.class, compileJava -> {
236-
SourceSet sourcesUnderTest =
237-
whiteboxJvmTestSuite.getSourcesUnderTest().get();
238-
239-
Configuration compileOnly = configurations.getByName(sourcesUnderTest.getCompileOnlyConfigurationName());
240-
Configuration testCompileOnly = configurations.getByName(testSources.getCompileOnlyConfigurationName());
241-
if (!testCompileOnly.getExtendsFrom().contains(compileOnly)) {
242-
testCompileOnly.extendsFrom(compileOnly);
243-
}
244-
245245
compileJava.setClasspath(sourcesUnderTest
246246
.getOutput()
247247
.plus(configurations.getByName(testSources.getCompileClasspathConfigurationName())));
@@ -250,29 +250,12 @@ private void configureJvmTestSuiteForWhitebox(
250250
compileJava.getOptions().getCompilerArgumentProviders().stream()
251251
.filter(p -> p instanceof WhiteboxTestCompileArgumentProvider)
252252
.findFirst()
253-
.orElseGet(() -> {
254-
WhiteboxTestCompileArgumentProvider newProvider =
255-
new WhiteboxTestCompileArgumentProvider(
256-
testSources.getJava().getSrcDirs(),
257-
moduleInfoParser,
258-
project.getObjects());
259-
compileJava
260-
.getOptions()
261-
.getCompilerArgumentProviders()
262-
.add(newProvider);
263-
compileJava.doFirst(
264-
project.getObjects().newInstance(JavaCompileSetModulePathAction.class));
265-
return newProvider;
266-
});
253+
.orElseGet(() -> initCompileArgProvider(compileJava, testSources, moduleInfoParser));
267254
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
268-
argumentProvider.testRequires(
269-
JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources));
270255
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());
271256
});
272257

273258
tasks.named(testSources.getName(), Test.class, test -> {
274-
SourceSet sourcesUnderTest =
275-
whiteboxJvmTestSuite.getSourcesUnderTest().get();
276259
test.setClasspath(configurations
277260
.getByName(testSources.getRuntimeClasspathConfigurationName())
278261
.plus(sourcesUnderTest.getOutput())
@@ -288,49 +271,63 @@ private void configureJvmTestSuiteForWhitebox(
288271
(WhiteboxTestRuntimeArgumentProvider) test.getJvmArgumentProviders().stream()
289272
.filter(p -> p instanceof WhiteboxTestRuntimeArgumentProvider)
290273
.findFirst()
291-
.orElseGet(() -> {
292-
WhiteboxTestRuntimeArgumentProvider newProvider =
293-
new WhiteboxTestRuntimeArgumentProvider(
294-
testSources.getJava().getClassesDirectory(),
295-
testSources.getOutput().getResourcesDir(),
296-
moduleInfoParser,
297-
project.getObjects());
298-
test.getJvmArgumentProviders().add(newProvider);
299-
return newProvider;
300-
});
274+
.orElseGet(() -> initRuntimeArgProvider(test, testSources, moduleInfoParser));
301275
argumentProvider.setMainSourceFolders(sourcesUnderTest.getJava().getSrcDirs());
302276
argumentProvider.setResourcesUnderTest(sourcesUnderTest.getOutput().getResourcesDir());
303-
argumentProvider.testRequires(
304-
JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources));
305277
argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires());
306-
argumentProvider.testOpensTo(JavaModuleDependenciesBridge.getOpensToModules(project, testSources));
307278
argumentProvider.testOpensTo(whiteboxJvmTestSuite.getOpensTo());
308-
argumentProvider.testExportsTo(JavaModuleDependenciesBridge.getExportsToModules(project, testSources));
309279
argumentProvider.testExportsTo(whiteboxJvmTestSuite.getExportsTo());
310280
});
311281

312-
Configuration implementation = configurations.getByName(testSources.getImplementationConfigurationName());
313-
implementation.withDependencies(d -> {
314-
for (String requiresModuleName : whiteboxJvmTestSuite.getRequires().get()) {
315-
Provider<?> dependency = JavaModuleDependenciesBridge.create(
316-
project,
317-
requiresModuleName,
318-
whiteboxJvmTestSuite.getSourcesUnderTest().get());
319-
if (dependency != null) {
320-
dependencies.addProvider(implementation.getName(), dependency);
321-
}
322-
}
323-
});
324-
Configuration runtimeOnly = configurations.getByName(testSources.getRuntimeOnlyConfigurationName());
325-
runtimeOnly.withDependencies(d -> {
326-
for (String requiresModuleName :
327-
whiteboxJvmTestSuite.getRequiresRuntime().get()) {
282+
addDependencyForRequires(
283+
whiteboxJvmTestSuite,
284+
project,
285+
testSources.getImplementationConfigurationName(),
286+
whiteboxJvmTestSuite.getRequires());
287+
addDependencyForRequires(
288+
whiteboxJvmTestSuite,
289+
project,
290+
testSources.getRuntimeOnlyConfigurationName(),
291+
whiteboxJvmTestSuite.getRequiresRuntime());
292+
}
293+
294+
private WhiteboxTestCompileArgumentProvider initCompileArgProvider(
295+
JavaCompile compileJava, SourceSet testSources, ModuleInfoParser moduleInfoParser) {
296+
WhiteboxTestCompileArgumentProvider newProvider = new WhiteboxTestCompileArgumentProvider(
297+
testSources.getJava().getSrcDirs(), moduleInfoParser, project.getObjects());
298+
newProvider.testRequires(JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources));
299+
compileJava.getOptions().getCompilerArgumentProviders().add(newProvider);
300+
compileJava.doFirst(project.getObjects().newInstance(JavaCompileSetModulePathAction.class));
301+
return newProvider;
302+
}
303+
304+
private WhiteboxTestRuntimeArgumentProvider initRuntimeArgProvider(
305+
Test test, SourceSet testSources, ModuleInfoParser moduleInfoParser) {
306+
WhiteboxTestRuntimeArgumentProvider newProvider = new WhiteboxTestRuntimeArgumentProvider(
307+
testSources.getJava().getClassesDirectory(),
308+
testSources.getOutput().getResourcesDir(),
309+
moduleInfoParser,
310+
project.getObjects());
311+
newProvider.testRequires(JavaModuleDependenciesBridge.getRuntimeClasspathModules(project, testSources));
312+
newProvider.testOpensTo(JavaModuleDependenciesBridge.getOpensToModules(project, testSources));
313+
newProvider.testExportsTo(JavaModuleDependenciesBridge.getExportsToModules(project, testSources));
314+
test.getJvmArgumentProviders().add(newProvider);
315+
return newProvider;
316+
}
317+
318+
private void addDependencyForRequires(
319+
WhiteboxJvmTestSuite whiteboxJvmTestSuite, String scope, Provider<List<String>> requires) {
320+
ConfigurationContainer configurations = project.getConfigurations();
321+
DependencyHandler dependencies = project.getDependencies();
322+
323+
configurations.getByName(scope).withDependencies(d -> {
324+
for (String requiresModuleName : requires.get()) {
328325
Provider<?> dependency = JavaModuleDependenciesBridge.create(
329326
project,
330327
requiresModuleName,
331328
whiteboxJvmTestSuite.getSourcesUnderTest().get());
332329
if (dependency != null) {
333-
dependencies.addProvider(runtimeOnly.getName(), dependency);
330+
dependencies.addProvider(scope, dependency);
334331
}
335332
}
336333
});

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import java.util.Set;
88
import java.util.stream.Collectors;
99
import org.gradle.api.model.ObjectFactory;
10-
import org.gradle.api.provider.ListProperty;
1110
import org.gradle.api.provider.Provider;
11+
import org.gradle.api.provider.SetProperty;
1212
import org.gradle.process.CommandLineArgumentProvider;
1313
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
1414
import org.jspecify.annotations.NullMarked;
@@ -21,13 +21,13 @@ public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentP
2121
@SuppressWarnings("NotNullFieldNotInitialized")
2222
private Set<File> mainSourceFolders;
2323

24-
private final ListProperty<String> allTestRequires;
24+
private final SetProperty<String> allTestRequires;
2525

2626
public WhiteboxTestCompileArgumentProvider(
2727
Set<File> testSourceFolders, ModuleInfoParser moduleInfoParser, ObjectFactory objects) {
2828
this.testSourceFolders = testSourceFolders;
2929
this.moduleInfoParser = moduleInfoParser;
30-
this.allTestRequires = objects.listProperty(String.class);
30+
this.allTestRequires = objects.setProperty(String.class);
3131
}
3232

3333
public void setMainSourceFolders(Set<File> mainSourceFolders) {

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import java.util.TreeSet;
99
import org.gradle.api.file.Directory;
1010
import org.gradle.api.model.ObjectFactory;
11-
import org.gradle.api.provider.ListProperty;
1211
import org.gradle.api.provider.Provider;
12+
import org.gradle.api.provider.SetProperty;
1313
import org.gradle.process.CommandLineArgumentProvider;
1414
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
1515
import org.jspecify.annotations.NullMarked;
@@ -26,9 +26,9 @@ public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentP
2626
@SuppressWarnings("NotNullFieldNotInitialized")
2727
private File resourcesUnderTest;
2828

29-
private final ListProperty<String> allTestRequires;
30-
private final ListProperty<String> allTestOpensTo;
31-
private final ListProperty<String> allTestExportsTo;
29+
private final SetProperty<String> allTestRequires;
30+
private final SetProperty<String> allTestOpensTo;
31+
private final SetProperty<String> allTestExportsTo;
3232

3333
public WhiteboxTestRuntimeArgumentProvider(
3434
Provider<Directory> testClassesFolders,
@@ -38,9 +38,9 @@ public WhiteboxTestRuntimeArgumentProvider(
3838
this.testClassesFolders = testClassesFolders;
3939
this.testResources = testResources;
4040
this.moduleInfoParser = moduleInfoParser;
41-
this.allTestRequires = objects.listProperty(String.class);
42-
this.allTestOpensTo = objects.listProperty(String.class);
43-
this.allTestExportsTo = objects.listProperty(String.class);
41+
this.allTestRequires = objects.setProperty(String.class);
42+
this.allTestOpensTo = objects.setProperty(String.class);
43+
this.allTestExportsTo = objects.setProperty(String.class);
4444
}
4545

4646
public void setMainSourceFolders(Set<File> mainSourceFolders) {

0 commit comments

Comments
 (0)