Path: blob/master/test/langtools/tools/jdeps/MultiReleaseJar.java
41144 views
/*1* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 8153654 817633326* @summary Tests for jdeps tool with multi-release jar files27* @modules jdk.jdeps/com.sun.tools.jdeps28* @library mrjar mrjar/base mrjar/9 mrjar/10 mrjar/v9 mrjar/v1029* @build test.* p.* q.* foo/* Main30* @run testng MultiReleaseJar31*/3233import org.testng.Assert;34import org.testng.annotations.AfterClass;35import org.testng.annotations.BeforeClass;36import org.testng.annotations.Test;3738import java.io.File;39import java.io.InputStream;40import java.nio.file.Path;41import java.nio.file.Paths;42import java.util.stream.Stream;4344public class MultiReleaseJar {45Path mrjar;46String testJdk;47String fileSep;48Path cmdPath;4950@BeforeClass51public void initialize() throws Exception {52String testClassPath = System.getProperty("test.class.path", "");53mrjar = Stream.of(testClassPath.split(File.pathSeparator))54.map(Paths::get)55.filter(e -> e.endsWith("mrjar"))56.findAny()57.orElseThrow(() -> new InternalError("mrjar not found"));58testJdk = System.getProperty("test.jdk");59fileSep = System.getProperty("file.separator");60cmdPath = Paths.get(testJdk, "bin");6162// build Version.jar, Version_9.jar and main.jar63Result r = run("jar -cf Version.jar -C base test --release 9 -C 9 test --release 10 -C 10 test");64checkResult(r);6566r = run("jar -cf Version_9.jar -C base test --release 9 -C 9 test");67checkResult(r);6869r = run("jar -cf Main.jar Main.class");70checkResult(r);7172r = run("jar -cf Foo.jar -C base p");73checkResult(r);7475Path foo = Paths.get(System.getProperty("test.classes")).resolve("modules").resolve("foo");76r = run("jar -uf Foo.jar --release 9 -C " + foo.toString() + " module-info.class --release 10 -C v10 q");77checkResult(r);78}7980@Test81public void basic() throws Exception {82Result r = run("jdeps --multi-release 9 -v missing.jar");83checkResult(r, false, "Warning: Path does not exist: missing.jar");8485r = run("jdeps -v Version.jar");86checkResult(r, false, "--multi-release option is not set");8788r = run("jdeps --multi-release base -v Version.jar");89checkResult(r, true,90"Version.jar ->",91"test.Version",92"test.Version"93);9495r = run("jdeps --multi-release 9 -v Version.jar");96checkResult(r, true,97"Version.jar ->",98"9/test.NonPublic",99"9/test.NonPublic",100"9/test.Version",101"9/test.Version",102"9/test.Version",103"9/test.Version"104);105106r = run("jdeps --multi-release 10 -v Version.jar");107checkResult(r, true,108"Version.jar ->",109"10/test.Version",110"10/test.Version",111"10/test.Version",112"10/test.Version",113"9/test.NonPublic",114"9/test.NonPublic"115);116117r = run("jdeps --multi-release 8 -v Version.jar");118checkResult(r, false, "Error: invalid argument for option: 8");119120r = run("jdeps --multi-release 9.1 -v Version.jar");121checkResult(r, false, "Error: invalid argument for option: 9.1");122123runJdeps("Main.class");124runJdeps("Main.jar");125}126127128private void runJdeps(String path) throws Exception {129Result r = run("jdeps -v -R -cp Version.jar " + path);130checkResult(r, false, "--multi-release option is not set");131132r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar -multi-release 9 " + path);133checkResult(r, false,134"Error: unknown option: -multi-release",135"Usage: jdeps <options> <path",136"use --help"137);138139r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 9 " + path);140141String name = path;142int index = path.lastIndexOf('/');143if (index >= 0) {144name = path.substring(index + 1, path.length());145}146checkResult(r, true,147name + " -> Version.jar",148name + " -> foo",149name + " -> java.base",150"Main",151"Main",152"Main",153"Main",154"Version.jar -> java.base",155"9/test.NonPublic",156"9/test.NonPublic",157"9/test.Version",158"9/test.Version",159"9/test.Version",160"9/test.Version",161"foo",162"Foo.jar",163"requires mandated java.base",164"foo -> java.base",165"p.Foo"166);167168r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 10 " + path);169checkResult(r, true,170name + " -> Version.jar",171name + " -> foo",172name + " -> java.base",173"Main",174"Main",175"Main",176"Main",177"Version.jar ->",178"10/test.Version",179"10/test.Version",180"10/test.Version",181"10/test.Version",182"9/test.NonPublic",183"9/test.NonPublic",184"foo",185"Foo.jar",186"requires mandated java.base",187"foo -> java.base",188"p.Foo"189);190191r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release base " + path);192checkResult(r, true,193name + " -> Version.jar",194name + " -> foo",195name + " -> java.base",196"Main",197"Main",198"Main",199"Main",200"Version.jar ->",201"test.Version",202"test.Version",203"foo",204"Foo.jar",205"requires mandated java.base",206"foo -> java.base",207"p.Foo"208);209210r = run("jdeps -v -R -cp Version.jar --module-path Foo.jar --multi-release 9.1 " + path);211checkResult(r, false, "Error: invalid argument for option: 9.1");212213// Version_9.jar does not have any version 10 entry214r = run("jdeps -v -R -cp Version_9.jar --module-path Foo.jar --multi-release 10 " + path);215checkResult(r, true,216name + " -> Version_9.jar",217name + " -> foo",218name + " -> java.base",219"Main",220"Main",221"Main",222"Main",223"Version_9.jar ->",224"9/test.NonPublic",225"9/test.NonPublic",226"9/test.Version",227"9/test.Version",228"9/test.Version",229"9/test.Version",230"foo",231"Foo.jar",232"requires mandated java.base",233"foo -> java.base",234"p.Foo"235);236}237238@Test239public void ps_and_qs() throws Exception {240// build the jar file241Result r = run("jar -cf PQ.jar -C base p --release 9 -C v9 p -C v9 q --release 10 -C v10 q");242checkResult(r);243244r = run("jdeps -v -R -cp PQ.jar --multi-release base PQ.jar");245checkResult(r, true,246"PQ.jar -> java.base",247"p.Foo"248);249250r = run("jdeps -v -R -cp PQ.jar --multi-release 9 PQ.jar");251checkResult(r, true,252"PQ.jar -> java.base",253"9/p.Foo",254"9/p.Foo",255"9/q.Bar"256);257258259r = run("jdeps -v -R -cp PQ.jar --multi-release 10 PQ.jar");260checkResult(r, true,261"PQ.jar -> java.base",262"10/q.Bar",263"10/q.Bar",264"10/q.Gee",265"9/p.Foo",266"9/p.Foo"267);268}269270@Test271public void modularJar() throws Exception {272Result r = run("jdeps -v --multi-release 10 --module-path Foo.jar -m foo");273checkResult(r, true,274"foo", // module name275"Foo.jar", // the path to Foo.jar276"requires mandated java.base", // module dependences277"foo -> java.base",278"10/q.Bar",279"10/q.Bar",280"10/q.Gee",281"p.Foo"282);283284r = run("jdeps --multi-release 9 -cp Version.jar --module-path Foo.jar Main.jar");285checkResult(r, true,286"Main.jar -> Version.jar",287"Main.jar -> foo",288"Main.jar -> java.base",289"-> java.lang",290"-> p",291"-> test"292);293294r = run("jdeps --multi-release 10 -cp Version.jar --module-path Foo.jar Main.jar");295checkResult(r, true,296"Main.jar -> Version.jar",297"Main.jar -> foo",298"Main.jar -> java.base",299"-> java.lang",300"-> p",301"-> test"302);303}304305static class Result {306final String cmd;307final int rc;308final String out;309final String err;310Result(String cmd, int rc, String out, String err) {311this.cmd = cmd;312this.rc = rc;313this.out = out;314this.err = err;315}316}317318Result run(String cmd) throws Exception {319String[] cmds = cmd.split(" +");320cmds[0] = cmdPath.resolve(cmds[0]).toString();321ProcessBuilder pb = new ProcessBuilder(cmds);322pb.directory(mrjar.toFile());323Process p = null;324try {325p = pb.start();326p.waitFor();327328String out;329try (InputStream is = p.getInputStream()) {330out = new String(is.readAllBytes());331}332String err;333try (InputStream is = p.getErrorStream()) {334err = new String(is.readAllBytes());335}336return new Result(cmd, p.exitValue(), out, err);337} catch (Throwable t) {338if (p != null) {339p.destroyForcibly().waitFor();340}341throw t;342}343}344345void checkResult(Result r) throws Exception {346System.out.println(r.cmd);347System.out.println(r.out);348if (r.rc != 0) {349System.out.println(r.err);350throw new Exception("rc=" + r.rc);351}352System.out.println();353}354355void checkResult(Result r, boolean checkrc, String... lines) throws Exception {356System.out.println(r.cmd);357System.out.println(r.out);358if (checkrc && r.rc != 0) {359System.out.println(r.err);360throw new Exception("rc=" + r.rc);361}362String[] out = r.out.split("\r?\n");363Assert.assertEquals(out.length, lines.length);364int n = 0;365for (String line : lines) {366Assert.assertTrue(out[n++].contains(line), "\"" + line + "\"");367}368System.out.println();369}370}371372373