mgerdin@4637: /* katleman@4916: * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. mgerdin@4637: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. mgerdin@4637: * mgerdin@4637: * This code is free software; you can redistribute it and/or modify it mgerdin@4637: * under the terms of the GNU General Public License version 2 only, as mgerdin@4637: * published by the Free Software Foundation. mgerdin@4637: * mgerdin@4637: * This code is distributed in the hope that it will be useful, but WITHOUT mgerdin@4637: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or mgerdin@4637: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License mgerdin@4637: * version 2 for more details (a copy is included in the LICENSE file that mgerdin@4637: * accompanied this code). mgerdin@4637: * mgerdin@4637: * You should have received a copy of the GNU General Public License version mgerdin@4637: * 2 along with this work; if not, write to the Free Software Foundation, mgerdin@4637: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. mgerdin@4637: * mgerdin@4637: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA mgerdin@4637: * or visit www.oracle.com if you need additional information or have any mgerdin@4637: * questions. mgerdin@4637: */ mgerdin@4637: nloodin@3681: /* ykantser@6717: * @test mgerdin@4637: * @summary Test that the diagnostic command arguemnt parser works mgerdin@4637: * @library /testlibrary /testlibrary/whitebox ykantser@6717: * @build ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.parser.* mgerdin@4637: * @run main ClassFileInstaller sun.hotspot.WhiteBox mgerdin@4637: * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ParserTest nloodin@3681: */ nloodin@3681: nloodin@3681: import java.math.BigInteger; nloodin@3681: nloodin@3681: import sun.hotspot.parser.DiagnosticCommand; nloodin@3681: import sun.hotspot.parser.DiagnosticCommand.DiagnosticArgumentType; nloodin@3681: import sun.hotspot.WhiteBox; nloodin@3681: nloodin@3681: public class ParserTest { nloodin@3681: WhiteBox wb; nloodin@3681: nloodin@3681: public ParserTest() throws Exception { nloodin@3681: wb = WhiteBox.getWhiteBox(); nloodin@3681: nloodin@3681: testNanoTime(); nloodin@3681: testJLong(); nloodin@3681: testBool(); sla@3905: testQuotes(); nloodin@3681: testMemorySize(); nloodin@3681: } nloodin@3681: nloodin@3681: public static void main(String... args) throws Exception { nloodin@3681: new ParserTest(); nloodin@3681: } nloodin@3681: nloodin@3681: public void testNanoTime() throws Exception { nloodin@3681: String name = "name"; nloodin@3681: DiagnosticCommand arg = new DiagnosticCommand(name, nloodin@3681: "desc", DiagnosticArgumentType.NANOTIME, nloodin@3681: false, "0"); nloodin@3681: DiagnosticCommand[] args = {arg}; nloodin@3681: nloodin@3681: BigInteger bi = new BigInteger("7"); nloodin@3681: //These should work nloodin@3681: parse(name, bi.toString(), name + "=7ns", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1000)); nloodin@3681: parse(name, bi.toString(), name + "=7us", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1000)); nloodin@3681: parse(name, bi.toString(), name + "=7ms", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1000)); nloodin@3681: parse(name, bi.toString(), name + "=7s", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(60)); nloodin@3681: parse(name, bi.toString() , name + "=7m", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(60)); nloodin@3681: parse(name, bi.toString() , name + "=7h", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(24)); nloodin@3681: parse(name, bi.toString() , name + "=7d", args); nloodin@3681: nloodin@3681: parse(name, "0", name + "=0", args); nloodin@3681: nloodin@3681: shouldFail(name + "=7xs", args); nloodin@3681: shouldFail(name + "=7mms", args); nloodin@3681: shouldFail(name + "=7f", args); nloodin@3681: //Currently, only value 0 is allowed without unit nloodin@3681: shouldFail(name + "=7", args); nloodin@3681: } nloodin@3681: nloodin@3681: public void testJLong() throws Exception { nloodin@3681: String name = "name"; nloodin@3681: DiagnosticCommand arg = new DiagnosticCommand(name, nloodin@3681: "desc", DiagnosticArgumentType.JLONG, nloodin@3681: false, "0"); nloodin@3681: DiagnosticCommand[] args = {arg}; nloodin@3681: nloodin@3681: wb.parseCommandLine(name + "=10", args); nloodin@3681: parse(name, "10", name + "=10", args); nloodin@3681: parse(name, "-5", name + "=-5", args); nloodin@3681: nloodin@3681: //shouldFail(name + "=12m", args); <-- should fail, doesn't nloodin@3681: } nloodin@3681: nloodin@3681: public void testBool() throws Exception { nloodin@3681: String name = "name"; nloodin@3681: DiagnosticCommand arg = new DiagnosticCommand(name, nloodin@3681: "desc", DiagnosticArgumentType.BOOLEAN, nloodin@3681: false, "false"); nloodin@3681: DiagnosticCommand[] args = {arg}; nloodin@3681: nloodin@3681: parse(name, "true", name + "=true", args); nloodin@3681: parse(name, "false", name + "=false", args); nloodin@3681: parse(name, "true", name, args); nloodin@3681: nloodin@3681: //Empty commandline to parse, tests default value nloodin@3681: //of the parameter "name" nloodin@3681: parse(name, "false", "", args); nloodin@3681: } nloodin@3681: sla@3905: public void testQuotes() throws Exception { sla@3905: String name = "name"; sla@3905: DiagnosticCommand arg1 = new DiagnosticCommand(name, sla@3905: "desc", DiagnosticArgumentType.STRING, sla@3905: false, null); sla@3905: DiagnosticCommand arg2 = new DiagnosticCommand("arg", sla@3905: "desc", DiagnosticArgumentType.STRING, sla@3905: false, null); sla@3905: DiagnosticCommand[] args = {arg1, arg2}; sla@3905: sla@3905: // try with a quoted value sla@3905: parse(name, "Recording 1", name + "=\"Recording 1\"", args); sla@3905: // try with a quoted argument sla@3905: parse(name, "myrec", "\"" + name + "\"" + "=myrec", args); sla@3905: // try with both a quoted value and a quoted argument sla@3905: parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\"", args); sla@3905: sla@3905: // now the same thing but with other arguments after sla@3905: sla@3905: // try with a quoted value sla@3905: parse(name, "Recording 1", name + "=\"Recording 1\",arg=value", args); sla@3905: // try with a quoted argument sla@3905: parse(name, "myrec", "\"" + name + "\"" + "=myrec,arg=value", args); sla@3905: // try with both a quoted value and a quoted argument sla@3905: parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\",arg=value", args); sla@3905: } sla@3905: nloodin@3681: public void testMemorySize() throws Exception { nloodin@3681: String name = "name"; nloodin@3681: String defaultValue = "1024"; nloodin@3681: DiagnosticCommand arg = new DiagnosticCommand(name, nloodin@3681: "desc", DiagnosticArgumentType.MEMORYSIZE, nloodin@3681: false, defaultValue); nloodin@3681: DiagnosticCommand[] args = {arg}; nloodin@3681: nloodin@3681: BigInteger bi = new BigInteger("7"); nloodin@3681: parse(name, bi.toString(), name + "=7b", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1024)); nloodin@3681: parse(name, bi.toString(), name + "=7k", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1024)); nloodin@3681: parse(name, bi.toString(), name + "=7m", args); nloodin@3681: nloodin@3681: bi = bi.multiply(BigInteger.valueOf(1024)); nloodin@3681: parse(name, bi.toString(), name + "=7g", args); nloodin@3681: parse(name, defaultValue, "", args); nloodin@3681: nloodin@3681: //shouldFail(name + "=7gg", args); <---- should fail, doesn't nloodin@3681: //shouldFail(name + "=7t", args); <----- should fail, doesn't nloodin@3681: } nloodin@3681: nloodin@3681: public void parse(String searchName, String expectedValue, nloodin@3681: String cmdLine, DiagnosticCommand[] argumentTypes) throws Exception { nloodin@3681: //parseCommandLine will return an object array that looks like nloodin@3681: //{, ... } nloodin@3681: Object[] res = wb.parseCommandLine(cmdLine, argumentTypes); nloodin@3681: for (int i = 0; i < res.length-1; i+=2) { nloodin@3681: String parsedName = (String) res[i]; nloodin@3681: if (searchName.equals(parsedName)) { nloodin@3681: String parsedValue = (String) res[i+1]; nloodin@3681: if (expectedValue.equals(parsedValue)) { nloodin@3681: return; nloodin@3681: } else { nloodin@3681: throw new Exception("Parsing of cmdline '" + cmdLine + "' failed!\n" nloodin@3681: + searchName + " parsed as " + parsedValue nloodin@3681: + "! Expected: " + expectedValue); nloodin@3681: } nloodin@3681: } nloodin@3681: } nloodin@3681: throw new Exception(searchName + " not found as a parsed Argument!"); nloodin@3681: } nloodin@3681: nloodin@3681: private void shouldFail(String argument, DiagnosticCommand[] argumentTypes) throws Exception { nloodin@3681: try { nloodin@3681: wb.parseCommandLine(argument, argumentTypes); nloodin@3681: throw new Exception("Parser accepted argument: " + argument); nloodin@3681: } catch (IllegalArgumentException e) { nloodin@3681: //expected nloodin@3681: } nloodin@3681: } nloodin@3681: }