nloodin@3681: /* nloodin@3681: * @test ParserTest nloodin@3681: * @summary verify that whitebox functions can be linked and executed nloodin@3681: * @run compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI ParserTest.java nloodin@3681: * @run main/othervm -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: }