RFR: 8343876: Enhancements to jpackage test lib

Alexey Semenyuk asemenyuk at openjdk.org
Thu Nov 14 12:39:47 UTC 2024


Make jpackage test lib more practical. List of changes:

Support multiple args and var args in `@Parameter` annotation:

@Test
@Parameter({"12", "foo"})
@Parameter({"-89", "bar", "more"})
@Parameter({"-89", "bar", "more", "moore"})
public void testVarArg(int a, String b, String ... other) {}


Full support for var args in test constructors.<br/>Better results when looking up the suitable ctor for the ctor args with `null`-s.<br/>Support multiple functions with `@Parameteres` annotation, all will be executed instead of the first one earlier:

class FooTest {
    public FooTest(String... args) {}
    public FooTest(int o) {}
    public FooTest(int a, Boolean[] b, String c, String ... other) {}

    @Parameters
    public static Collection<Object[]> input() {
        return List.of(new Object[][] {
            {},
            {"str"},
            {55, new Boolean[]{false, true, false}, "foo", "bar"},
        });
    }

    @Parameters
    public static Collection<Object[]> input2() {
        return List.of(new Object[][] {
            {78},
            {34, null, null},
        });
    }
}


Static test method will be executed only once and not as many times as the number of the test class instances.

Introduced `@ParameterSupplier` annotation as a flexible alternative to `@Parameter`:


class FooTest {
    @Test
    @ParameterSupplier("dateSupplier")
    @ParameterSupplier("AnotherClass.dateSupplier")
    public void testDates(LocalDate v) {}

    public static Collection<Object[]> dateSupplier() {
        return List.of(new Object[][] {
            { LocalDate.parse("2018-05-05") },
            { LocalDate.parse("2018-07-11") },
        });
    }
}

class AnotherClass {
    public static Collection<Object[]> dateSupplier() {
        return List.of(new Object[][] {
            { LocalDate.parse("2028-07-11") },
        });
    }
}


All annotations support `ifOS` and `ifNotOS` properties of type `jdk.internal.util.OperatingSystem`:


@Test(ifOS = OperatingSystem.LINUX)
public void testRunIfLinux() {}

@Test(ifNotOS = OperatingSystem.LINUX)
public void testRunIfNotLinux() {}

@Test(ifNotOS = {OperatingSystem.LINUX,OperatingSystem.MACOS})
public void testRunIfNotLinuxOrMacOS() {}

@Test
@Parameter(value = "foo", ifOS = OperatingSystem.LINUX)
@Parameter(value = {"foo", "bar"}, ifOS = { OperatingSystem.LINUX, OperatingSystem.MACOS })
@Parameter(value = {}, ifNotOS = { OperatingSystem.WINDOWS })
@ParameterSupplier(value = "getWindowsStrings", ifOS = OperatingSystem.WINDOWS)
public void test(String ... args) {}

public static List<Object[]> getWindowsStrings() { ... }



class FooTest {
    public FooTest(int a, String b) {
        super(a, b);
    }

    @Parameters(ifOS = OperatingSystem.LINUX)
    public static Collection<Object[]> input() {
        return List.of(new Object[][] {
            {7, null},
        });
    }

    @Parameters(ifNotOS = {OperatingSystem.LINUX, OperatingSystem.MACOS})
    public static Collection<Object[]> input2() {
        return List.of(new Object[][] {
            {10, "hello"},
        });
    }
}


The test case description contains a fully qualified test class name instead of the short name earlier.

Added `JPackageCommand.validateOutput()` and adjusted `ErrorTest.java` to use it.

Tighten tests in `LinuxHelper`: if the jpackage command is not using an external app image it will test that all "*.desktop" files match app launchers of the app. Earlier it validated the contents of "*.desktop" files without relation to app launchers.

Add support for `@command` files to `Main.main()` method. 
E.g.: 


%> java ... Main.main @args.txt


will result in reading arguments from "args.txt" file. Arguments will be split at whitespaces and line breaks. If `@` is followed by `=`, arguments will be split at line breaks.

`InstallDirTest.java` and `InOutPath.java` tests updated to use new features. Other tests may be refactored later if appropriate.

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

Commit messages:
 - Minor cleanup
 - Merge branch 'master' into JDK-8343876
 - Use "validate" instead of "verify" for the new API
 - Don't run static test methods with test instances
 - Don't create intermediate set of expected test descs for very test class when building the total set of all test descs
 - Add test case to validate static test case will be executed only once in parameterized test
 - Full test class name in test case description
 - Use Comparator
 - Merge branch 'master' into JDK-8343876
 - - add test coverage to @Parameters.ifOS and @Parameters.ifNotOS.
 - ... and 23 more: https://git.openjdk.org/jdk/compare/95a00f8a...1c7e0592

Changes: https://git.openjdk.org/jdk/pull/21996/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=21996&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8343876
  Stats: 1889 lines in 17 files changed: 1515 ins; 208 del; 166 mod
  Patch: https://git.openjdk.org/jdk/pull/21996.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/21996/head:pull/21996

PR: https://git.openjdk.org/jdk/pull/21996


More information about the core-libs-dev mailing list