Skip to content

Commit 0c918e8

Browse files
committed
Do Module Path / Classpath split for whitebox testing in doFirst
1 parent 7cfab0c commit 0c918e8

File tree

6 files changed

+56
-44
lines changed

6 files changed

+56
-44
lines changed

samples/use-all-java-module-plugins/build-logic/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
dependencies {
6-
implementation("org.gradlex:extra-java-module-info:1.5")
7-
implementation("org.gradlex:java-module-dependencies:1.3.1")
6+
implementation("org.gradlex:extra-java-module-info:1.7")
7+
implementation("org.gradlex:java-module-dependencies:1.5.2")
88
implementation("org.gradlex:java-module-testing:1.3.1")
99
}

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.gradle.api.artifacts.Configuration;
2222
import org.gradle.api.artifacts.ConfigurationContainer;
2323
import org.gradle.api.artifacts.dsl.DependencyHandler;
24-
import org.gradle.api.file.FileCollection;
2524
import org.gradle.api.file.RegularFile;
2625
import org.gradle.api.plugins.jvm.JvmTestSuite;
2726
import org.gradle.api.provider.Provider;
@@ -31,12 +30,12 @@
3130
import org.gradle.api.tasks.TaskProvider;
3231
import org.gradle.api.tasks.compile.JavaCompile;
3332
import org.gradle.api.tasks.testing.Test;
34-
import org.gradle.internal.jvm.JavaModuleDetector;
3533
import org.gradle.jvm.tasks.Jar;
3634
import org.gradle.testing.base.TestSuite;
3735
import org.gradle.testing.base.TestingExtension;
3836
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
3937
import org.gradlex.javamodule.testing.internal.ModuleInfoRequiresParser;
38+
import org.gradlex.javamodule.testing.internal.actions.JavaCompileSetModulePathAction;
4039
import org.gradlex.javamodule.testing.internal.bridges.JavaModuleDependenciesBridge;
4140
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestCompileArgumentProvider;
4241
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestRuntimeArgumentProvider;
@@ -52,12 +51,10 @@ public abstract class JavaModuleTestingExtension {
5251
private static final Action<WhiteboxJvmTestSuite> NO_OP_ACTION = c -> {};
5352

5453
private final Project project;
55-
private final JavaModuleDetector moduleDetector;
5654

5755
@Inject
58-
public JavaModuleTestingExtension(Project project, JavaModuleDetector moduleDetector) {
56+
public JavaModuleTestingExtension(Project project) {
5957
this.project = project;
60-
this.moduleDetector = moduleDetector;
6158

6259
TestingExtension testing = project.getExtensions().getByType(TestingExtension.class);
6360
testing.getSuites().withType(JvmTestSuite.class).configureEach(jvmTestSuite -> {
@@ -184,19 +181,16 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo
184181
SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get();
185182

186183
compileJava.setClasspath(sourcesUnderTest.getOutput().plus(configurations.getByName(testSources.getCompileClasspathConfigurationName())));
187-
FileCollection syntheticModuleInfoFolders = JavaModuleDependenciesBridge.addRequiresRuntimeSupportOld(project, compileJava, sourcesUnderTest);
188184

189185
WhiteboxTestCompileArgumentProvider argumentProvider = (WhiteboxTestCompileArgumentProvider) compileJava.getOptions().getCompilerArgumentProviders().stream()
190186
.filter(p -> p instanceof WhiteboxTestCompileArgumentProvider).findFirst().orElseGet(() -> {
191187
WhiteboxTestCompileArgumentProvider newProvider = new WhiteboxTestCompileArgumentProvider(
192188
sourcesUnderTest.getJava().getSrcDirs(),
193189
testSources.getJava().getSrcDirs(),
194-
compileJava,
195-
syntheticModuleInfoFolders,
196-
moduleDetector,
197190
moduleInfoParser,
198191
project.getObjects());
199192
compileJava.getOptions().getCompilerArgumentProviders().add(newProvider);
193+
compileJava.doFirst(project.getObjects().newInstance(JavaCompileSetModulePathAction.class));
200194
return newProvider;
201195
});
202196
argumentProvider.testRequires(JavaModuleDependenciesBridge.getCompileClasspathModules(project, testSources));
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright the GradleX team.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.gradlex.javamodule.testing.internal.actions;
18+
19+
import org.gradle.api.Action;
20+
import org.gradle.api.NonNullApi;
21+
import org.gradle.api.Task;
22+
import org.gradle.api.file.FileCollection;
23+
import org.gradle.api.tasks.compile.JavaCompile;
24+
import org.gradle.internal.jvm.JavaModuleDetector;
25+
26+
import javax.inject.Inject;
27+
import java.util.ArrayList;
28+
import java.util.List;
29+
30+
@NonNullApi
31+
public abstract class JavaCompileSetModulePathAction implements Action<Task> {
32+
33+
@Inject
34+
protected abstract JavaModuleDetector getJavaModuleDetector();
35+
36+
@Override
37+
public void execute(Task task) {
38+
JavaCompile javaCompile = (JavaCompile) task;
39+
FileCollection classpathAndModulePath = javaCompile.getClasspath();
40+
List<String> compilerArgs = new ArrayList<>(javaCompile.getOptions().getCompilerArgs());
41+
42+
// Since for Gradle this sources set does not look like a module, we have to define the module path ourselves
43+
compilerArgs.add("--module-path");
44+
compilerArgs.add(getJavaModuleDetector().inferModulePath(true, classpathAndModulePath).getAsPath());
45+
javaCompile.setClasspath(getJavaModuleDetector().inferClasspath(true, classpathAndModulePath));
46+
javaCompile.getOptions().setCompilerArgs(compilerArgs);
47+
}
48+
}

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

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,6 @@ public static void addRequiresRuntimeSupport(Project project, SourceSet sourceSe
5757
}
5858
}
5959

60-
@Deprecated
61-
public static FileCollection addRequiresRuntimeSupportOld(Project project, JavaCompile task, SourceSet sourceSet) {
62-
Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies");
63-
if (javaModuleDependencies == null) {
64-
return project.getObjects().fileCollection();
65-
}
66-
try {
67-
Method addRequiresRuntimeSupport = javaModuleDependencies.getClass().getMethod("addRequiresRuntimeSupport", JavaCompile.class, SourceSet.class);
68-
return (FileCollection) addRequiresRuntimeSupport.invoke(javaModuleDependencies, task, sourceSet);
69-
} catch (NoSuchMethodException e) {
70-
return project.getObjects().fileCollection();
71-
} catch (ReflectiveOperationException e) {
72-
throw new RuntimeException(e);
73-
}
74-
}
75-
7660
public static List<String> getRuntimeClasspathModules(Project project, SourceSet sourceSet) {
7761
return getClasspathModules("getRuntimeClasspathModules", project, sourceSet);
7862
}

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

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,18 @@
2929
import java.util.ArrayList;
3030
import java.util.List;
3131
import java.util.Set;
32-
import java.util.stream.Collectors;
3332

3433
public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentProvider {
3534
private final Set<File> mainSourceFolders;
3635
private final Set<File> testSourceFolders;
37-
private final JavaCompile task;
38-
private final FileCollection syntheticModuleInfoFolders;
39-
private final JavaModuleDetector moduleDetector;
4036
private final ModuleInfoParser moduleInfoParser;
4137

4238
private final ListProperty<String> allTestRequires;
4339

4440
public WhiteboxTestCompileArgumentProvider(
45-
Set<File> mainSourceFolders, Set<File> testSourceFolders, JavaCompile task, FileCollection syntheticModuleInfoFolders,
46-
JavaModuleDetector moduleDetector, ModuleInfoParser moduleInfoParser, ObjectFactory objects) {
41+
Set<File> mainSourceFolders, Set<File> testSourceFolders, ModuleInfoParser moduleInfoParser, ObjectFactory objects) {
4742
this.mainSourceFolders = mainSourceFolders;
4843
this.testSourceFolders = testSourceFolders;
49-
this.task = task;
50-
this.syntheticModuleInfoFolders = syntheticModuleInfoFolders;
51-
this.moduleDetector = moduleDetector;
5244
this.moduleInfoParser = moduleInfoParser;
5345
this.allTestRequires = objects.listProperty(String.class);
5446
}
@@ -66,14 +58,8 @@ public Iterable<String> asArguments() {
6658
String moduleName = moduleInfoParser.moduleName(mainSourceFolders);
6759
String testSources = testSourceFolders.iterator().next().getPath();
6860

69-
String cpSeparator = System.getProperty("path.separator");
7061
List<String> args = new ArrayList<>();
7162

72-
// Since for Gradle this sources set does not look like a module, we have to define the module path ourselves
73-
args.add("--module-path");
74-
args.add(moduleDetector.inferModulePath(true, task.getClasspath().plus(syntheticModuleInfoFolders)).getFiles().stream()
75-
.map(File::getPath).collect(Collectors.joining(cpSeparator)));
76-
7763
for (String testRequires : allTestRequires.get()) {
7864
args.add("--add-modules");
7965
args.add(testRequires);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class GradleBuild {
3131

3232
settingsFile << '''
3333
pluginManagement {
34-
plugins { id("org.gradlex.java-module-dependencies") version "1.3" }
34+
plugins { id("org.gradlex.java-module-dependencies") version "1.5.2" }
3535
}
3636
dependencyResolutionManagement { repositories.mavenCentral() }
3737
includeBuild(".")
@@ -113,7 +113,7 @@ class GradleBuild {
113113
.forwardOutput()
114114
.withPluginClasspath()
115115
.withProjectDir(projectDir)
116-
.withArguments(Arrays.asList(args) + '-s')
116+
.withArguments(Arrays.asList(args) + '-s' + '--configuration-cache')
117117
.withDebug(ManagementFactory.getRuntimeMXBean().getInputArguments().toString().contains("-agentlib:jdwp")).with {
118118
gradleVersionUnderTest ? it.withGradleVersion(gradleVersionUnderTest) : it
119119
}

0 commit comments

Comments
 (0)