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         testMemorySize();
  24     }
  25 
  26     public static void main(String... args) throws Exception  {
  27          new ParserTest();
  28     }
  29 
  30     public void testNanoTime() throws Exception {
  31         String name = "name";
  32         DiagnosticCommand arg = new DiagnosticCommand(name,
  33                 "desc", DiagnosticArgumentType.NANOTIME,
  34                 false, "0");
  35         DiagnosticCommand[] args = {arg};
  36 
  37         BigInteger bi = new BigInteger("7");
  38         //These should work
  39         parse(name, bi.toString(), name + "=7ns", args);
  40 
  41         bi = bi.multiply(BigInteger.valueOf(1000));
  42         parse(name, bi.toString(), name + "=7us", args);
  43 
  44         bi = bi.multiply(BigInteger.valueOf(1000));
  45         parse(name, bi.toString(), name + "=7ms", args);
  46 
  47         bi = bi.multiply(BigInteger.valueOf(1000));
  48         parse(name, bi.toString(), name + "=7s", args);
  49 
  50         bi = bi.multiply(BigInteger.valueOf(60));
  51         parse(name, bi.toString() , name + "=7m", args);
  52 
  53         bi = bi.multiply(BigInteger.valueOf(60));
  54         parse(name, bi.toString() , name + "=7h", args);
  55 
  56         bi = bi.multiply(BigInteger.valueOf(24));
  57         parse(name, bi.toString() , name + "=7d", args);
  58 
  59         parse(name, "0", name + "=0", args);
  60 
  61         shouldFail(name + "=7xs", args);
  62         shouldFail(name + "=7mms", args);
  63         shouldFail(name + "=7f", args);
  64         //Currently, only value 0 is allowed without unit
  65         shouldFail(name + "=7", args);
  66     }
  67 
  68     public void testJLong() throws Exception {
  69         String name = "name";
  70         DiagnosticCommand arg = new DiagnosticCommand(name,
  71                 "desc", DiagnosticArgumentType.JLONG,
  72                 false, "0");
  73         DiagnosticCommand[] args = {arg};
  74 
  75         wb.parseCommandLine(name + "=10", args);
  76         parse(name, "10", name + "=10", args);
  77         parse(name, "-5", name + "=-5", args);
  78 
  79         //shouldFail(name + "=12m", args); <-- should fail, doesn't
  80     }
  81 
  82     public void testBool() throws Exception {
  83         String name = "name";
  84         DiagnosticCommand arg = new DiagnosticCommand(name,
  85                 "desc", DiagnosticArgumentType.BOOLEAN,
  86                 false, "false");
  87         DiagnosticCommand[] args = {arg};
  88 
  89         parse(name, "true", name + "=true", args);
  90         parse(name, "false", name + "=false", args);
  91         parse(name, "true", name, args);
  92 
  93         //Empty commandline to parse, tests default value
  94         //of the parameter "name"
  95         parse(name, "false", "", args);
  96     }
  97 
  98     public void testMemorySize() throws Exception {
  99         String name = "name";
 100         String defaultValue = "1024";
 101         DiagnosticCommand arg = new DiagnosticCommand(name,
 102                 "desc", DiagnosticArgumentType.MEMORYSIZE,
 103                 false, defaultValue);
 104         DiagnosticCommand[] args = {arg};
 105 
 106         BigInteger bi = new BigInteger("7");
 107         parse(name, bi.toString(), name + "=7b", args);
 108 
 109         bi = bi.multiply(BigInteger.valueOf(1024));
 110         parse(name, bi.toString(), name + "=7k", args);
 111 
 112         bi = bi.multiply(BigInteger.valueOf(1024));
 113         parse(name, bi.toString(), name + "=7m", args);
 114 
 115         bi = bi.multiply(BigInteger.valueOf(1024));
 116         parse(name, bi.toString(), name + "=7g", args);
 117         parse(name, defaultValue, "", args);
 118 
 119         //shouldFail(name + "=7gg", args); <---- should fail, doesn't
 120         //shouldFail(name + "=7t", args);  <----- should fail, doesn't
 121     }
 122 
 123     public void parse(String searchName, String expectedValue,
 124             String cmdLine, DiagnosticCommand[] argumentTypes) throws Exception {
 125         //parseCommandLine will return an object array that looks like
 126         //{<name of parsed object>, <of parsed object> ... }
 127         Object[] res = wb.parseCommandLine(cmdLine, argumentTypes);
 128         for (int i = 0; i < res.length-1; i+=2) {
 129             String parsedName = (String) res[i];
 130             if (searchName.equals(parsedName)) {
 131                 String parsedValue = (String) res[i+1];
 132                 if (expectedValue.equals(parsedValue)) {
 133                     return;
 134                 } else {
 135                     throw new Exception("Parsing of cmdline '" + cmdLine + "' failed!\n"
 136                             + searchName + " parsed as " + parsedValue
 137                             + "! Expected: " + expectedValue);
 138                 }
 139             }
 140         }
 141         throw new Exception(searchName + " not found as a parsed Argument!");
 142     }
 143 
 144     private void shouldFail(String argument, DiagnosticCommand[] argumentTypes) throws Exception {
 145         try {
 146             wb.parseCommandLine(argument, argumentTypes);
 147             throw new Exception("Parser accepted argument: " + argument);
 148         } catch (IllegalArgumentException e) {
 149             //expected
 150         }
 151     }
 152 }