33
44import java .io .File ;
55import java .util .Collections ;
6+ import java .util .HashMap ;
67import java .util .List ;
8+ import java .util .Map ;
79import java .util .stream .Collectors ;
810import javax .inject .Inject ;
911import org .gradle .api .Action ;
1012import org .gradle .api .Describable ;
1113import org .gradle .api .Project ;
12- import org .gradle .api .artifacts .Configuration ;
1314import org .gradle .api .artifacts .ConfigurationContainer ;
1415import org .gradle .api .artifacts .dsl .DependencyHandler ;
1516import 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 });
0 commit comments