1 /*
   2  * Copyright (c) 2015, 2018, 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 import java.util.ArrayList;
  25 import java.util.Collections;
  26 import java.util.List;
  27 import java.util.Map;
  28 import jdk.test.lib.Asserts;
  29 import optionsvalidation.JVMOption;
  30 import optionsvalidation.JVMOptionsUtils;
  31 
  32 public class TestOptionsWithRanges {
  33 
  34     private static Map<String, JVMOption> allOptionsAsMap;
  35 
  36     private static void excludeTestMaxRange(String optionName) {
  37         JVMOption option = allOptionsAsMap.get(optionName);
  38 
  39         if (option != null) {
  40             option.excludeTestMaxRange();
  41         }
  42     }
  43 
  44     private static void excludeTestMinRange(String optionName) {
  45         JVMOption option = allOptionsAsMap.get(optionName);
  46 
  47         if (option != null) {
  48             option.excludeTestMinRange();
  49         }
  50     }
  51 
  52     private static void excludeTestRange(String optionName) {
  53         allOptionsAsMap.remove(optionName);
  54     }
  55 
  56     private static void setAllowedExitCodes(String optionName, Integer... allowedExitCodes) {
  57         JVMOption option = allOptionsAsMap.get(optionName);
  58 
  59         if (option != null) {
  60             option.setAllowedExitCodes(allowedExitCodes);
  61         }
  62     }
  63 
  64     // Return a subset of the test cases, so we can break up allOptionsAsMap into small parts
  65     // and test them in separate JTREG tests. See ./TestOptionsWithRanges_*.java
  66     //
  67     // args[] must be {part, "of", numParts}. The first part should be "1".
  68     private static List<JVMOption> getTestSubset(String[] args) throws Exception {
  69         int part = Integer.parseInt(args[0]) - 1;
  70         int numParts = Integer.parseInt(args[2]);
  71         List<String> keys = new ArrayList<>(allOptionsAsMap.keySet());
  72         Collections.sort(keys);
  73         int numTests = keys.size();
  74         int start = numTests * (part    ) / numParts;
  75         int end   = numTests * (part + 1) / numParts;
  76 
  77         List<JVMOption> subset = new ArrayList<>();
  78         for (int i=start; i < end; i++) {
  79             subset.add(allOptionsAsMap.get(keys.get(i)));
  80         }
  81         System.out.println("Generating subset [" + start + " ... " + end + ") of " +
  82                            subset.size() + " tests out of " + keys.size() + " total tests");
  83         return subset;
  84     }
  85 
  86     public static void main(String[] args) throws Exception {
  87         int failedTests;
  88 
  89         allOptionsAsMap = JVMOptionsUtils.getOptionsWithRangeAsMap(origin -> (!(origin.contains("develop") || origin.contains("notproduct"))));
  90 
  91         /*
  92          * Remove CICompilerCount from testing because currently it can hang system
  93          */
  94         excludeTestMaxRange("CICompilerCount");
  95 
  96         /*
  97          * Exclude MallocMaxTestWords as it is expected to exit VM at small values (>=0)
  98          */
  99         excludeTestMinRange("MallocMaxTestWords");
 100 
 101         /*
 102          * Exclude CMSSamplingGrain as it can cause intermittent failures on Windows
 103          */
 104         excludeTestRange("CMSSamplingGrain");
 105 
 106         /*
 107          * Exclude below options as their maximum value would consume too much memory
 108          * and would affect other tests that run in parallel.
 109          */
 110         excludeTestMaxRange("ConcGCThreads");
 111         excludeTestMaxRange("G1ConcRefinementThreads");
 112         excludeTestMaxRange("G1RSetRegionEntries");
 113         excludeTestMaxRange("G1RSetSparseRegionEntries");
 114         excludeTestMaxRange("G1UpdateBufferSize");
 115         excludeTestMaxRange("InitialBootClassLoaderMetaspaceSize");
 116         excludeTestMaxRange("InitialHeapSize");
 117         excludeTestMaxRange("MaxHeapSize");
 118         excludeTestMaxRange("MaxRAM");
 119         excludeTestMaxRange("NewSize");
 120         excludeTestMaxRange("OldSize");
 121         excludeTestMaxRange("ParallelGCThreads");
 122         excludeTestMaxRange("TLABSize");
 123 
 124         /*
 125          * Remove parameters controlling the code cache. As these
 126          * parameters have implications on the physical memory
 127          * reserved by the VM, setting them to large values may hang
 128          * the system and/or may cause concurrently executed tests to
 129          * fail. These parameters are rigorously checked when the code
 130          * cache is initialized (see
 131          * hotspot/src/shared/vm/code/codeCache.cpp), therefore
 132          * omitting testing for them does not pose a problem.
 133          */
 134         excludeTestMaxRange("InitialCodeCacheSize");
 135         excludeTestMaxRange("CodeCacheMinimumUseSpace");
 136         excludeTestMaxRange("ReservedCodeCacheSize");
 137         excludeTestMaxRange("NonProfiledCodeHeapSize");
 138         excludeTestMaxRange("ProfiledCodeHeapSize");
 139         excludeTestMaxRange("NonNMethodCodeHeapSize");
 140         excludeTestMaxRange("CodeCacheExpansionSize");
 141 
 142         List<JVMOption> testSubset = getTestSubset(args);
 143 
 144         Asserts.assertGT(testSubset.size(), 0, "Options with ranges not found!");
 145 
 146         System.out.println("Parsed " + testSubset.size() + " options with ranges. Start test!");
 147 
 148         failedTests = JVMOptionsUtils.runCommandLineTests(testSubset);
 149 
 150         Asserts.assertEQ(failedTests, 0,
 151                 String.format("%d tests failed! %s", failedTests, JVMOptionsUtils.getMessageWithFailures()));
 152     }
 153 }