1 /* 2 * @test ParserTest 3 * @summary verify that whitebox functions can be linked and executed 4 * @run compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI ParserTest.java 5 * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ParserTest 6 */ 7 8 import java.math.BigInteger; 9 10 import sun.hotspot.parser.DiagnosticCommand; 11 import sun.hotspot.parser.DiagnosticCommand.DiagnosticArgumentType; 12 import sun.hotspot.WhiteBox; 13 14 public class ParserTest { 15 WhiteBox wb; 16 17 public ParserTest() throws Exception { 18 wb = WhiteBox.getWhiteBox(); 19 20 testNanoTime(); 21 testJLong(); 22 testBool(); 23 testQuotes(); 24 testMemorySize(); 25 } 26 27 public static void main(String... args) throws Exception { 28 new ParserTest(); 29 } 30 31 public void testNanoTime() throws Exception { 32 String name = "name"; 33 DiagnosticCommand arg = new DiagnosticCommand(name, 34 "desc", DiagnosticArgumentType.NANOTIME, 35 false, "0"); 36 DiagnosticCommand[] args = {arg}; 37 38 BigInteger bi = new BigInteger("7"); 39 //These should work 40 parse(name, bi.toString(), name + "=7ns", args); 41 42 bi = bi.multiply(BigInteger.valueOf(1000)); 43 parse(name, bi.toString(), name + "=7us", args); 44 45 bi = bi.multiply(BigInteger.valueOf(1000)); 46 parse(name, bi.toString(), name + "=7ms", args); 47 48 bi = bi.multiply(BigInteger.valueOf(1000)); 49 parse(name, bi.toString(), name + "=7s", args); 50 51 bi = bi.multiply(BigInteger.valueOf(60)); 52 parse(name, bi.toString() , name + "=7m", args); 53 54 bi = bi.multiply(BigInteger.valueOf(60)); 55 parse(name, bi.toString() , name + "=7h", args); 56 57 bi = bi.multiply(BigInteger.valueOf(24)); 58 parse(name, bi.toString() , name + "=7d", args); 59 60 parse(name, "0", name + "=0", args); 61 62 shouldFail(name + "=7xs", args); 63 shouldFail(name + "=7mms", args); 64 shouldFail(name + "=7f", args); 65 //Currently, only value 0 is allowed without unit 66 shouldFail(name + "=7", args); 67 } 68 69 public void testJLong() throws Exception { 70 String name = "name"; 71 DiagnosticCommand arg = new DiagnosticCommand(name, 72 "desc", DiagnosticArgumentType.JLONG, 73 false, "0"); 74 DiagnosticCommand[] args = {arg}; 75 76 wb.parseCommandLine(name + "=10", args); 77 parse(name, "10", name + "=10", args); 78 parse(name, "-5", name + "=-5", args); 79 80 //shouldFail(name + "=12m", args); <-- should fail, doesn't 81 } 82 83 public void testBool() throws Exception { 84 String name = "name"; 85 DiagnosticCommand arg = new DiagnosticCommand(name, 86 "desc", DiagnosticArgumentType.BOOLEAN, 87 false, "false"); 88 DiagnosticCommand[] args = {arg}; 89 90 parse(name, "true", name + "=true", args); 91 parse(name, "false", name + "=false", args); 92 parse(name, "true", name, args); 93 94 //Empty commandline to parse, tests default value 95 //of the parameter "name" 96 parse(name, "false", "", args); 97 } 98 99 public void testQuotes() throws Exception { 100 String name = "name"; 101 DiagnosticCommand arg1 = new DiagnosticCommand(name, 102 "desc", DiagnosticArgumentType.STRING, 103 false, null); 104 DiagnosticCommand arg2 = new DiagnosticCommand("arg", 105 "desc", DiagnosticArgumentType.STRING, 106 false, null); 107 DiagnosticCommand[] args = {arg1, arg2}; 108 109 // try with a quoted value 110 parse(name, "Recording 1", name + "=\"Recording 1\"", args); 111 // try with a quoted argument 112 parse(name, "myrec", "\"" + name + "\"" + "=myrec", args); 113 // try with both a quoted value and a quoted argument 114 parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\"", args); 115 116 // now the same thing but with other arguments after 117 118 // try with a quoted value 119 parse(name, "Recording 1", name + "=\"Recording 1\",arg=value", args); 120 // try with a quoted argument 121 parse(name, "myrec", "\"" + name + "\"" + "=myrec,arg=value", args); 122 // try with both a quoted value and a quoted argument 123 parse(name, "Recording 1", "\"" + name + "\"" + "=\"Recording 1\",arg=value", args); 124 } 125 126 public void testMemorySize() throws Exception { 127 String name = "name"; 128 String defaultValue = "1024"; 129 DiagnosticCommand arg = new DiagnosticCommand(name, 130 "desc", DiagnosticArgumentType.MEMORYSIZE, 131 false, defaultValue); 132 DiagnosticCommand[] args = {arg}; 133 134 BigInteger bi = new BigInteger("7"); 135 parse(name, bi.toString(), name + "=7b", args); 136 137 bi = bi.multiply(BigInteger.valueOf(1024)); 138 parse(name, bi.toString(), name + "=7k", args); 139 140 bi = bi.multiply(BigInteger.valueOf(1024)); 141 parse(name, bi.toString(), name + "=7m", args); 142 143 bi = bi.multiply(BigInteger.valueOf(1024)); 144 parse(name, bi.toString(), name + "=7g", args); 145 parse(name, defaultValue, "", args); 146 147 //shouldFail(name + "=7gg", args); <---- should fail, doesn't 148 //shouldFail(name + "=7t", args); <----- should fail, doesn't 149 } 150 151 public void parse(String searchName, String expectedValue, 152 String cmdLine, DiagnosticCommand[] argumentTypes) throws Exception { 153 //parseCommandLine will return an object array that looks like 154 //{<name of parsed object>, <of parsed object> ... } 155 Object[] res = wb.parseCommandLine(cmdLine, argumentTypes); 156 for (int i = 0; i < res.length-1; i+=2) { 157 String parsedName = (String) res[i]; 158 if (searchName.equals(parsedName)) { 159 String parsedValue = (String) res[i+1]; 160 if (expectedValue.equals(parsedValue)) { 161 return; 162 } else { 163 throw new Exception("Parsing of cmdline '" + cmdLine + "' failed!\n" 164 + searchName + " parsed as " + parsedValue 165 + "! Expected: " + expectedValue); 166 } 167 } 168 } 169 throw new Exception(searchName + " not found as a parsed Argument!"); 170 } 171 172 private void shouldFail(String argument, DiagnosticCommand[] argumentTypes) throws Exception { 173 try { 174 wb.parseCommandLine(argument, argumentTypes); 175 throw new Exception("Parser accepted argument: " + argument); 176 } catch (IllegalArgumentException e) { 177 //expected 178 } 179 } 180 }