1 /*
   2  * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 /*
  26  * @test CommandLineFlagComboNegative
  27  * @summary Test command line flag combinations that differ between
  28  *          the dump and execute steps, in such way that they cause errors
  29  *          E.g. use compressed oops for creating and archive, but then
  30  *               execute w/o compressed oops
  31  * @requires vm.cds
  32  * @library /test/lib
  33  * @modules java.base/jdk.internal.misc
  34  *          java.management
  35  *          jdk.jartool/sun.tools.jar
  36  * @compile test-classes/Hello.java
  37  * @run driver CommandLineFlagComboNegative
  38  */
  39 
  40 import java.util.ArrayList;
  41 import jdk.test.lib.Platform;
  42 import jdk.test.lib.process.OutputAnalyzer;
  43 
  44 public class CommandLineFlagComboNegative {
  45 
  46     private class TestVector {
  47         public String testOptionForDumpStep;
  48         public String testOptionForExecuteStep;
  49         public String expectedErrorMsg;
  50         public int expectedErrorCode;
  51 
  52         public TestVector(String testOptionForDumpStep, String testOptionForExecuteStep,
  53                           String expectedErrorMsg, int expectedErrorCode) {
  54             this.testOptionForDumpStep=testOptionForDumpStep;
  55             this.testOptionForExecuteStep=testOptionForExecuteStep;
  56             this.expectedErrorMsg=expectedErrorMsg;
  57             this.expectedErrorCode=expectedErrorCode;
  58         }
  59     }
  60 
  61     private ArrayList<TestVector> testTable = new ArrayList<TestVector>();
  62 
  63     private void initTestTable() {
  64         // These options are not applicable on 32-bit platforms
  65         if (Platform.is64bit()) {
  66             testTable.add( new TestVector("-XX:ObjectAlignmentInBytes=8", "-XX:ObjectAlignmentInBytes=16",
  67                 "An error has occurred while processing the shared archive file", 1) );
  68             if (!TestCommon.isDynamicArchive()) {
  69                 testTable.add( new TestVector("-XX:ObjectAlignmentInBytes=64", "-XX:ObjectAlignmentInBytes=32",
  70                     "An error has occurred while processing the shared archive file", 1) );
  71             }
  72             testTable.add( new TestVector("-XX:+UseCompressedOops", "-XX:-UseCompressedOops",
  73                 "Class data sharing is inconsistent with other specified options", 1) );
  74             testTable.add( new TestVector("-XX:+UseCompressedClassPointers", "-XX:-UseCompressedClassPointers",
  75                 "Class data sharing is inconsistent with other specified options", 1) );
  76         }
  77     }
  78 
  79     private void runTests() throws Exception
  80     {
  81         for (TestVector testEntry : testTable) {
  82             System.out.println("CommandLineFlagComboNegative: dump = " + testEntry.testOptionForDumpStep);
  83             System.out.println("CommandLineFlagComboNegative: execute = " + testEntry.testOptionForExecuteStep);
  84 
  85             String appJar = JarBuilder.getOrCreateHelloJar();
  86             OutputAnalyzer dumpOutput = TestCommon.dump(
  87                appJar, new String[] {"Hello"}, testEntry.testOptionForDumpStep);
  88 
  89             TestCommon.checkDump(dumpOutput, "Loading classes to share");
  90 
  91             OutputAnalyzer execOutput = TestCommon.exec(appJar, testEntry.testOptionForExecuteStep, "Hello");
  92             execOutput.shouldContain(testEntry.expectedErrorMsg);
  93             execOutput.shouldHaveExitValue(testEntry.expectedErrorCode);
  94         }
  95     }
  96 
  97     public static void main(String[] args) throws Exception {
  98         CommandLineFlagComboNegative thisClass = new CommandLineFlagComboNegative();
  99         thisClass.initTestTable();
 100         thisClass.runTests();
 101     }
 102 }