test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/DynamicArchiveTestBase.java
author iklam
Wed, 13 Nov 2019 16:36:54 -0800
changeset 59070 22ee476cc664
parent 57567 b000362a89a0
permissions -rw-r--r--
8231610: Relocate the CDS archive if it cannot be mapped to the requested address Reviewed-by: jiangli, coleenp, ccheung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     1
/*
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     4
 *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     8
 *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    13
 * accompanied this code).
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    14
 *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    18
 *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    21
 * questions.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    22
 *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    23
 */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    24
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    25
import java.io.File;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    26
import jdk.test.lib.process.OutputAnalyzer;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    27
import jdk.test.lib.process.ProcessTools;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    28
import jdk.test.lib.cds.CDSOptions;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    29
import jdk.test.lib.cds.CDSTestUtils;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    30
import jdk.test.lib.cds.CDSTestUtils.Result;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    31
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    32
/**
57567
b000362a89a0 8202339: [TESTBUG] Consolidate the tests in runtime/SharedArchiveFile and runtime/appcds
coleenp
parents: 55524
diff changeset
    33
 * Base class for test cases in test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    34
 */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    35
class DynamicArchiveTestBase {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    36
    private static boolean executedIn_run = false;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    37
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    38
    public static interface DynamicArchiveTest {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    39
        public void run() throws Exception;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    40
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    41
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    42
    public static interface DynamicArchiveTestWithArgs {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    43
        public void run(String args[]) throws Exception;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    44
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    45
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    46
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    47
    /*
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    48
     * Tests for dynamic archives should be written using this pattern:
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    49
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    50
     * public class HelloDynamic extends DynamicArchiveTestBase {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    51
     *     public static void main(String[] args) throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    52
     *        runTest(HelloDynamic::testDefaultBase); // launch one test case
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    53
     *     }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    54
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    55
     *     // the body of a test case
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    56
     *     static void testDefaultBase() throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    57
     *         String topArchiveName = getNewArchiveName("top");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    58
     *         doTest(null, topArchiveName);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    59
     *     }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    60
     * }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    61
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    62
     * The reason for this is so that we can clean up the archive files
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    63
     * created by prior test cases. Otherwise tests with lots of
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    64
     * test cases may fill up the scratch directory.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    65
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    66
    public static void runTest(DynamicArchiveTest t) throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    67
        executedIn_run = true;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    68
        try {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    69
            TestCommon.deletePriorArchives();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    70
            t.run();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    71
        } finally {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    72
            executedIn_run = false;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    73
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    74
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    75
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    76
    public static void runTest(DynamicArchiveTestWithArgs t, String... args) throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    77
        executedIn_run = true;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    78
        try {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    79
            TestCommon.deletePriorArchives();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    80
            t.run(args);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    81
        } finally {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    82
            executedIn_run = false;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    83
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    84
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    85
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    86
    public static String getNewArchiveName() {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    87
        return TestCommon.getNewArchiveName();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    88
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    89
    public static String getNewArchiveName(String stem) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    90
        return TestCommon.getNewArchiveName(stem);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    91
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    92
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    93
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    94
     * Execute a JVM using the base archive (given by baseArchiveName) with the command line
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    95
     * (given by cmdLineSuffix). At JVM exit, dump all eligible classes into the top archive
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    96
     * (give by topArchiveName).
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    97
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    98
     * If baseArchiveName is null, use the JDK's default archive as the base archive.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
    99
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   100
    public static Result dump2(String baseArchiveName, String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   101
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   102
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   103
        String[] cmdLine = TestCommon.concat(
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   104
            "-XX:ArchiveClassesAtExit=" + topArchiveName);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   105
        // to allow dynamic archive tests to be run in the "rt-non-cds-mode"
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   106
        cmdLine = TestCommon.concat(cmdLine, "-Xshare:auto");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   107
        if (baseArchiveName != null) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   108
            cmdLine = TestCommon.concat(cmdLine, "-XX:SharedArchiveFile=" + baseArchiveName);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   109
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   110
        cmdLine = TestCommon.concat(cmdLine, cmdLineSuffix);
55524
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   111
        return execProcess("dump", null, cmdLine);
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   112
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   113
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   114
    public static Result dump2_WB(String baseArchiveName, String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   115
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   116
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   117
        return dump2(baseArchiveName, topArchiveName,
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   118
                     TestCommon.concat(wbRuntimeArgs(), cmdLineSuffix));
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   119
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   120
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   121
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   122
     * A convenience method similar to dump2, but always use the JDK's default archive
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   123
     * as the base archive.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   124
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   125
     * Most dynamicArchive/*.java test cases should be using this method instead of run2.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   126
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   127
    public static Result dump(String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   128
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   129
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   130
        return dump2(null, topArchiveName, cmdLineSuffix);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   131
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   132
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   133
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   134
     * Dump the base archive. The JDK's default class list is used (unless otherwise specified
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   135
     * in cmdLineSuffix).
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   136
     */
59070
22ee476cc664 8231610: Relocate the CDS archive if it cannot be mapped to the requested address
iklam
parents: 57567
diff changeset
   137
    public static OutputAnalyzer dumpBaseArchive(String baseArchiveName, String ... cmdLineSuffix)
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   138
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   139
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   140
        CDSOptions opts = new CDSOptions();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   141
        opts.setArchiveName(baseArchiveName);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   142
        opts.addSuffix(cmdLineSuffix);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   143
        opts.addSuffix("-Djava.class.path=");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   144
        OutputAnalyzer out = CDSTestUtils.createArchive(opts);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   145
        CDSTestUtils.checkDump(out);
59070
22ee476cc664 8231610: Relocate the CDS archive if it cannot be mapped to the requested address
iklam
parents: 57567
diff changeset
   146
        return out;
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   147
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   148
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   149
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   150
     * Same as dumpBaseArchive, but also add WhiteBox to the bootcp
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   151
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   152
    public static void dumpBaseArchive_WB(String baseArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   153
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   154
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   155
        dumpBaseArchive(baseArchiveName,
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   156
                        TestCommon.concat("-Xbootclasspath/a:" + getWhiteBoxJar(), cmdLineSuffix));
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   157
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   158
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   159
    private static String getWhiteBoxJar() {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   160
        String wbJar = ClassFileInstaller.getJarPath("WhiteBox.jar");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   161
        if (!(new File(wbJar)).exists()) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   162
            throw new RuntimeException("Test error: your test must have " +
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   163
                                       "'@run driver ClassFileInstaller -jar WhiteBox.jar sun.hotspot.WhiteBox'");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   164
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   165
        return wbJar;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   166
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   167
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   168
    private static String[] wbRuntimeArgs() {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   169
        return TestCommon.concat("-Xbootclasspath/a:" + getWhiteBoxJar(),
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   170
                                 "-XX:+UnlockDiagnosticVMOptions",
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   171
                                 "-XX:+WhiteBoxAPI");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   172
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   173
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   174
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   175
     * Execute a JVM using the base archive (given by baseArchiveName) and the top archive
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   176
     * (give by topArchiveName), using the command line (given by cmdLineSuffix).
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   177
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   178
     * If baseArchiveName is null, use the JDK's default archive as the base archive.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   179
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   180
    public static Result run2(String baseArchiveName, String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   181
        throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   182
        if (baseArchiveName == null && topArchiveName == null) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   183
            throw new RuntimeException("Both baseArchiveName and topArchiveName cannot be null at the same time.");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   184
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   185
        String archiveFiles = (baseArchiveName == null) ? topArchiveName :
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   186
            (topArchiveName == null) ? baseArchiveName :
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   187
            baseArchiveName + File.pathSeparator + topArchiveName;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   188
        String[] cmdLine = TestCommon.concat(
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   189
            "-Xshare:on",
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   190
            "-XX:SharedArchiveFile=" + archiveFiles);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   191
        cmdLine = TestCommon.concat(cmdLine, cmdLineSuffix);
55524
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   192
        return execProcess("exec", null, cmdLine);
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   193
    }
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   194
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   195
    public static Result runWithRelativePath(String baseArchiveName, String topArchiveName,
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   196
                              String jarDir, String ... cmdLineSuffix)
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   197
        throws Exception {
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   198
        if (baseArchiveName == null && topArchiveName == null) {
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   199
            throw new RuntimeException("Both baseArchiveName and topArchiveName cannot be null at the same time.");
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   200
        }
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   201
        String archiveFiles = (baseArchiveName == null) ? topArchiveName :
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   202
            (topArchiveName == null) ? baseArchiveName :
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   203
            baseArchiveName + File.pathSeparator + topArchiveName;
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   204
        String[] cmdLine = TestCommon.concat(
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   205
            "-Xshare:on",
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   206
            "-XX:SharedArchiveFile=" + archiveFiles);
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   207
        cmdLine = TestCommon.concat(cmdLine, cmdLineSuffix);
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   208
        return execProcess("exec", jarDir, cmdLine);
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   209
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   210
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   211
    public static Result run2_WB(String baseArchiveName, String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   212
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   213
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   214
        return run2(baseArchiveName, topArchiveName,
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   215
                    TestCommon.concat(wbRuntimeArgs(), cmdLineSuffix));
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   216
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   217
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   218
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   219
     * A convenience method similar to run2, but always use the JDK's default archive
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   220
     * as the base archive.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   221
     *
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   222
     * Most dynamicArchive/*.java test cases should be using this method instead of run2.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   223
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   224
    public static Result run(String topArchiveName, String ... cmdLineSuffix)
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   225
        throws Exception
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   226
    {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   227
        return run2(null, topArchiveName, cmdLineSuffix);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   228
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   229
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   230
    private static String getXshareMode(String[] cmdLine) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   231
        for (int i = 0; i <= cmdLine.length - 1; i++) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   232
            int j = cmdLine[i].indexOf("-Xshare:");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   233
            if (j != -1) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   234
                return (cmdLine[i].substring(j));
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   235
            }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   236
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   237
        return null;
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   238
   }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   239
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   240
55524
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   241
    private static Result execProcess(String mode, String jarDir, String[] cmdLine) throws Exception {
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   242
        if (!executedIn_run) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   243
            throw new Exception("Test error: dynamic archive tests must be executed via DynamicArchiveTestBase.run()");
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   244
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   245
        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmdLine);
55524
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   246
        if (jarDir != null) {
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   247
            pb.directory(new File(jarDir));
b279ae9843b8 8211723: AppCDS: referring to a jar file in any way other than exactly how it was done during dumping doesn't work
ccheung
parents: 54927
diff changeset
   248
        }
54927
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   249
        OutputAnalyzer output = TestCommon.executeAndLog(pb, mode);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   250
        CDSOptions opts = new CDSOptions();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   251
        String xShareMode = getXshareMode(cmdLine);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   252
        if (xShareMode != null) {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   253
            opts.setXShareMode(xShareMode);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   254
        }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   255
        return new Result(opts, output);
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   256
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   257
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   258
    /**
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   259
     * A convenience method for dumping and running, using the default CDS archive from the
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   260
     * JDK. Both dumping and running should exit normally.
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   261
     */
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   262
    public static void dumpAndRun(String topArchiveName, String ... cmdLineSuffix) throws Exception {
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   263
        dump(topArchiveName, cmdLineSuffix).assertNormalExit();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   264
        run(topArchiveName,  cmdLineSuffix).assertNormalExit();
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   265
    }
1512d88b24c6 8207812: Implement Dynamic CDS Archive
ccheung
parents:
diff changeset
   266
}