1 /*
   2 * Copyright (c) 2013, 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  * @test TestObjectTenuringFlags
  26  * @key gc
  27  * @bug 6521376
  28  * @summary Tests argument processing for NeverTenure, AlwaysTenure,
  29  * and MaxTenuringThreshold
  30  * @library /testlibrary
  31  * @build TestObjectTenuringFlags FlagsValue
  32  * @run main/othervm TestObjectTenuringFlags
  33  * @author tao.mao@oracle.com
  34  */
  35 
  36 import com.oracle.java.testlibrary.*;
  37 
  38 import java.util.*;
  39 
  40 public class TestObjectTenuringFlags {
  41   public static void main(String args[]) throws Exception {    
  42     // default case
  43     runTenuringFlagsConsistencyTest(
  44         new String[]{},
  45         false /* shouldFail */,
  46         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 15));
  47 
  48     // valid cases
  49     runTenuringFlagsConsistencyTest(
  50         new String[]{"-XX:+NeverTenure"},
  51         false /* shouldFail */,
  52         new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));
  53 
  54     runTenuringFlagsConsistencyTest(
  55         new String[]{"-XX:+AlwaysTenure"},
  56         false /* shouldFail */,
  57         new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));
  58 
  59     runTenuringFlagsConsistencyTest(
  60         new String[]{"-XX:MaxTenuringThreshold=0"},
  61         false /* shouldFail */,
  62         new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));
  63 
  64     runTenuringFlagsConsistencyTest(
  65         new String[]{"-XX:MaxTenuringThreshold=5"},
  66         false /* shouldFail */,
  67         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 5, 5));
  68 
  69     runTenuringFlagsConsistencyTest(
  70         new String[]{"-XX:MaxTenuringThreshold=10"},
  71         false /* shouldFail */,
  72         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 10));
  73 
  74     runTenuringFlagsConsistencyTest(
  75         new String[]{"-XX:MaxTenuringThreshold=15"},
  76         false /* shouldFail */,
  77         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 15));
  78 
  79     runTenuringFlagsConsistencyTest(
  80         new String[]{"-XX:MaxTenuringThreshold=16"},
  81         false /* shouldFail */,
  82         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 16));
  83 
  84     runTenuringFlagsConsistencyTest(
  85         new String[]{"-XX:InitialTenuringThreshold=0"},
  86         false /* shouldFail */,
  87         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 0, 15));
  88 
  89     runTenuringFlagsConsistencyTest(
  90         new String[]{"-XX:InitialTenuringThreshold=5"},
  91         false /* shouldFail */,
  92         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 5, 15));
  93 
  94     runTenuringFlagsConsistencyTest(
  95         new String[]{"-XX:InitialTenuringThreshold=10"},
  96         false /* shouldFail */,
  97         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 10, 15));
  98 
  99     runTenuringFlagsConsistencyTest(
 100         new String[]{"-XX:InitialTenuringThreshold=15"},
 101         false /* shouldFail */,
 102         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 15, 15));
 103 
 104     // "Last option wins" cases
 105     runTenuringFlagsConsistencyTest(
 106         new String[]{"-XX:+AlwaysTenure", "-XX:+NeverTenure"},
 107         false /* shouldFail */,
 108         new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));
 109 
 110     runTenuringFlagsConsistencyTest(
 111         new String[]{"-XX:+NeverTenure", "-XX:+AlwaysTenure"},
 112         false /* shouldFail */,
 113         new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));
 114 
 115     runTenuringFlagsConsistencyTest(
 116         new String[]{"-XX:MaxTenuringThreshold=16", "-XX:+AlwaysTenure"},
 117         false /* shouldFail */,
 118         new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));
 119 
 120     runTenuringFlagsConsistencyTest(
 121         new String[]{"-XX:+AlwaysTenure", "-XX:MaxTenuringThreshold=16"},
 122         false /* shouldFail */,
 123         new ExpectedTenuringFlags(false /* alwaysTenure */, false /* neverTenure */, 7, 16));
 124 
 125     runTenuringFlagsConsistencyTest(
 126         new String[]{"-XX:MaxTenuringThreshold=0", "-XX:+NeverTenure"},
 127         false /* shouldFail */,
 128         new ExpectedTenuringFlags(false /* alwaysTenure */, true /* neverTenure */, 7, 16));
 129 
 130     runTenuringFlagsConsistencyTest(
 131         new String[]{"-XX:+NeverTenure", "-XX:MaxTenuringThreshold=0"},
 132         false /* shouldFail */,
 133         new ExpectedTenuringFlags(true /* alwaysTenure */, false /* neverTenure */, 0, 0));
 134 
 135     // Illegal cases
 136     runTenuringFlagsConsistencyTest(
 137         new String[]{"-XX:MaxTenuringThreshold=17"},
 138         true /* shouldFail */,
 139         new ExpectedTenuringFlags());
 140 
 141     runTenuringFlagsConsistencyTest(
 142         new String[]{"-XX:InitialTenuringThreshold=16"},
 143         true /* shouldFail */,
 144         new ExpectedTenuringFlags());
 145 
 146     runTenuringFlagsConsistencyTest(
 147         new String[]{"-XX:InitialTenuringThreshold=17"},
 148         true /* shouldFail */,
 149         new ExpectedTenuringFlags());
 150   }
 151 
 152   private static void runTenuringFlagsConsistencyTest(String[] tenuringFlags,
 153           boolean shouldFail,
 154           ExpectedTenuringFlags expectedFlags) throws Exception {
 155     List<String> vmOpts = new ArrayList<>();
 156     if (tenuringFlags.length > 0) {
 157       Collections.addAll(vmOpts, tenuringFlags);
 158     }
 159     Collections.addAll(vmOpts, "-XX:+PrintFlagsFinal", "-version");
 160 
 161     ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(vmOpts.toArray(new String[vmOpts.size()]));
 162     OutputAnalyzer output = new OutputAnalyzer(pb.start());
 163 
 164     if (shouldFail) {
 165       output.shouldHaveExitValue(1);
 166     } else {
 167       String stdout = output.getStdout();
 168       output.shouldHaveExitValue(0);
 169       checkTenuringFlagsConsistency(stdout, expectedFlags);
 170     }
 171   }
 172 
 173   private static void checkTenuringFlagsConsistency(String output, ExpectedTenuringFlags expectedFlags) {
 174     if (expectedFlags.alwaysTenure != FlagsValue.getFlagBoolValue("AlwaysTenure", output)) {
 175       throw new RuntimeException(
 176             "Actual flag AlwaysTenure " + FlagsValue.getFlagBoolValue("AlwaysTenure", output) +
 177             " is not equal to expected flag AlwaysTenure " + expectedFlags.alwaysTenure);
 178     }
 179 
 180     if (expectedFlags.neverTenure != FlagsValue.getFlagBoolValue("NeverTenure", output)) {
 181       throw new RuntimeException(
 182             "Actual flag NeverTenure " + FlagsValue.getFlagBoolValue("NeverTenure", output) +
 183             " is not equal to expected flag NeverTenure " + expectedFlags.neverTenure);
 184     }
 185 
 186     if (expectedFlags.initialTenuringThreshold != FlagsValue.getFlagLongValue("InitialTenuringThreshold", output)) {
 187       throw new RuntimeException(
 188             "Actual flag InitialTenuringThreshold " + FlagsValue.getFlagLongValue("InitialTenuringThreshold", output) +
 189             " is not equal to expected flag InitialTenuringThreshold " + expectedFlags.initialTenuringThreshold);
 190     }
 191 
 192     if (expectedFlags.maxTenuringThreshold != FlagsValue.getFlagLongValue("MaxTenuringThreshold", output)) {
 193       throw new RuntimeException(
 194             "Actual flag MaxTenuringThreshold " + FlagsValue.getFlagLongValue("MaxTenuringThreshold", output) +
 195             " is not equal to expected flag MaxTenuringThreshold " + expectedFlags.maxTenuringThreshold);
 196     }
 197   }
 198 }
 199 
 200 class ExpectedTenuringFlags {
 201     public boolean alwaysTenure;
 202     public boolean neverTenure;
 203     public long initialTenuringThreshold;
 204     public long maxTenuringThreshold;
 205 
 206     public ExpectedTenuringFlags(boolean alwaysTenure,
 207             boolean neverTenure,
 208             long initialTenuringThreshold,
 209             long maxTenuringThreshold) {
 210       this.alwaysTenure = alwaysTenure;
 211       this.neverTenure = neverTenure;
 212       this.initialTenuringThreshold = initialTenuringThreshold;
 213       this.maxTenuringThreshold = maxTenuringThreshold;
 214     }
 215     public ExpectedTenuringFlags() {}
 216 }