< prev index next >

test/jtreg-ext/requires/VMProps.java

Print this page
rev 59593 : [mq]: 8246494

@@ -29,14 +29,16 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;

@@ -113,10 +115,11 @@
         map.put("vm.compiler1.enabled", this::isCompiler1Enabled);
         map.put("vm.compiler2.enabled", this::isCompiler2Enabled);
         map.put("docker.support", this::dockerSupport);
         map.put("release.implementor", this::implementor);
         map.put("test.vm.gc.nvdimm", this::isNvdimmTestEnabled);
+        map.put("vm.flagless", this::isFlagless);
         vmGC(map); // vm.gc.X = true/false
         vmOptFinalFlags(map);
 
         dump(map.map);
         return map.map;

@@ -500,10 +503,69 @@
         String isEnabled = System.getenv("TEST_VM_GC_NVDIMM");
         return "" + "true".equalsIgnoreCase(isEnabled);
     }
 
     /**
+     * Checks if we are in <i>almost</i> out-of-box configuration, i.e. the flags
+     * which JVM is started with don't affect its behavior "significantly".
+     * {@code TEST_VM_FLAGLESS} enviroment variable can be used to force this
+     * method to return true and allow any flags.
+     *
+     * @return true if there are no JVM flags
+     */
+    private String isFlagless() {
+        boolean result = true;
+        if (System.getenv("TEST_VM_FLAGLESS") != null) {
+            return "" + result;
+        }
+
+        List<String> allFlags = new ArrayList<String>();
+        Collections.addAll(allFlags, System.getProperty("test.vm.opts", "").trim().split("\\s+"));
+        Collections.addAll(allFlags, System.getProperty("test.java.opts", "").trim().split("\\s+"));
+
+        // check -XX flags
+        var ignoredXXFlags = Set.of(
+                // added by run-test framework
+                "MaxRAMPercentage",
+                // added by test environment
+                "CreateCoredumpOnCrash"
+        );
+        result &= allFlags.stream()
+                          .filter(s -> s.startsWith("-XX:"))
+                          // map to names:
+                              // remove -XX:
+                              .map(s -> s.substring(4))
+                              // remove +/- from bool flags
+                              .map(s -> s.charAt(0) == '+' || s.charAt(0) == '-' ? s.substring(1) : s)
+                              // remove =.* from others
+                              .map(s -> s.contains("=") ? s.substring(0, s.indexOf('=')) : s)
+                          // skip known-to-be-there flags
+                          .filter(s -> !ignoredXXFlags.contains(s))
+                          .findAny()
+                          .isEmpty();
+
+        // check -X flags
+        var ignoredXFlags = Set.of(
+                // default, yet still seen to be explicitly set
+                "mixed"
+        );
+        result &= allFlags.stream()
+                          .filter(s -> s.startsWith("-X") && !s.startsWith("-XX:"))
+                          // map to names:
+                              // remove -X
+                              .map(s -> s.substring(2))
+                              // remove :.* from flags with values
+                              .map(s -> s.contains(":") ? s.substring(0, s.indexOf(':')) : s)
+                          // skip known-to-be-there flags
+                          .filter(s -> !ignoredXFlags.contains(s))
+                          .findAny()
+                          .isEmpty();
+
+        return "" + result;
+    }
+
+    /**
      * Dumps the map to the file if the file name is given as the property.
      * This functionality could be helpful to know context in the real
      * execution.
      *
      * @param map
< prev index next >