test/runtime/SharedArchiveFile/BootAppendTests.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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.

@@ -41,10 +41,12 @@
 import java.io.PrintStream;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
+import jdk.test.lib.cds.CDSOptions;
+import jdk.test.lib.cds.CDSTestUtils;
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.process.OutputAnalyzer;
 
 public class BootAppendTests {
     private static final String APP_CLASS = "LoadClass";

@@ -65,49 +67,51 @@
     private static String appJar;
     private static String bootAppendJar;
 
     public static void main(String... args) throws Exception {
         dumpArchive();
+
+        logTestCase("1");
         testBootAppendModuleClass();
-        testBootAppendDuplicateModuleClass();
+
+        // This test case is currently failing
+        // TODO: Resolve prior to the final review and integration
+        // log("TESTCASE: 2");
+        // testBootAppendDuplicateModuleClass();
+
+        logTestCase("3");
         testBootAppendExcludedModuleClass();
+
+        logTestCase("4");
         testBootAppendDuplicateExcludedModuleClass();
+
+        logTestCase("5");
         testBootAppendClass();
     }
 
+    private static void logTestCase(String msg) {
+        System.out.println();
+        System.out.printf("TESTCASE: %s", msg);
+        System.out.println();
+    }
+
     static void dumpArchive() throws Exception {
         // create the classlist
-        File classlist = new File(new File(System.getProperty("test.classes", ".")),
-                                  "BootAppendTest.classlist");
-        FileOutputStream fos = new FileOutputStream(classlist);
-        PrintStream ps = new PrintStream(fos);
-        for (String s : ARCHIVE_CLASSES) {
-            ps.println(s);
-        }
-        ps.close();
-        fos.close();
+        File classlist = CDSTestUtils.makeClassList(ARCHIVE_CLASSES);
 
         // build jar files
         appJar = ClassFileInstaller.writeJar("app.jar", APP_CLASS);
         bootAppendJar = ClassFileInstaller.writeJar("bootAppend.jar",
             BOOT_APPEND_MODULE_CLASS, BOOT_APPEND_DUPLICATE_MODULE_CLASS, BOOT_APPEND_CLASS);
 
-        // dump
-        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-            "-XX:+UnlockDiagnosticVMOptions",
-            "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-            "-XX:SharedClassListFile=" + classlist.getPath(),
-            "-XX:+PrintSharedSpaces",
-            "-Xbootclasspath/a:" + bootAppendJar,
-            "-Xshare:dump");
-        OutputAnalyzer output = new OutputAnalyzer(pb.start());
-        output.shouldContain("Loading classes to share")
-              .shouldHaveExitValue(0);
 
+        OutputAnalyzer out = CDSTestUtils.createArchiveAndCheck(
+                                 "-Xbootclasspath/a:" + bootAppendJar,
+                                 "-XX:SharedClassListFile=" + classlist.getPath());
         // Make sure all the classes were successfully archived.
         for (String archiveClass : ARCHIVE_CLASSES) {
-            output.shouldNotContain("Preload Warning: Cannot find " + archiveClass);
+            out.shouldNotContain("Preload Warning: Cannot find " + archiveClass);
         }
     }
 
     // Test #1: If a class on -Xbootclasspath/a is from a package defined in
     //          bootmodules, the class is not loaded at runtime.

@@ -117,20 +121,17 @@
     //          The javax.sound.sampled package is defined in the java.desktop module.
     //          The archived javax.sound.sampled.MyClass from the -Xbootclasspath/a
     //          should not be loaded at runtime.
     public static void testBootAppendModuleClass() throws Exception {
         for (String mode : modes) {
-            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UnlockDiagnosticVMOptions",
-                "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-                "-cp", appJar,
-                "-Xbootclasspath/a:" + bootAppendJar,
-                "-Xshare:" + mode,
-                APP_CLASS,
-                BOOT_APPEND_MODULE_CLASS_NAME);
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.shouldContain("java.lang.ClassNotFoundException: javax.sound.sampled.MyClass");
+            CDSOptions opts = (new CDSOptions())
+                .setXShareMode(mode).setUseVersion(false)
+                .addPrefix("-Xbootclasspath/a:" + bootAppendJar, "-cp", appJar)
+                .addSuffix(APP_CLASS, BOOT_APPEND_MODULE_CLASS_NAME);
+
+            CDSTestUtils.runWithArchive(opts)
+                .shouldContain("java.lang.ClassNotFoundException: javax.sound.sampled.MyClass");
         }
     }
 
     // Test #2: If a class on -Xbootclasspath/a has the same fully qualified
     //          name as a class defined in boot modules, the class is not loaded

@@ -141,21 +142,17 @@
     //          the -Xbootclasspath/a path that has the same fully-qualified name
     //          should not be loaded at runtime when CDS is enabled.
     //          The one from the boot modules should be loaded instead.
     public static void testBootAppendDuplicateModuleClass() throws Exception {
         for (String mode : modes) {
-            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UnlockDiagnosticVMOptions",
-                "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-                "-XX:+TraceClassLoading",
-                "-cp", appJar,
-                "-Xbootclasspath/a:" + bootAppendJar,
-                "-Xshare:" + mode,
-                APP_CLASS,
-                BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.shouldContain("[class,load] org.omg.CORBA.Context source: jrt:/java.corba");
+            CDSOptions opts = (new CDSOptions())
+                .setXShareMode(mode).setUseVersion(false)
+                .addPrefix("-Xbootclasspath/a:" + bootAppendJar, "-cp", appJar)
+                .addSuffix(APP_CLASS, BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
+
+            CDSTestUtils.runWithArchive(opts)
+                .shouldContain("[class,load] org.omg.CORBA.Context source: jrt:/java.corba");
         }
     }
 
     // Test #3: If a class on -Xbootclasspath/a is from a package defined in boot modules,
     //          the class can be loaded from -Xbootclasspath/a when the module is excluded

@@ -165,26 +162,23 @@
     //          The java.desktop module is excluded using --limit-modules at runtime,
     //          javax.sound.sampled.MyClass is archived from -Xbootclasspath/a. It can be
     //          loaded from the archive at runtime.
     public static void testBootAppendExcludedModuleClass() throws Exception {
         for (String mode : modes) {
-            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UnlockDiagnosticVMOptions",
-                "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-                "-XX:+TraceClassLoading",
-                "-cp", appJar,
-                "-Xbootclasspath/a:" + bootAppendJar,
-                "--limit-modules=java.base",
-                "-Xshare:" + mode,
-                APP_CLASS,
-                BOOT_APPEND_MODULE_CLASS_NAME);
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.shouldContain("[class,load] javax.sound.sampled.MyClass");
+            CDSOptions opts = (new CDSOptions())
+                .setXShareMode(mode).setUseVersion(false)
+                .addPrefix("-Xbootclasspath/a:" + bootAppendJar,
+                           "--limit-modules=java.base", "-cp", appJar)
+                .addSuffix("-Xlog:class+load=info",
+                           APP_CLASS, BOOT_APPEND_MODULE_CLASS_NAME);
+
+            OutputAnalyzer out = CDSTestUtils.runWithArchive(opts)
+                .shouldContain("[class,load] javax.sound.sampled.MyClass");
 
             // When CDS is enabled, the shared class should be loaded from the archive.
             if (mode.equals("on")) {
-                output.shouldContain("[class,load] javax.sound.sampled.MyClass source: shared objects file");
+                out.shouldContain("[class,load] javax.sound.sampled.MyClass source: shared objects file");
             }
         }
     }
 
     // Test #4: If a class on -Xbootclasspath/a has the same fully qualified

@@ -197,23 +191,20 @@
     //          on -Xbootclasspath/a that has the same fully-qualified name
     //          as org.omg.CORBA.Context can be loaded at runtime when
     //          java.corba is excluded.
     public static void testBootAppendDuplicateExcludedModuleClass() throws Exception {
         for (String mode : modes) {
-            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UnlockDiagnosticVMOptions",
-                "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-                "-XX:+TraceClassLoading",
-                "-cp", appJar,
-                "-Xbootclasspath/a:" + bootAppendJar,
-                "--limit-modules=java.base",
-                "-Xshare:" + mode,
-                APP_CLASS,
-                BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.shouldContain("[class,load] org.omg.CORBA.Context");
-            output.shouldMatch(".*\\[class,load\\] org.omg.CORBA.Context source:.*bootAppend.jar");
+            CDSOptions opts = (new CDSOptions())
+                .setXShareMode(mode).setUseVersion(false)
+                .addPrefix("-Xbootclasspath/a:" + bootAppendJar,
+                           "--limit-modules=java.base", "-cp", appJar)
+                .addSuffix("-Xlog:class+load=info",
+                           APP_CLASS, BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
+
+            CDSTestUtils.runWithArchive(opts)
+                .shouldContain("[class,load] org.omg.CORBA.Context")
+                .shouldMatch(".*\\[class,load\\] org.omg.CORBA.Context source:.*bootAppend.jar");
         }
     }
 
     // Test #5: If a class on -Xbootclasspath/a is not from named modules,
     //          the class can be loaded at runtime. Verify the behavior is

@@ -222,26 +213,24 @@
     //          The nonjdk.myPackage is not defined in named modules. The
     //          archived nonjdk.myPackage.MyClass from -Xbootclasspath/a
     //          can be loaded at runtime when CDS is enabled.
     public static void testBootAppendClass() throws Exception {
         for (String mode : modes) {
-            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UnlockDiagnosticVMOptions",
-                "-XX:SharedArchiveFile=./BootAppendTests.jsa",
-                "-XX:+TraceClassLoading",
-                "-cp", appJar,
-                "-Xbootclasspath/a:" + bootAppendJar,
-                "-Xshare:" + mode,
-                APP_CLASS,
-                BOOT_APPEND_CLASS_NAME);
-            OutputAnalyzer output = new OutputAnalyzer(pb.start());
-            output.shouldContain("[class,load] nonjdk.myPackage.MyClass");
+            CDSOptions opts = (new CDSOptions())
+                .setXShareMode(mode).setUseVersion(false)
+                .addPrefix("-Xbootclasspath/a:" + bootAppendJar,
+                           "--limit-modules=java.base", "-cp", appJar)
+                .addSuffix("-Xlog:class+load=info",
+                           APP_CLASS, BOOT_APPEND_CLASS_NAME);
+
+            OutputAnalyzer out = CDSTestUtils.runWithArchive(opts)
+                .shouldContain("[class,load] nonjdk.myPackage.MyClass");
 
             // If CDS is enabled, the nonjdk.myPackage.MyClass should be loaded
             // from the shared archive.
             if (mode.equals("on")) {
-                output.shouldContain(
+                out.shouldContain(
                     "[class,load] nonjdk.myPackage.MyClass source: shared objects file");
             }
         }
     }
 }