test/tools/launcher/ExecutionEnvironment.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2009, 2012, 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. --- 1,7 ---- /* ! * Copyright (c) 2009, 2013, 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.
*** 24,34 **** /* * @test * @bug 4780570 4731671 6354700 6367077 6670965 4882974 * @summary Checks for LD_LIBRARY_PATH and execution on *nixes * @compile -XDignore.symbol.file ExecutionEnvironment.java ! * @run main ExecutionEnvironment */ /* * This tests for various things as follows: * Ensures that: --- 24,34 ---- /* * @test * @bug 4780570 4731671 6354700 6367077 6670965 4882974 * @summary Checks for LD_LIBRARY_PATH and execution on *nixes * @compile -XDignore.symbol.file ExecutionEnvironment.java ! * @run main/othervm ExecutionEnvironment */ /* * This tests for various things as follows: * Ensures that:
*** 44,65 **** --- 44,73 ---- * ii. on 64 bit systems: * a. if LD_LIBRARY_PATH64 is set it will override LD_LIBRARY_PATH * b. LD_LIBRARY_PATH32 is ignored if set * 5. no extra symlink exists on Solaris ie. * jre/lib/$arch/libjvm.so -> client/libjvm.so + * 6. Since 32-bit Solaris is no longer supported we continue to ensure that + * the appropriate paths are ignored or used, additionally we also test to + * ensure the 64-bit isadir exists and contains appopriate links. * TODO: * a. perhaps we need to add a test to audit all environment variables are * in pristine condition after the launch, there may be a few that the * launcher may add as implementation details. * b. add a pldd for solaris to ensure only one libjvm.so is linked */ import java.io.File; import java.io.FileNotFoundException; + import java.io.IOException; + import java.nio.file.DirectoryStream; + import java.nio.file.Files; + import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + import static java.nio.file.LinkOption.*; public class ExecutionEnvironment extends TestHelper { static final String LD_LIBRARY_PATH = TestHelper.isMacOSX ? "DYLD_LIBRARY_PATH"
*** 78,94 **** LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE }; static final File testJarFile = new File("EcoFriendly.jar"); - static int errors = 0; - static int passes = 0; - static final String LIBJVM = TestHelper.isWindows ? "jvm.dll" : "libjvm" + (TestHelper.isMacOSX ? ".dylib" : ".so"); static void createTestJar() { try { List<String> codeList = new ArrayList<>(); codeList.add("static void printValue(String name, boolean property) {\n"); codeList.add(" String value = (property) ? System.getProperty(name) : System.getenv(name);\n"); --- 86,103 ---- LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE }; static final File testJarFile = new File("EcoFriendly.jar"); static final String LIBJVM = TestHelper.isWindows ? "jvm.dll" : "libjvm" + (TestHelper.isMacOSX ? ".dylib" : ".so"); + public ExecutionEnvironment() { + createTestJar(); + } + static void createTestJar() { try { List<String> codeList = new ArrayList<>(); codeList.add("static void printValue(String name, boolean property) {\n"); codeList.add(" String value = (property) ? System.getProperty(name) : System.getenv(name);\n");
*** 109,125 **** createJar(testJarFile, codeList.toArray(clist)); } catch (FileNotFoundException fnfe) { throw new RuntimeException(fnfe); } } ! /* * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there * should not be any new variables or pollution/mutations of any kind, the * environment should be pristine. */ ! private static void ensureEcoFriendly() { TestResult tr = null; Map<String, String> env = new HashMap<>(); for (String x : LD_PATH_STRINGS) { String pairs[] = x.split("="); --- 118,138 ---- createJar(testJarFile, codeList.toArray(clist)); } catch (FileNotFoundException fnfe) { throw new RuntimeException(fnfe); } } ! private void flagError(TestResult tr, String message) { ! System.err.println(tr); ! throw new RuntimeException(message); ! } /* * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there * should not be any new variables or pollution/mutations of any kind, the * environment should be pristine. */ ! @Test ! void testEcoFriendly() { TestResult tr = null; Map<String, String> env = new HashMap<>(); for (String x : LD_PATH_STRINGS) { String pairs[] = x.split("=");
*** 127,168 **** } tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath()); if (!tr.isNotZeroOutput()) { ! System.out.println(tr); ! throw new RuntimeException("Error: No output at all. Did the test execute ?"); } for (String x : LD_PATH_STRINGS) { if (!tr.contains(x)) { ! System.out.println("FAIL: did not get <" + x + ">"); ! System.out.println(tr); ! errors++; ! } else { ! passes++; } } } /* * ensures that there are no execs as long as we are in the same * data model */ ! static void ensureNoExec() { Map<String, String> env = new HashMap<>(); env.put(JLDEBUG_KEY, "true"); TestResult tr = doExec(env, javaCmd, "-version"); if (tr.testOutput.contains(EXPECTED_MARKER)) { ! System.out.println("FAIL: EnsureNoExecs: found expected warning <" + ! EXPECTED_MARKER + "> the process execing ?"); - errors++; - } else { - passes++; } - return; } /* * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM * and the expected java.library.path behaviour. --- 140,172 ---- } tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath()); if (!tr.isNotZeroOutput()) { ! flagError(tr, "Error: No output at all. Did the test execute ?"); } for (String x : LD_PATH_STRINGS) { if (!tr.contains(x)) { ! flagError(tr, "FAIL: did not get <" + x + ">"); } } } /* * ensures that there are no execs as long as we are in the same * data model */ ! @Test ! void testNoExec() { Map<String, String> env = new HashMap<>(); env.put(JLDEBUG_KEY, "true"); TestResult tr = doExec(env, javaCmd, "-version"); if (tr.testOutput.contains(EXPECTED_MARKER)) { ! flagError(tr, "testNoExec: found warning <" + EXPECTED_MARKER + "> the process execing ?"); } } /* * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM * and the expected java.library.path behaviour.
*** 171,182 **** * For Solaris 32-bit * * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified * For Solaris 64-bit * * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified */ ! ! static void verifyJavaLibraryPath() { TestResult tr = null; Map<String, String> env = new HashMap<>(); if (TestHelper.isLinux || TestHelper.isMacOSX) { --- 175,186 ---- * For Solaris 32-bit * * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified * For Solaris 64-bit * * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified */ ! @Test ! void testJavaLibraryPath() { TestResult tr = null; Map<String, String> env = new HashMap<>(); if (TestHelper.isLinux || TestHelper.isMacOSX) {
*** 198,356 **** for (String x : LD_PATH_STRINGS) { String pairs[] = x.split("="); env.put(pairs[0], pairs[1]); } ! // verify the override occurs, since we know the invocation always ! // uses by default is 32-bit, therefore we also set the test ! // expectation to be the same. tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath()); - verifyJavaLibraryPathOverride(tr, true); - - // try changing the model from 32 to 64 bit - if (dualModePresent() && is32Bit) { - // verify the override occurs - env.clear(); - for (String x : LD_PATH_STRINGS) { - String pairs[] = x.split("="); - env.put(pairs[0], pairs[1]); - } - tr = doExec(env, javaCmd, "-d64", "-jar", - testJarFile.getAbsolutePath()); verifyJavaLibraryPathOverride(tr, false); - - // no override - env.clear(); - env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE); - tr = doExec(env, javaCmd, "-jar", - testJarFile.getAbsolutePath()); - verifyJavaLibraryPathGeneric(tr); } - - // try changing the model from 64 to 32 bit - if (java64Cmd != null && is64Bit) { - // verify the override occurs - env.clear(); - for (String x : LD_PATH_STRINGS) { - String pairs[] = x.split("="); - env.put(pairs[0], pairs[1]); } - tr = doExec(env, java64Cmd, "-d32", "-jar", - testJarFile.getAbsolutePath()); - verifyJavaLibraryPathOverride(tr, true); ! // no override ! env.clear(); ! env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE); ! tr = doExec(env, java64Cmd, "-d32", "-jar", ! testJarFile.getAbsolutePath()); ! verifyJavaLibraryPathGeneric(tr); ! } ! } ! } ! ! private static void verifyJavaLibraryPathGeneric(TestResult tr) { if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { ! System.out.print("FAIL: verifyJavaLibraryPath: "); ! System.out.println(" java.library.path does not contain " + LD_LIBRARY_PATH_VALUE); - System.out.println(tr); - errors++; - } else { - passes++; } } ! private static void verifyJavaLibraryPathOverride(TestResult tr, boolean is32Bit) { // make sure the 32/64 bit value exists if (!tr.matches("java.library.path=.*" + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) { ! System.out.print("FAIL: verifyJavaLibraryPathOverride: "); ! System.out.println(" java.library.path does not contain " + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE)); ! System.out.println(tr); ! errors++; ! } else { ! passes++; } // make sure the generic value is absent ! if (tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { ! System.out.print("FAIL: verifyJavaLibraryPathOverride: "); ! System.out.println(" java.library.path contains " + ! LD_LIBRARY_PATH_VALUE); ! System.out.println(tr); ! errors++; ! } else { ! passes++; } } /* * ensures we have indeed exec'ed the correct vm of choice, all VMs support * -server, however 32-bit VMs support -client and -server. */ ! static void verifyVmSelection() { TestResult tr = null; if (is32Bit) { tr = doExec(javaCmd, "-client", "-version"); if (!tr.matches(".*Client VM.*")) { ! System.out.println("FAIL: the expected vm -client did not launch"); ! System.out.println(tr); ! errors++; ! } else { ! passes++; } } tr = doExec(javaCmd, "-server", "-version"); if (!tr.matches(".*Server VM.*")) { ! System.out.println("FAIL: the expected vm -server did not launch"); ! System.out.println(tr); ! errors++; ! } else { ! passes++; } } /* * checks to see there is no extra libjvm.so than needed */ ! static void verifyNoSymLink() { if (is64Bit) { return; } File symLink = null; String libPathPrefix = isSDK ? "jre/lib" : "/lib"; symLink = new File(JAVAHOME, libPathPrefix + getJreArch() + "/" + LIBJVM); if (symLink.exists()) { ! System.out.println("FAIL: The symlink exists " + ! symLink.getAbsolutePath()); ! errors++; ! } else { ! passes++; } } public static void main(String... args) throws Exception { if (isWindows) { ! System.out.println("Warning: noop on windows"); return; } ! // create our test jar first ! createTestJar(); ! ensureNoExec(); ! verifyVmSelection(); ! ensureEcoFriendly(); ! verifyJavaLibraryPath(); ! verifyNoSymLink(); ! if (errors > 0) { ! throw new Exception("ExecutionEnvironment: FAIL: with " + ! errors + " errors and passes " + passes ); ! } else { ! System.out.println("ExecutionEnvironment: PASS " + passes); } - } } --- 202,319 ---- for (String x : LD_PATH_STRINGS) { String pairs[] = x.split("="); env.put(pairs[0], pairs[1]); } ! // verify the override occurs for 64-bit system tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath()); verifyJavaLibraryPathOverride(tr, false); } } ! private void verifyJavaLibraryPathGeneric(TestResult tr) { if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { ! flagError(tr, "testJavaLibraryPath: java.library.path does not contain " + LD_LIBRARY_PATH_VALUE); } } ! private void verifyJavaLibraryPathOverride(TestResult tr, boolean is32Bit) { // make sure the 32/64 bit value exists if (!tr.matches("java.library.path=.*" + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) { ! flagError(tr, "verifyJavaLibraryPathOverride: " + ! " java.library.path does not contain " + (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE)); ! } // make sure the generic value is absent ! if (!tr.notMatches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) { ! flagError(tr, "verifyJavaLibraryPathOverride: " + ! " java.library.path contains " + LD_LIBRARY_PATH_VALUE); } } /* * ensures we have indeed exec'ed the correct vm of choice, all VMs support * -server, however 32-bit VMs support -client and -server. */ ! @Test ! void testVmSelection() { TestResult tr = null; if (is32Bit) { tr = doExec(javaCmd, "-client", "-version"); if (!tr.matches(".*Client VM.*")) { ! flagError(tr, "the expected vm -client did not launch"); } } tr = doExec(javaCmd, "-server", "-version"); if (!tr.matches(".*Server VM.*")) { ! flagError(tr, "the expected vm -server did not launch"); } } /* * checks to see there is no extra libjvm.so than needed */ ! @Test ! void testNoSymLink() { if (is64Bit) { return; } File symLink = null; String libPathPrefix = isSDK ? "jre/lib" : "/lib"; symLink = new File(JAVAHOME, libPathPrefix + getJreArch() + "/" + LIBJVM); if (symLink.exists()) { ! throw new RuntimeException("symlink exists " + symLink.getAbsolutePath()); } } + /* + * verify if all the symlinks in the images are created correctly, + * only on solaris, this test works only on images. + */ + @Test + void testSymLinks() throws Exception { + if (!isSolaris) + return; + verifySymLinks(JAVA_BIN); + verifySymLinks(JAVA_JRE_BIN); + } + private void verifySymLinks(String bindir) throws IOException { + File binDir = new File(bindir); + System.err.println("verifying links in: " + bindir); + File isaDir = new File(binDir, getArch()).getAbsoluteFile(); + if (!isaDir.exists()) { + throw new RuntimeException("dir: " + isaDir + " does not exist"); + } + try (DirectoryStream<Path> ds = Files.newDirectoryStream(binDir.toPath())) { + for (Path p : ds) { + if (Files.isDirectory(p, NOFOLLOW_LINKS)) + continue; + Path link = new File(isaDir, p.getFileName().toString()).toPath(); + if (Files.isSymbolicLink(link)) { + Path target = Files.readSymbolicLink(link); + if (target.startsWith("..") && p.endsWith(target.getFileName())) + continue; + System.err.println("target:" + target); + System.err.println("file:" + p); + } + throw new RuntimeException("could not find link to " + p); + } + } + + } public static void main(String... args) throws Exception { if (isWindows) { ! System.err.println("Warning: test not applicable to windows"); return; } ! ExecutionEnvironment ee = new ExecutionEnvironment(); ! ee.run(args); } }