iignatyev@6963: /* iignatyev@6963: * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. iignatyev@6963: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. iignatyev@6963: * iignatyev@6963: * This code is free software; you can redistribute it and/or modify it iignatyev@6963: * under the terms of the GNU General Public License version 2 only, as iignatyev@6963: * published by the Free Software Foundation. iignatyev@6963: * iignatyev@6963: * This code is distributed in the hope that it will be useful, but WITHOUT iignatyev@6963: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or iignatyev@6963: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License iignatyev@6963: * version 2 for more details (a copy is included in the LICENSE file that iignatyev@6963: * accompanied this code). iignatyev@6963: * iignatyev@6963: * You should have received a copy of the GNU General Public License version iignatyev@6963: * 2 along with this work; if not, write to the Free Software Foundation, iignatyev@6963: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. iignatyev@6963: * iignatyev@6963: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA iignatyev@6963: * or visit www.oracle.com if you need additional information or have any iignatyev@6963: * questions. iignatyev@6963: */ iignatyev@6963: iignatyev@6963: import java.util.Objects; iignatyev@6963: import java.util.function.BiConsumer; iignatyev@6963: import java.util.function.Function; iignatyev@6963: import sun.hotspot.WhiteBox; iignatyev@6963: import sun.management.*; iignatyev@6963: import com.sun.management.*; iignatyev@6963: import com.oracle.java.testlibrary.*; iignatyev@6963: iignatyev@6963: public final class VmFlagTest { iignatyev@6963: public static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); iignatyev@6963: iignatyev@6963: private static final String NONEXISTENT_FLAG = "NonexistentFlag"; iignatyev@6963: private final String flagName; iignatyev@6963: private final BiConsumer test; iignatyev@6963: private final BiConsumer set; iignatyev@6963: private final Function get; iignatyev@6963: iignatyev@6963: protected VmFlagTest(String flagName, BiConsumer set, iignatyev@6963: Function get, boolean isPositive) { iignatyev@6963: this.flagName = flagName; iignatyev@6963: this.set = set; iignatyev@6963: this.get = get; iignatyev@6963: if (isPositive) { iignatyev@6963: test = this::testPositive; iignatyev@6963: } else { iignatyev@6963: test = this::testNegative; iignatyev@6963: } iignatyev@6963: } iignatyev@6963: iignatyev@6963: private void setNewValue(T value) { iignatyev@6963: set.accept(flagName, value); iignatyev@6963: } iignatyev@6963: iignatyev@6963: private T getValue() { iignatyev@6963: T t = get.apply(flagName); iignatyev@6963: System.out.println("T = " + t); iignatyev@6963: return t; iignatyev@6963: } iignatyev@6963: iignatyev@6963: protected static void runTest(String existentFlag, T[] tests, iignatyev@6963: BiConsumer set, Function get) { iignatyev@6963: runTest(existentFlag, tests, tests, set, get); iignatyev@6963: } iignatyev@6963: iignatyev@6963: protected static void runTest(String existentFlag, T[] tests, iignatyev@6963: T[] results, BiConsumer set, Function get) { iignatyev@6963: if (existentFlag != null) { iignatyev@6963: new VmFlagTest(existentFlag, set, get, true).test(tests, results); iignatyev@6963: } iignatyev@6963: new VmFlagTest(NONEXISTENT_FLAG, set, get, false).test(tests, results); iignatyev@6963: } iignatyev@6963: iignatyev@6963: public final void test(T[] tests, T[] results) { iignatyev@6963: Asserts.assertEQ(tests.length, results.length, "[TESTBUG] tests.length != results.length"); iignatyev@6963: for (int i = 0, n = tests.length ; i < n; ++i) { iignatyev@6963: test.accept(tests[i], results[i]); iignatyev@6963: } iignatyev@6963: } iignatyev@6963: iignatyev@6963: protected String getVMOptionAsString() { iignatyev@6963: HotSpotDiagnosticMXBean diagnostic iignatyev@6963: = ManagementFactoryHelper.getDiagnosticMXBean(); iignatyev@6963: VMOption tmp; iignatyev@6963: try { iignatyev@6963: tmp = diagnostic.getVMOption(flagName); iignatyev@6963: } catch (IllegalArgumentException e) { iignatyev@6963: tmp = null; iignatyev@6963: } iignatyev@6963: return tmp == null ? null : tmp.getValue(); iignatyev@6963: } iignatyev@6963: iignatyev@6963: private void testPositive(T value, T expected) { iignatyev@6963: Asserts.assertEQ(getVMOptionAsString(), asString(getValue())); iignatyev@6963: setNewValue(value); iignatyev@6963: String newValue = getVMOptionAsString(); iignatyev@6963: Asserts.assertEQ(newValue, asString(expected)); iignatyev@6963: Asserts.assertEQ(getVMOptionAsString(), asString(getValue())); iignatyev@6963: } iignatyev@6963: iignatyev@6963: private void testNegative(T value, T expected) { iignatyev@6963: String oldValue = getVMOptionAsString(); iignatyev@6963: Asserts.assertEQ(oldValue, asString(getValue())); iignatyev@6963: setNewValue(value); iignatyev@6963: String newValue = getVMOptionAsString(); iignatyev@6963: Asserts.assertEQ(oldValue, newValue); iignatyev@6963: } iignatyev@6963: iignatyev@6963: private String asString(Object value) { iignatyev@6963: return value == null ? null : "" + value; iignatyev@6963: } iignatyev@6963: } iignatyev@6963: