On Thu, 12 Dec 2024 17:06:58 GMT, Severin Gehwolf <sgehw...@openjdk.org> wrote:

>> Please review this extension to #22609 which now disallows `ALL-MODULE-PATH` 
>> without explicit `--module-path` option or a non-existent module path. In 
>> addition, this fixes a bug mentioned in #22609 when `ALL-MODULE-PATH` and 
>> `--limit-modules` are used in combination. It failed earlier and passes now 
>> due to alignment of `ModuleFinder`s. With this patch JEP 493 enabled builds 
>> and regular JDK builds behave the same in terms of `ALL-MODULE-PATH`.
>> 
>> When an explicit module path is being added, there is no difference. All 
>> modules on that path will be added as roots. Tests have been added for the 
>> various cases and existing tests updated to allow for them to run on JEP 493 
>> enabled builds. Thoughts?
>> 
>> Testing:
>> - [x] GHA, `test/jdk/tools/jlink` (all pass)
>> - [x] Added jlink test.
>
> Severin Gehwolf has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains 20 commits:
> 
>  - More test clean-ups
>  - Merge two AllModulePath tests
>  - Better error message with no modules on mod-path and ALL-MODULE-PATH
>  - Merge branch 'jdk-8345573-runtime-link-limit-mods' into 
> jdk-8345259-all-module-path-fix
>  - Mandy's feedback
>  - Merge branch 'jdk-8345573-runtime-link-limit-mods' into 
> jdk-8345259-all-module-path-fix
>  - Handle non-existent module-path with ALL-MODULE-PATH
>  - Move test, more test fixes for JEP 493 enabled builds
>  - Fix JLinkTest.java
>  - 8345259: Disallow ALL-MODULE-PATH without explicit --module-path
>  - ... and 10 more: https://git.openjdk.org/jdk/compare/c9643d31...9ba004cc

Need to bump the copyright end year in the tests.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 376:

> 374:             throw taskHelper.newBadArgs("err.no.module.path");
> 375:         }
> 376:         List<Path> originalModulePath = new 
> ArrayList<>(options.modulePath);

This is to keep the module path set in the command line for error message.  An 
alternative is to keep `options.modulePath` be the original value and do not 
add the default module path to it.  Instead:


            Path defModPath = getDefaultModulePath();
            if (defModPath != null) {
                finder = 
newModuleFinder(Stream.concat(options.modulePath.stream(), 
Stream.of(defModPath)).toList());
            }


Then the error message can just print `options.modulePath`.

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java line 441:

> 439:                 // run-time image. Only do this if no --limit-modules 
> has been
> 440:                 // specified to begin with.
> 441:                 ModuleFinder mf = newLimitedFinder(finder,

FWIW, rereading this, it's still a bit awk to call a module finder a limited 
finder.

test/jdk/tools/jlink/basic/AllModulePath.java line 66:

> 64:  *        jdk.test.lib.process.OutputAnalyzer
> 65:  *        jdk.test.lib.compiler.CompilerUtils
> 66:  * @run testng/othervm -Duser.language=en -Duser.country=US AllModulePath

Is `-Duser.language=en -Duser.country=US` needed? 

Please add `@bug` to this test.

test/jdk/tools/jlink/basic/AllModulePath.java line 129:

> 127:             // java.base is a dependency of external modules
> 128:             modules.add("java.base");
> 129:         }

The difference in the expected list is because `$JDK/jmods` is added to the 
module path explicitly.

I suggest to change `createImage` not to include `jmods` in `--module-path` 
option to simplify it so this test case checks for the same expected result in 
different linking modes.

test/jdk/tools/jlink/basic/AllModulePath.java line 184:

> 182:         assertTrue(rc != 0);
> 183:         String actual = new String(baos.toByteArray()).trim();
> 184:         assertEquals(actual, "Error: --module-path option must be 
> specified with --add-modules ALL-MODULE-PATH");

The new test cases can be cleaned up a little bit to match the existing test 
style.

Suggest to refactor this that other test cases can use something like `String 
jlink(boolean succeed, String... options)` that returns the output of stdout 
and stderr.   This constrains the output/error checking but it will catch test 
failures if any. 

`createImage` can simply call `jlink(true, ....)` that concatenates `options` 
with `"--output", image.toString()`

test/jdk/tools/jlink/basic/AllModulePath.java line 306:

> 304:                                     .map(s -> { return s.split("@")[0]; 
> })
> 305:                                     .sorted()
> 306:                                     .toList();

Suggestion:

        OutputAnalyzer out = ProcessTools.executeCommand(java.toString(), 
"--list-modules");
                                         .shouldHaveExitValue(0);
        List<String> actual = out.asLines().stream()
                                 .map(s -> { return s.split("@")[0]; })
                                 .sorted()
                                 .toList();

-------------

PR Review: https://git.openjdk.org/jdk/pull/22494#pullrequestreview-2500386715
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882631255
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882735540
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882622347
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882704393
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882715241
PR Review Comment: https://git.openjdk.org/jdk/pull/22494#discussion_r1882731917

Reply via email to