test/tools/launcher/ExecutionEnvironment.java

Print this page




  72 public class ExecutionEnvironment extends TestHelper {
  73     static final String LD_LIBRARY_PATH    = TestHelper.isMacOSX
  74             ? "DYLD_LIBRARY_PATH"
  75             : "LD_LIBRARY_PATH";
  76     static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32";
  77     static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64";
  78 
  79     // Note: these paths need not exist on the filesytem
  80     static final String LD_LIBRARY_PATH_VALUE    = "/Bridge/On/The/River/Kwai";
  81     static final String LD_LIBRARY_PATH_32_VALUE = "/Lawrence/Of/Arabia";
  82     static final String LD_LIBRARY_PATH_64_VALUE = "/A/Passage/To/India";
  83 
  84     static final String[] LD_PATH_STRINGS = {
  85         LD_LIBRARY_PATH + "=" + LD_LIBRARY_PATH_VALUE,
  86         LD_LIBRARY_PATH_32 + "=" + LD_LIBRARY_PATH_32_VALUE,
  87         LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE
  88     };
  89 
  90     static final File testJarFile = new File("EcoFriendly.jar");
  91 
  92     static final String LIBJVM = TestHelper.isWindows
  93             ? "jvm.dll"
  94             : "libjvm" + (TestHelper.isMacOSX ? ".dylib" : ".so");
  95 
  96     public ExecutionEnvironment() {
  97         createTestJar();
  98     }
  99 
 100     static void createTestJar() {
 101         try {
 102             List<String> codeList = new ArrayList<>();
 103             codeList.add("static void printValue(String name, boolean property) {\n");
 104             codeList.add("    String value = (property) ? System.getProperty(name) : System.getenv(name);\n");
 105             codeList.add("    System.out.println(name + \"=\" + value);\n");
 106             codeList.add("}\n");
 107             codeList.add("public static void main(String... args) {\n");
 108             codeList.add("    System.out.println(\"Execute test:\");\n");
 109             codeList.add("    printValue(\"os.name\", true);\n");
 110             codeList.add("    printValue(\"os.arch\", true);\n");
 111             codeList.add("    printValue(\"os.version\", true);\n");
 112             codeList.add("    printValue(\"sun.arch.data.model\", true);\n");
 113             codeList.add("    printValue(\"java.library.path\", true);\n");
 114             codeList.add("    printValue(\"" + LD_LIBRARY_PATH + "\", false);\n");
 115             codeList.add("    printValue(\"" + LD_LIBRARY_PATH_32 + "\", false);\n");


 123     }
 124     private void flagError(TestResult tr, String message) {
 125         System.err.println(tr);
 126         throw new RuntimeException(message);
 127     }
 128     /*
 129      * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there
 130      * should not be any new variables or pollution/mutations of any kind, the
 131      * environment should be pristine.
 132      */
 133     @Test
 134     void testEcoFriendly() {
 135         TestResult tr = null;
 136 
 137         Map<String, String> env = new HashMap<>();
 138         for (String x : LD_PATH_STRINGS) {
 139             String pairs[] = x.split("=");
 140             env.put(pairs[0], pairs[1]);
 141         }
 142 
 143         tr = doExec(env, javaCmd, haveServerVM ? "-server" : "-client",
 144                     "-jar", testJarFile.getAbsolutePath());
 145 
 146         if (!tr.isNotZeroOutput()) {
 147             flagError(tr, "Error: No output at all. Did the test execute ?");
 148         }
 149 
 150         for (String x : LD_PATH_STRINGS) {
 151             if (!tr.contains(x)) {
 152                 flagError(tr, "FAIL: did not get <" + x + ">");
 153             }
 154         }
 155     }
 156 
 157     /*
 158      * ensures that there are no execs as long as we are in the same
 159      * data model
 160      */
 161     @Test
 162     void testNoExec() {
 163         Map<String, String> env = new HashMap<>();
 164         env.put(JLDEBUG_KEY, "true");
 165         TestResult tr = doExec(env, javaCmd,
 166                                haveServerVM ? "-server" : "-client",
 167                                "-version");
 168         if (tr.testOutput.contains(EXPECTED_MARKER)) {
 169             flagError(tr, "testNoExec: found  warning <" + EXPECTED_MARKER +
 170                     "> the process execing ?");
 171         }
 172     }
 173 
 174     /*
 175      * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM
 176      * and the expected java.library.path behaviour.
 177      * For Generic platforms (All *nixes):
 178      *    * All LD_LIBRARY_PATH variable should be on java.library.path
 179      * For Solaris 32-bit
 180      *    * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified
 181      * For Solaris 64-bit
 182      *    * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified
 183      */
 184     @Test
 185     void testJavaLibraryPath() {
 186         TestResult tr = null;
 187 
 188         Map<String, String> env = new HashMap<>();
 189 
 190         if (TestHelper.isLinux || TestHelper.isMacOSX) {
 191             for (String x : LD_PATH_STRINGS) {
 192                 String pairs[] = x.split("=");
 193                 env.put(pairs[0], pairs[1]);
 194             }
 195 
 196             tr = doExec(env, javaCmd, haveServerVM ? "-server" : "-client",
 197                         "-jar", testJarFile.getAbsolutePath());
 198             verifyJavaLibraryPathGeneric(tr);
 199         } else { // Solaris
 200             // no override
 201             env.clear();
 202             env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
 203             tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
 204             verifyJavaLibraryPathGeneric(tr);
 205 
 206             env.clear();
 207             for (String x : LD_PATH_STRINGS) {
 208                 String pairs[] = x.split("=");
 209                 env.put(pairs[0], pairs[1]);
 210             }
 211 
 212             // verify the override occurs for 64-bit system
 213             tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
 214             verifyJavaLibraryPathOverride(tr, false);
 215         }
 216     }
 217 


 223     }
 224 
 225     private void verifyJavaLibraryPathOverride(TestResult tr,
 226             boolean is32Bit) {
 227         // make sure the 32/64 bit value exists
 228         if (!tr.matches("java.library.path=.*" +
 229                 (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) {
 230             flagError(tr, "verifyJavaLibraryPathOverride: " +
 231                 " java.library.path does not contain " +
 232                     (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE));
 233 
 234         }
 235         // make sure the generic value is absent
 236         if (!tr.notMatches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
 237             flagError(tr, "verifyJavaLibraryPathOverride: " +
 238                     " java.library.path contains " + LD_LIBRARY_PATH_VALUE);
 239         }
 240     }
 241 
 242     /*
 243      * ensures we have indeed exec'ed the correct vm of choice, all VMs support
 244      * -server, however 32-bit VMs support -client and -server.
 245      */
 246     @Test
 247     void testVmSelection() {
 248 
 249         TestResult tr = null;
 250 
 251         if (haveClientVM) {
 252             tr = doExec(javaCmd, "-client", "-version");
 253             if (!tr.matches(".*Client VM.*")) {
 254                 flagError(tr, "the expected vm -client did not launch");
 255             }
 256         }
 257         if (haveServerVM) {
 258             tr = doExec(javaCmd, "-server", "-version");
 259             if (!tr.matches(".*Server VM.*")) {
 260                 flagError(tr, "the expected vm -server did not launch");
 261             }
 262         }
 263     }
 264 




  72 public class ExecutionEnvironment extends TestHelper {
  73     static final String LD_LIBRARY_PATH    = TestHelper.isMacOSX
  74             ? "DYLD_LIBRARY_PATH"
  75             : "LD_LIBRARY_PATH";
  76     static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32";
  77     static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64";
  78 
  79     // Note: these paths need not exist on the filesytem
  80     static final String LD_LIBRARY_PATH_VALUE    = "/Bridge/On/The/River/Kwai";
  81     static final String LD_LIBRARY_PATH_32_VALUE = "/Lawrence/Of/Arabia";
  82     static final String LD_LIBRARY_PATH_64_VALUE = "/A/Passage/To/India";
  83 
  84     static final String[] LD_PATH_STRINGS = {
  85         LD_LIBRARY_PATH + "=" + LD_LIBRARY_PATH_VALUE,
  86         LD_LIBRARY_PATH_32 + "=" + LD_LIBRARY_PATH_32_VALUE,
  87         LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE
  88     };
  89 
  90     static final File testJarFile = new File("EcoFriendly.jar");
  91 




  92     public ExecutionEnvironment() {
  93         createTestJar();
  94     }
  95 
  96     static void createTestJar() {
  97         try {
  98             List<String> codeList = new ArrayList<>();
  99             codeList.add("static void printValue(String name, boolean property) {\n");
 100             codeList.add("    String value = (property) ? System.getProperty(name) : System.getenv(name);\n");
 101             codeList.add("    System.out.println(name + \"=\" + value);\n");
 102             codeList.add("}\n");
 103             codeList.add("public static void main(String... args) {\n");
 104             codeList.add("    System.out.println(\"Execute test:\");\n");
 105             codeList.add("    printValue(\"os.name\", true);\n");
 106             codeList.add("    printValue(\"os.arch\", true);\n");
 107             codeList.add("    printValue(\"os.version\", true);\n");
 108             codeList.add("    printValue(\"sun.arch.data.model\", true);\n");
 109             codeList.add("    printValue(\"java.library.path\", true);\n");
 110             codeList.add("    printValue(\"" + LD_LIBRARY_PATH + "\", false);\n");
 111             codeList.add("    printValue(\"" + LD_LIBRARY_PATH_32 + "\", false);\n");


 119     }
 120     private void flagError(TestResult tr, String message) {
 121         System.err.println(tr);
 122         throw new RuntimeException(message);
 123     }
 124     /*
 125      * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there
 126      * should not be any new variables or pollution/mutations of any kind, the
 127      * environment should be pristine.
 128      */
 129     @Test
 130     void testEcoFriendly() {
 131         TestResult tr = null;
 132 
 133         Map<String, String> env = new HashMap<>();
 134         for (String x : LD_PATH_STRINGS) {
 135             String pairs[] = x.split("=");
 136             env.put(pairs[0], pairs[1]);
 137         }
 138 
 139         tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());

 140 
 141         if (!tr.isNotZeroOutput()) {
 142             flagError(tr, "Error: No output at all. Did the test execute ?");
 143         }
 144 
 145         for (String x : LD_PATH_STRINGS) {
 146             if (!tr.contains(x)) {
 147                 flagError(tr, "FAIL: did not get <" + x + ">");
 148             }
 149         }
 150     }
 151 
 152     /*
 153      * ensures that there are no execs as long as we are in the same
 154      * data model
 155      */
 156     @Test
 157     void testNoExec() {
 158         Map<String, String> env = new HashMap<>();
 159         env.put(JLDEBUG_KEY, "true");
 160         TestResult tr = doExec(env, javaCmd, "-version");


 161         if (tr.testOutput.contains(EXPECTED_MARKER)) {
 162             flagError(tr, "testNoExec: found  warning <" + EXPECTED_MARKER +
 163                     "> the process execing ?");
 164         }
 165     }
 166 
 167     /*
 168      * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM
 169      * and the expected java.library.path behaviour.
 170      * For Generic platforms (All *nixes):
 171      *    * All LD_LIBRARY_PATH variable should be on java.library.path
 172      * For Solaris 32-bit
 173      *    * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified
 174      * For Solaris 64-bit
 175      *    * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified
 176      */
 177     @Test
 178     void testJavaLibraryPath() {
 179         TestResult tr = null;
 180 
 181         Map<String, String> env = new HashMap<>();
 182 
 183         if (TestHelper.isLinux || TestHelper.isMacOSX) {
 184             for (String x : LD_PATH_STRINGS) {
 185                 String pairs[] = x.split("=");
 186                 env.put(pairs[0], pairs[1]);
 187             }
 188 
 189             tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());

 190             verifyJavaLibraryPathGeneric(tr);
 191         } else { // Solaris
 192             // no override
 193             env.clear();
 194             env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
 195             tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
 196             verifyJavaLibraryPathGeneric(tr);
 197 
 198             env.clear();
 199             for (String x : LD_PATH_STRINGS) {
 200                 String pairs[] = x.split("=");
 201                 env.put(pairs[0], pairs[1]);
 202             }
 203 
 204             // verify the override occurs for 64-bit system
 205             tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
 206             verifyJavaLibraryPathOverride(tr, false);
 207         }
 208     }
 209 


 215     }
 216 
 217     private void verifyJavaLibraryPathOverride(TestResult tr,
 218             boolean is32Bit) {
 219         // make sure the 32/64 bit value exists
 220         if (!tr.matches("java.library.path=.*" +
 221                 (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) {
 222             flagError(tr, "verifyJavaLibraryPathOverride: " +
 223                 " java.library.path does not contain " +
 224                     (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE));
 225 
 226         }
 227         // make sure the generic value is absent
 228         if (!tr.notMatches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
 229             flagError(tr, "verifyJavaLibraryPathOverride: " +
 230                     " java.library.path contains " + LD_LIBRARY_PATH_VALUE);
 231         }
 232     }
 233 
 234     /*
 235      * ensures we have indeed exec'ed the correct vm of choice if it exists

 236      */
 237     @Test
 238     void testVmSelection() {
 239 
 240         TestResult tr = null;
 241 
 242         if (haveClientVM) {
 243             tr = doExec(javaCmd, "-client", "-version");
 244             if (!tr.matches(".*Client VM.*")) {
 245                 flagError(tr, "the expected vm -client did not launch");
 246             }
 247         }
 248         if (haveServerVM) {
 249             tr = doExec(javaCmd, "-server", "-version");
 250             if (!tr.matches(".*Server VM.*")) {
 251                 flagError(tr, "the expected vm -server did not launch");
 252             }
 253         }
 254     }
 255