--- /dev/null 2019-11-20 11:20:45.000000000 -0500 +++ new/test/jdk/tools/jpackage/share/RuntimePackageTest.java 2019-11-20 11:20:42.527340400 -0500 @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import jdk.jpackage.test.*; +import jdk.jpackage.test.Annotations.Test; + +/** + * Test --runtime-image parameter. + * Output of the test should be RuntimePackageTest*.* installer. + * The installer should install Java Runtime without an application. + * Installation directory should not have "app" subfolder and should not have + * an application launcher. + * + * + * Windows: + * + * Java runtime should be installed in %ProgramFiles%\RuntimePackageTest directory. + */ + +/* + * @test + * @summary jpackage with --runtime-image + * @library ../helpers + * @key jpackagePlatformPackage + * @build jdk.jpackage.test.* + * @comment Temporary disable for Linux and OSX until functionality implemented + * @requires (os.family != "mac") + * @modules jdk.incubator.jpackage/jdk.incubator.jpackage.internal + * @compile RuntimePackageTest.java + * @run main/othervm/timeout=720 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=RuntimePackageTest + */ +public class RuntimePackageTest { + + @Test + public static void test() { + new PackageTest() + .addInitializer(cmd -> { + cmd.addArguments("--runtime-image", Optional.ofNullable( + JPackageCommand.DEFAULT_RUNTIME_IMAGE).orElse(Path.of( + System.getProperty("java.home")))); + // Remove --input parameter from jpackage command line as we don't + // create input directory in the test and jpackage fails + // if --input references non existant directory. + cmd.removeArgumentWithValue("--input"); + }) + .addInstallVerifier(cmd -> { + Set srcRuntime = listFiles(Path.of(cmd.getArgumentValue("--runtime-image"))); + Set dstRuntime = listFiles(cmd.appRuntimeDirectory()); + + Set intersection = new HashSet<>(srcRuntime); + intersection.retainAll(dstRuntime); + + srcRuntime.removeAll(intersection); + dstRuntime.removeAll(intersection); + + assertFileListEmpty(srcRuntime, "Missing"); + assertFileListEmpty(dstRuntime, "Unexpected"); + }) + .run(); + } + + private static Set listFiles(Path root) throws IOException { + try (var files = Files.walk(root)) { + return files.map(root::relativize).collect(Collectors.toSet()); + } + } + + private static void assertFileListEmpty(Set paths, String msg) { + TKit.assertTrue(paths.isEmpty(), String.format( + "Check there are no %s files in installed image", + msg.toLowerCase()), () -> { + String msg2 = String.format("%s %d files", msg, paths.size()); + TKit.trace(msg2 + ":"); + paths.stream().map(Path::toString).sorted().forEachOrdered( + TKit::trace); + TKit.trace("Done"); + }); + } +}