Skip to content

Commit 543a820

Browse files
committed
Add bridge to 'requires runtime' feature of dependencies plugin
Needed for a correct whitebox testing setup.
1 parent 9eefdbc commit 543a820

File tree

10 files changed

+76
-10
lines changed

10 files changed

+76
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Java Module Testing Gradle Plugin - Changelog
22

3+
## Version 1.1
4+
* Integrate with https://github.com/gradlex-org/java-module-dependencies/issues/19
5+
36
## Version 1.0
47
* Moved project to [GradleX](https://gradlex.org) - new plugin ID: `org.gradlex.java-module-testing`
58

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44
}
55

66
group = "org.gradlex"
7-
version = "1.0"
7+
version = "1.1"
88

99
java {
1010
sourceCompatibility = JavaVersion.VERSION_1_8
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-rc-3-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

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

Lines changed: 3 additions & 3 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.0")
7-
implementation("org.gradlex:java-module-dependencies:1.0")
8-
implementation("org.gradlex:java-module-testing:1.0")
6+
implementation("org.gradlex:extra-java-module-info:1.1")
7+
implementation("org.gradlex:java-module-dependencies:1.2")
8+
implementation("org.gradlex:java-module-testing:1.1")
99
}

samples/use-only-java-module-testing-plugin/build-logic/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ plugins {
33
}
44

55
dependencies {
6-
implementation("org.gradlex:java-module-testing:1.0")
6+
implementation("org.gradlex:java-module-testing:1.1")
77
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.gradlex.javamodule.testing;
1818

19+
import org.gradle.api.file.FileCollection;
1920
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
2021
import org.gradlex.javamodule.testing.internal.bridges.JavaModuleDependenciesBridge;
2122
import org.gradlex.javamodule.testing.internal.provider.WhiteboxTestCompileArgumentProvider;
@@ -134,14 +135,17 @@ private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, Whitebo
134135
SourceSet testSources = jvmTestSuite.getSources();
135136
tasks.named(testSources.getCompileJavaTaskName(), JavaCompile.class, compileJava -> {
136137
SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get();
138+
137139
compileJava.setClasspath(sourcesUnderTest.getOutput().plus(configurations.getByName(testSources.getCompileClasspathConfigurationName())));
140+
FileCollection syntheticModuleInfoFolders = JavaModuleDependenciesBridge.addRequiresRuntimeSupport(project, compileJava, sourcesUnderTest);
138141

139142
WhiteboxTestCompileArgumentProvider argumentProvider = (WhiteboxTestCompileArgumentProvider) compileJava.getOptions().getCompilerArgumentProviders().stream()
140143
.filter(p -> p instanceof WhiteboxTestCompileArgumentProvider).findFirst().orElseGet(() -> {
141144
WhiteboxTestCompileArgumentProvider newProvider = new WhiteboxTestCompileArgumentProvider(
142145
sourcesUnderTest.getJava().getSrcDirs(),
143146
testSources.getJava().getSrcDirs(),
144147
compileJava,
148+
syntheticModuleInfoFolders,
145149
moduleDetector,
146150
moduleInfoParser);
147151
compileJava.getOptions().getCompilerArgumentProviders().add(newProvider);

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717
package org.gradlex.javamodule.testing.internal.bridges;
1818

1919
import org.gradle.api.Project;
20+
import org.gradle.api.file.FileCollection;
2021
import org.gradle.api.provider.Provider;
22+
import org.gradle.api.tasks.SourceSet;
23+
import org.gradle.api.tasks.compile.JavaCompile;
2124

25+
import java.lang.reflect.InvocationTargetException;
2226
import java.lang.reflect.Method;
2327

2428
public class JavaModuleDependenciesBridge {
@@ -31,7 +35,22 @@ public static Provider<?> gav(Project project, String moduleName) {
3135
try {
3236
Method gav = javaModuleDependencies.getClass().getMethod("gav", String.class);
3337
return (Provider<?>) gav.invoke(javaModuleDependencies, moduleName);
34-
} catch (Exception e) {
38+
} catch (ReflectiveOperationException e) {
39+
throw new RuntimeException(e);
40+
}
41+
}
42+
43+
public static FileCollection addRequiresRuntimeSupport(Project project, JavaCompile task, SourceSet sourceSet) {
44+
Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies");
45+
if (javaModuleDependencies == null) {
46+
return project.getObjects().fileCollection();
47+
}
48+
try {
49+
Method gav = javaModuleDependencies.getClass().getMethod("addRequiresRuntimeSupport", JavaCompile.class, SourceSet.class);
50+
return (FileCollection) gav.invoke(javaModuleDependencies, task, sourceSet);
51+
} catch (NoSuchMethodException e) {
52+
return project.getObjects().fileCollection();
53+
} catch (ReflectiveOperationException e) {
3554
throw new RuntimeException(e);
3655
}
3756
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.gradlex.javamodule.testing.internal.provider;
1818

19+
import org.gradle.api.file.FileCollection;
1920
import org.gradlex.javamodule.testing.internal.ModuleInfoParser;
2021
import org.gradle.api.tasks.compile.JavaCompile;
2122
import org.gradle.internal.jvm.JavaModuleDetector;
@@ -31,17 +32,19 @@ public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentP
3132
private final Set<File> mainSourceFolders;
3233
private final Set<File> testSourceFolders;
3334
private final JavaCompile task;
35+
private final FileCollection syntheticModuleInfoFolders;
3436
private final JavaModuleDetector moduleDetector;
3537
private final ModuleInfoParser moduleInfoParser;
3638

3739
private final List<String> allTestRequires = new ArrayList<>();
3840

3941
public WhiteboxTestCompileArgumentProvider(
40-
Set<File> mainSourceFolders, Set<File> testSourceFolders, JavaCompile task,
42+
Set<File> mainSourceFolders, Set<File> testSourceFolders, JavaCompile task, FileCollection syntheticModuleInfoFolders,
4143
JavaModuleDetector moduleDetector, ModuleInfoParser moduleInfoParser) {
4244
this.mainSourceFolders = mainSourceFolders;
4345
this.testSourceFolders = testSourceFolders;
4446
this.task = task;
47+
this.syntheticModuleInfoFolders = syntheticModuleInfoFolders;
4548
this.moduleDetector = moduleDetector;
4649
this.moduleInfoParser = moduleInfoParser;
4750
}
@@ -60,7 +63,8 @@ public Iterable<String> asArguments() {
6063

6164
// Since for Gradle this sources set does not look like a module, we have to define the module path ourselves
6265
args.add("--module-path");
63-
args.add(moduleDetector.inferModulePath(true, task.getClasspath()).getFiles().stream().map(File::getPath).collect(Collectors.joining(cpSeparator)));
66+
args.add(moduleDetector.inferModulePath(true, task.getClasspath().plus(syntheticModuleInfoFolders)).getFiles().stream()
67+
.map(File::getPath).collect(Collectors.joining(cpSeparator)));
6468

6569
for (String testRequires : allTestRequires) {
6670
args.add("--add-modules");

src/test/groovy/org/gradlex/javamodule/testing/test/JavaModuleDependenciesBridgeTest.groovy

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,40 @@ class JavaModuleDependenciesBridgeTest extends Specification {
6666
then:
6767
result.task(":app:test").outcome == TaskOutcome.SUCCESS
6868
}
69+
70+
def "compiles with provides runtime directives"() {
71+
given:
72+
appBuildFile << '''
73+
dependencies.constraints {
74+
javaModuleDependencies {
75+
implementation(gav("org.slf4j", "2.0.3"))
76+
implementation(gav("org.slf4j.simple", "2.0.3"))
77+
}
78+
}
79+
javaModuleDependencies {
80+
moduleNameToGA.put("com.example.lib", "com.example:lib")
81+
}
82+
javaModuleTesting.whitebox(testing.suites["test"]) {
83+
requires.add("org.junit.jupiter.api")
84+
requires.add("com.example.lib")
85+
opensTo.add("org.junit.platform.commons")
86+
}
87+
'''
88+
appModuleInfoFile << '''
89+
module com.example.app {
90+
requires org.slf4j;
91+
requires /*runtime*/ org.slf4j.simple;
92+
}
93+
'''
94+
libModuleInfoFile << '''
95+
module com.example.lib {
96+
}
97+
'''
98+
99+
when:
100+
def result = runTests()
101+
102+
then:
103+
result.task(":app:compileTestJava").outcome == TaskOutcome.SUCCESS
104+
}
69105
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class GradleBuild {
2929

3030
settingsFile << '''
3131
pluginManagement {
32-
plugins { id("org.gradlex.java-module-dependencies") version "1.0" }
32+
plugins { id("org.gradlex.java-module-dependencies") version "1.2" }
3333
}
3434
dependencyResolutionManagement { repositories.mavenCentral() }
3535
includeBuild(".")

0 commit comments

Comments
 (0)