From 2fcff9b8574a0bbb96aa4a8eabd64b487284caa6 Mon Sep 17 00:00:00 2001 From: Jendrik Johannes Date: Thu, 18 Aug 2022 17:38:16 +0200 Subject: [PATCH] Version 0.2 for migration --- build.gradle.kts | 16 +- settings.gradle.kts | 2 +- .../JavaModuleTestingPlugin.java | 19 +- .../testing/JavaModuleTestingExtension.java | 185 ------------------ .../testing/WhiteboxJvmTestSuite.java | 49 ----- .../testing/internal/ModuleInfoParser.java | 59 ------ .../bridges/JavaModuleDependenciesBridge.java | 38 ---- .../WhiteboxTestCompileArgumentProvider.java | 78 -------- .../WhiteboxTestRuntimeArgumentProvider.java | 95 --------- .../testing/test/fixture/GradleBuild.groovy | 4 +- 10 files changed, 21 insertions(+), 524 deletions(-) rename src/main/java/{org/gradlex/javamodule/testing => de/jjohannes/gradle/moduletesting}/JavaModuleTestingPlugin.java (59%) delete mode 100644 src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java delete mode 100644 src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java delete mode 100644 src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java delete mode 100644 src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java delete mode 100644 src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java delete mode 100644 src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java diff --git a/build.gradle.kts b/build.gradle.kts index 8efd1e1..e0142e6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,25 +3,31 @@ plugins { id("org.gradlex.internal.plugin-publish-conventions") version "0.4" } -group = "org.gradlex" -version = "1.0" +group = "de.jjohannes.gradle" +version = "0.2" java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } +signing { + isRequired = false +} + dependencies { + implementation("org.gradlex:${project.name}:1.0") + testImplementation("org.spockframework:spock-core:2.1-groovy-3.0") testImplementation("org.gradle.exemplar:samples-check:1.0.0") testRuntimeOnly("org.junit.vintage:junit-vintage-engine") } pluginPublishConventions { - id("${project.group}.${project.name}") - implementationClass("org.gradlex.javamodule.testing.JavaModuleTestingPlugin") + id("de.jjohannes.${project.name}") + implementationClass("de.jjohannes.gradle.moduletesting.JavaModuleTestingPlugin") displayName("Java Module Testing Gradle Plugin") - description("A plugin to test Java Modules (whitebox and blackbox) without the hassle.") + description("!!! Plugin ID changed to 'org.gradlex.${project.name}' !!!") tags("gradlex", "java", "modularity", "jigsaw", "jpms", "testing") gitHub("https://github.com/gradlex-org/java-module-testing") developer { diff --git a/settings.gradle.kts b/settings.gradle.kts index 0a28fd4..37d4bb8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencyResolutionManagement { - repositories.mavenCentral() + repositories.gradlePluginPortal() } rootProject.name = "java-module-testing" diff --git a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java b/src/main/java/de/jjohannes/gradle/moduletesting/JavaModuleTestingPlugin.java similarity index 59% rename from src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java rename to src/main/java/de/jjohannes/gradle/moduletesting/JavaModuleTestingPlugin.java index 08c17b4..2f5603b 100644 --- a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingPlugin.java +++ b/src/main/java/de/jjohannes/gradle/moduletesting/JavaModuleTestingPlugin.java @@ -14,23 +14,18 @@ * limitations under the License. */ -package org.gradlex.javamodule.testing; +package de.jjohannes.gradle.moduletesting; -import org.gradle.api.NonNullApi; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.util.GradleVersion; -@SuppressWarnings("unused") -@NonNullApi -public abstract class JavaModuleTestingPlugin implements Plugin { +public class JavaModuleTestingPlugin implements Plugin { @Override public void apply(Project project) { - if (GradleVersion.current().compareTo(GradleVersion.version("7.4")) < 0) { - throw new RuntimeException("This plugin requires Gradle 7.4+"); - } - - project.getExtensions().create("javaModuleTesting", JavaModuleTestingExtension.class); + project.getLogger().lifecycle("Plugin ID changed - please update your build:\n" + + " Plugin ID: de.jjohannes.java-module-testing -> org.gradlex.java-module-testing\n" + + " GA Coordinates: de.jjohannes.gradle:java-module-testing -> org.gradlex:java-module-testing"); + project.getPlugins().apply("org.gradlex.java-module-testing"); } -} +} \ No newline at end of file diff --git a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java b/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java deleted file mode 100644 index c687b60..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/JavaModuleTestingExtension.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing; - -import org.gradlex.javamodule.testing.internal.ModuleInfoParser; -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.gradle.api.Action; -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ConfigurationContainer; -import org.gradle.api.artifacts.dsl.DependencyHandler; -import org.gradle.api.plugins.jvm.JvmTestSuite; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.SourceSet; -import org.gradle.api.tasks.SourceSetContainer; -import org.gradle.api.tasks.TaskContainer; -import org.gradle.api.tasks.TaskProvider; -import org.gradle.api.tasks.compile.JavaCompile; -import org.gradle.api.tasks.testing.Test; -import org.gradle.internal.jvm.JavaModuleDetector; -import org.gradle.jvm.tasks.Jar; -import org.gradle.testing.base.TestSuite; - -import javax.inject.Inject; - -@SuppressWarnings("UnstableApiUsage") -public abstract class JavaModuleTestingExtension { - private static final Action NO_OP_ACTION = c -> {}; - - private final Project project; - private final JavaModuleDetector moduleDetector; - - @Inject - public JavaModuleTestingExtension(Project project, JavaModuleDetector moduleDetector) { - this.project = project; - this.moduleDetector = moduleDetector; - } - - /** - * Turn the given JVM Test Suite into a Blackbox Test Suite. - * For example: - * - * javaModuleTesting.blackbox(testing.suites["integtest"]) - * - * @param jvmTestSuite the JVM Test Suite to configure - */ - public void blackbox(TestSuite jvmTestSuite) { - if (jvmTestSuite instanceof JvmTestSuite) { - configureJvmTestSuiteForBlackbox((JvmTestSuite) jvmTestSuite); - } - } - - /** - * Turn the given JVM Test Suite into a Whitebox Test Suite. - * For example: - * - * javaModuleTesting.whitebox(testing.suites["test"]) - * - * @param jvmTestSuite the JVM Test Suite to configure - */ - public void whitebox(TestSuite jvmTestSuite) { - whitebox(jvmTestSuite, NO_OP_ACTION); - } - - /** - * Turn the given JVM Test Suite into a Whitebox Test Suite. - * If needed, configure additional 'requires' and open the - * test packages for reflection. - * - * For example, for JUnit 5, you need at least: - * - * javaModuleTesting.whitebox(testing.suites["test"]) { - * requires.add("org.junit.jupiter.api") - * opensTo.add("org.junit.platform.commons") - * } - * - * @param jvmTestSuite the JVM Test Suite to configure - * @param conf configuration details for the whitebox test setup - */ - public void whitebox(TestSuite jvmTestSuite, Action conf) { - if (jvmTestSuite instanceof JvmTestSuite) { - WhiteboxJvmTestSuite whiteboxJvmTestSuite = project.getObjects().newInstance(WhiteboxJvmTestSuite.class); - whiteboxJvmTestSuite.getSourcesUnderTest().convention(project.getExtensions().getByType(SourceSetContainer.class).getByName(SourceSet.MAIN_SOURCE_SET_NAME)); - conf.execute(whiteboxJvmTestSuite); - configureJvmTestSuiteForWhitebox((JvmTestSuite) jvmTestSuite, whiteboxJvmTestSuite); - } - } - - private void configureJvmTestSuiteForBlackbox(JvmTestSuite jvmTestSuite) { - ConfigurationContainer configurations = project.getConfigurations(); - TaskContainer tasks = project.getTasks(); - - TaskProvider jarTask; - SourceSet sourceSet = jvmTestSuite.getSources(); - if (!tasks.getNames().contains(sourceSet.getJarTaskName())) { - jarTask = tasks.register(sourceSet.getJarTaskName(), Jar.class, t -> { - t.getArchiveClassifier().set(sourceSet.getName()); - t.from(sourceSet.getOutput()); - }); - } else { - jarTask = tasks.named(sourceSet.getJarTaskName(), Jar.class); - } - - tasks.named(sourceSet.getName(), Test.class, t -> { - // Classpath consists only of Jars to include classes+resources in one place - t.setClasspath(configurations.getByName(sourceSet.getRuntimeClasspathConfigurationName()).plus(project.files(jarTask))); - // Reset test classes dir - t.setTestClassesDirs(sourceSet.getOutput().getClassesDirs()); - }); - } - - private void configureJvmTestSuiteForWhitebox(JvmTestSuite jvmTestSuite, WhiteboxJvmTestSuite whiteboxJvmTestSuite) { - ConfigurationContainer configurations = project.getConfigurations(); - DependencyHandler dependencies = project.getDependencies(); - TaskContainer tasks = project.getTasks(); - ModuleInfoParser moduleInfoParser = new ModuleInfoParser(project.getLayout(), project.getProviders()); - - SourceSet testSources = jvmTestSuite.getSources(); - tasks.named(testSources.getCompileJavaTaskName(), JavaCompile.class, compileJava -> { - SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get(); - compileJava.setClasspath(sourcesUnderTest.getOutput().plus(configurations.getByName(testSources.getCompileClasspathConfigurationName()))); - - WhiteboxTestCompileArgumentProvider argumentProvider = (WhiteboxTestCompileArgumentProvider) compileJava.getOptions().getCompilerArgumentProviders().stream() - .filter(p -> p instanceof WhiteboxTestCompileArgumentProvider).findFirst().orElseGet(() -> { - WhiteboxTestCompileArgumentProvider newProvider = new WhiteboxTestCompileArgumentProvider( - sourcesUnderTest.getJava().getSrcDirs(), - testSources.getJava().getSrcDirs(), - compileJava, - moduleDetector, - moduleInfoParser); - compileJava.getOptions().getCompilerArgumentProviders().add(newProvider); - return newProvider; - }); - argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires().get()); - }); - - tasks.named(testSources.getName(), Test.class, test -> { - SourceSet sourcesUnderTest = whiteboxJvmTestSuite.getSourcesUnderTest().get(); - test.setClasspath(configurations.getByName(testSources.getRuntimeClasspathConfigurationName()).plus(sourcesUnderTest.getOutput()).plus(testSources.getOutput())); - - // Add main classes here so that Gradle finds module-info.class and treats this as a test with module path - test.setTestClassesDirs(sourcesUnderTest.getOutput().getClassesDirs().plus(testSources.getOutput().getClassesDirs())); - - WhiteboxTestRuntimeArgumentProvider argumentProvider = (WhiteboxTestRuntimeArgumentProvider) test.getJvmArgumentProviders().stream() - .filter(p -> p instanceof WhiteboxTestRuntimeArgumentProvider).findFirst().orElseGet(() -> { - WhiteboxTestRuntimeArgumentProvider newProvider = new WhiteboxTestRuntimeArgumentProvider( - sourcesUnderTest.getJava().getSrcDirs(), - testSources.getJava().getClassesDirectory(), - sourcesUnderTest.getOutput().getResourcesDir(), - testSources.getOutput().getResourcesDir(), - moduleInfoParser); - test.getJvmArgumentProviders().add(newProvider); - return newProvider; - }); - argumentProvider.testRequires(whiteboxJvmTestSuite.getRequires().get()); - argumentProvider.testOpensTo(whiteboxJvmTestSuite.getOpensTo().get()); - }); - - Configuration implementation = configurations.getByName(testSources.getImplementationConfigurationName()); - implementation.withDependencies(d -> { - for (String requiresModuleName : whiteboxJvmTestSuite.getRequires().get()) { - Provider gav = JavaModuleDependenciesBridge.gav(project, requiresModuleName); - if (gav != null) { - dependencies.addProvider(implementation.getName(), gav); - } - } - }); - } -} diff --git a/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java b/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java deleted file mode 100644 index dcf5300..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/WhiteboxJvmTestSuite.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing; - -import org.gradle.api.provider.ListProperty; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.SourceSet; - -public interface WhiteboxJvmTestSuite { - - /** - * Configure which source set contains the 'sources under test' for - * this Whitebox Test Suite - defaults to 'main'. - * - * @return the source set under test - */ - Property getSourcesUnderTest(); - - /** - * Add additional 'requires' directives for the test code. - * For example, 'requires.add("org.junit.jupiter.api")'. - * - * @return modifiable list of addition 'requires' (--add-reads) - */ - ListProperty getRequires(); - - /** - * Open all packages of this Whitebox Test Suite to a given Module - * for reflection at runtime. - * For example, 'opensTo.add("org.junit.platform.commons")'. - * - * @return modifiable list of addition '--add-opens' - */ - ListProperty getOpensTo(); -} diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java b/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java deleted file mode 100644 index 7c24364..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/internal/ModuleInfoParser.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing.internal; - -import org.gradle.api.file.ProjectLayout; -import org.gradle.api.file.RegularFile; -import org.gradle.api.provider.Provider; -import org.gradle.api.provider.ProviderFactory; - -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Set; - -public class ModuleInfoParser { - - private final ProjectLayout layout; - private final ProviderFactory providers; - - public ModuleInfoParser(ProjectLayout layout, ProviderFactory providers) { - this.layout = layout; - this.providers = providers; - } - - public String moduleName(Set sourceFolders) { - for (File folder : sourceFolders) { - Provider moduleInfoFile = layout.file(providers.provider(() -> new File(folder, "module-info.java"))); - Provider moduleInfoContent = providers.fileContents(moduleInfoFile).getAsText(); - if (moduleInfoContent.isPresent()) { - return moduleName(moduleInfoContent.get()); - } - } - return null; - } - - private String moduleName(String moduleInfoFileContent) { - for(String line: moduleInfoFileContent.split("\n")) { - List tokens = Arrays.asList(line.replace("{","").trim().split("\\s+")); - if (!"//".equals(tokens.get(0)) && tokens.contains("module")) { - return tokens.get(tokens.size() - 1); - } - } - return null; - } -} diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java b/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java deleted file mode 100644 index 6fda11b..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/internal/bridges/JavaModuleDependenciesBridge.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing.internal.bridges; - -import org.gradle.api.Project; -import org.gradle.api.provider.Provider; - -import java.lang.reflect.Method; - -public class JavaModuleDependenciesBridge { - - public static Provider gav(Project project, String moduleName) { - Object javaModuleDependencies = project.getExtensions().findByName("javaModuleDependencies"); - if (javaModuleDependencies == null) { - return null; - } - try { - Method gav = javaModuleDependencies.getClass().getMethod("gav", String.class); - return (Provider) gav.invoke(javaModuleDependencies, moduleName); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java deleted file mode 100644 index 28efecd..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestCompileArgumentProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing.internal.provider; - -import org.gradlex.javamodule.testing.internal.ModuleInfoParser; -import org.gradle.api.tasks.compile.JavaCompile; -import org.gradle.internal.jvm.JavaModuleDetector; -import org.gradle.process.CommandLineArgumentProvider; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -public class WhiteboxTestCompileArgumentProvider implements CommandLineArgumentProvider { - private final Set mainSourceFolders; - private final Set testSourceFolders; - private final JavaCompile task; - private final JavaModuleDetector moduleDetector; - private final ModuleInfoParser moduleInfoParser; - - private final List allTestRequires = new ArrayList<>(); - - public WhiteboxTestCompileArgumentProvider( - Set mainSourceFolders, Set testSourceFolders, JavaCompile task, - JavaModuleDetector moduleDetector, ModuleInfoParser moduleInfoParser) { - this.mainSourceFolders = mainSourceFolders; - this.testSourceFolders = testSourceFolders; - this.task = task; - this.moduleDetector = moduleDetector; - this.moduleInfoParser = moduleInfoParser; - } - - public void testRequires(List testRequires) { - allTestRequires.addAll(testRequires); - } - - @Override - public Iterable asArguments() { - String moduleName = moduleInfoParser.moduleName(mainSourceFolders); - String testSources = testSourceFolders.iterator().next().getPath(); - - String cpSeparator = System.getProperty("path.separator"); - List args = new ArrayList<>(); - - // Since for Gradle this sources set does not look like a module, we have to define the module path ourselves - args.add("--module-path"); - args.add(moduleDetector.inferModulePath(true, task.getClasspath()).getFiles().stream().map(File::getPath).collect(Collectors.joining(cpSeparator))); - - for (String testRequires : allTestRequires) { - args.add("--add-modules"); - args.add(testRequires); - args.add("--add-reads"); - args.add(moduleName + "=" + testRequires); - } - - // Patch 'main' and 'test' sources together - args.add("--patch-module"); - args.add(moduleName + "=" + testSources); - - return args; - } -} diff --git a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java b/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java deleted file mode 100644 index b6ebc35..0000000 --- a/src/main/java/org/gradlex/javamodule/testing/internal/provider/WhiteboxTestRuntimeArgumentProvider.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2022 the GradleX team. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gradlex.javamodule.testing.internal.provider; - -import org.gradlex.javamodule.testing.internal.ModuleInfoParser; -import org.gradle.api.file.Directory; -import org.gradle.api.provider.Provider; -import org.gradle.process.CommandLineArgumentProvider; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -public class WhiteboxTestRuntimeArgumentProvider implements CommandLineArgumentProvider { - private final Set mainSourceFolders; - private final Provider testClassesFolders; - private final File resourcesUnderTest; - private final File testResources; - private final ModuleInfoParser moduleInfoParser; - - private final List allTestRequires = new ArrayList<>(); - private final List allTestOpensTo = new ArrayList<>(); - - public WhiteboxTestRuntimeArgumentProvider(Set mainSourceFolders, - Provider testClassesFolders, File resourcesUnderTest, File testResources, - ModuleInfoParser moduleInfoParser) { - - this.mainSourceFolders = mainSourceFolders; - this.testClassesFolders = testClassesFolders; - this.resourcesUnderTest = resourcesUnderTest; - this.testResources = testResources; - this.moduleInfoParser = moduleInfoParser; - } - - public void testRequires(List testRequires) { - allTestRequires.addAll(testRequires); - } - - public void testOpensTo(List testRequires) { - allTestOpensTo.addAll(testRequires); - } - - @Override - public Iterable asArguments() { - String moduleName = moduleInfoParser.moduleName(mainSourceFolders); - - List allTestClassPackages = new ArrayList<>(); - testClassesFolders.get().getAsFileTree().visit(file -> { - String path = file.getPath(); - if (path.endsWith(".class") && path.contains("/")) { - allTestClassPackages.add(path.substring(0, path.lastIndexOf("/")).replace('/', '.')); - } - }); - - List args = new ArrayList<>(); - - for (String testRequires : allTestRequires) { - args.add("--add-modules"); - args.add(testRequires); - args.add("--add-reads"); - args.add(moduleName + "=" + testRequires); - } - - for (String packageName : allTestClassPackages) { - for (String opensTo : allTestOpensTo) { - args.add("--add-opens"); - args.add(moduleName + "/" + packageName + "=" + opensTo); - } - } - - // Patch into Module located in the 'main' classes folder: test classes, resources, test resources - args.add("--patch-module"); - args.add(moduleName + "=" + - testClassesFolders.get().getAsFile().getPath() + File.pathSeparator + - resourcesUnderTest.getPath() + File.pathSeparator + - testResources.getPath()); - - return args; - } -} diff --git a/src/test/groovy/org/gradlex/javamodule/testing/test/fixture/GradleBuild.groovy b/src/test/groovy/org/gradlex/javamodule/testing/test/fixture/GradleBuild.groovy index 305725b..389b8d6 100644 --- a/src/test/groovy/org/gradlex/javamodule/testing/test/fixture/GradleBuild.groovy +++ b/src/test/groovy/org/gradlex/javamodule/testing/test/fixture/GradleBuild.groovy @@ -39,7 +39,7 @@ class GradleBuild { appBuildFile << ''' plugins { id("org.gradlex.java-module-dependencies") - id("org.gradlex.java-module-testing") + id("de.jjohannes.java-module-testing") id("application") } group = "com.example" @@ -67,7 +67,7 @@ class GradleBuild { libBuildFile << ''' plugins { id("org.gradlex.java-module-dependencies") - id("org.gradlex.java-module-testing") + id("de.jjohannes.java-module-testing") id("java-library") } group = "com.example"