1 /* 2 * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * 26 */ 27 28 package bench.serial; 29 30 import bench.ConfigFormatException; 31 import bench.Harness; 32 import bench.HtmlReporter; 33 import bench.Reporter; 34 import bench.TextReporter; 35 import bench.XmlReporter; 36 import java.io.FileInputStream; 37 import java.io.FileOutputStream; 38 import java.io.InputStream; 39 import java.io.IOException; 40 import java.io.OutputStream; 41 import java.io.PrintStream; 42 import java.util.Timer; 43 import java.util.TimerTask; 44 45 /** 46 * Object serialization benchmark mainline. 47 */ 48 public class Main { 49 50 static final String CONFFILE = "/bench/serial/config"; 51 static final String VERSION = "1.3"; 52 53 static final int TEXT = 0; 54 static final int HTML = 1; 55 static final int XML = 2; 56 57 static boolean verbose; 58 static boolean list; 59 static boolean exitOnTimer; 60 static int testDurationSeconds; 61 static volatile boolean exitRequested; 62 static Timer timer; 63 static int format = TEXT; 64 static InputStream confstr; 65 static OutputStream repstr; 66 static Harness harness; 67 static Reporter reporter; 68 69 /** 70 * Print help message. 71 */ 72 static void usage() { 73 PrintStream p = System.err; 74 p.println("\nUsage: java -jar serialbench.jar [-options]"); 75 p.println("\nwhere options are:"); 76 p.println(" -h print this message"); 77 p.println(" -v verbose mode"); 78 p.println(" -l list configuration file"); 79 p.println(" -t <num hours> repeat benchmarks for specified number of hours"); 80 p.println(" -o <file> specify output file"); 81 p.println(" -c <file> specify (non-default) configuration file"); 82 p.println(" -html format output as html (default is text)"); 83 p.println(" -xml format output as xml"); 84 } 85 86 /** 87 * Print error message and exit. 88 */ 89 static void die(String mesg) { 90 System.err.println(mesg); 91 System.exit(1); 92 } 93 94 /** 95 * Mainline parses command line, then hands off to benchmark harness. 96 */ 97 public static void main(String[] args) { 98 parseArgs(args); 99 setupStreams(); 100 if (list) { 101 listConfig(); 102 } else { 103 setupHarness(); 104 setupReporter(); 105 if (exitOnTimer) { 106 setupTimer(testDurationSeconds); 107 while (true) { 108 runBenchmarks(); 109 if (exitRequested) { 110 System.exit(0); 111 } 112 } 113 } else { 114 runBenchmarks(); 115 System.exit(0); 116 } 117 } 118 } 119 120 /** 121 * Parse command-line arguments. 122 */ 123 static void parseArgs(String[] args) { 124 for (int i = 0; i < args.length; i++) { 125 if (args[i].equals("-h")) { 126 usage(); 127 System.exit(0); 128 } else if (args[i].equals("-v")) { 129 verbose = true; 130 } else if (args[i].equals("-l")) { 131 list = true; 132 } else if (args[i].equals("-t")) { 133 if (++i >= args.length) 134 die("Error: no timeout value specified"); 135 try { 136 exitOnTimer = true; 137 testDurationSeconds = Integer.parseInt(args[i]) * 3600; 138 } catch (Exception e) { 139 die("Error: unable to determine timeout value"); 140 } 141 } else if (args[i].equals("-o")) { 142 if (++i >= args.length) 143 die("Error: no output file specified"); 144 try { 145 repstr = new FileOutputStream(args[i]); 146 } catch (IOException e) { 147 die("Error: unable to open \"" + args[i] + "\""); 148 } 149 } else if (args[i].equals("-c")) { 150 if (++i >= args.length) 151 die("Error: no config file specified"); 152 try { 153 confstr = new FileInputStream(args[i]); 154 } catch (IOException e) { 155 die("Error: unable to open \"" + args[i] + "\""); 156 } 157 } else if (args[i].equals("-html")) { 158 if (format != TEXT) 159 die("Error: conflicting formats"); 160 format = HTML; 161 } else if (args[i].equals("-xml")) { 162 if (format != TEXT) 163 die("Error: conflicting formats"); 164 format = XML; 165 } else { 166 System.err.println("Illegal option: \"" + args[i] + "\""); 167 usage(); 168 System.exit(1); 169 } 170 } 171 } 172 173 /** 174 * Set up configuration file and report streams, if not set already. 175 */ 176 static void setupStreams() { 177 if (repstr == null) 178 repstr = System.out; 179 if (confstr == null) 180 confstr = (new Main()).getClass().getResourceAsStream(CONFFILE); 181 if (confstr == null) 182 die("Error: unable to find default config file"); 183 } 184 185 /** 186 * Print contents of configuration file to selected output stream. 187 */ 188 static void listConfig() { 189 try { 190 byte[] buf = new byte[256]; 191 int len; 192 while ((len = confstr.read(buf)) != -1) 193 repstr.write(buf, 0, len); 194 } catch (IOException e) { 195 die("Error: failed to list config file"); 196 } 197 } 198 199 /** 200 * Set up the timer to end the test. 201 * 202 * @param delay the amount of delay, in seconds, before requesting 203 * the process exit 204 */ 205 static void setupTimer(int delay) { 206 timer = new Timer(true); 207 timer.schedule( 208 new TimerTask() { 209 public void run() { 210 exitRequested = true; 211 } 212 }, 213 delay * 1000); 214 } 215 216 /** 217 * Set up benchmark harness. 218 */ 219 static void setupHarness() { 220 try { 221 harness = new Harness(confstr); 222 } catch (ConfigFormatException e) { 223 String errmsg = e.getMessage(); 224 if (errmsg != null) { 225 die("Error parsing config file: " + errmsg); 226 } else { 227 die("Error: illegal config file syntax"); 228 } 229 } catch (IOException e) { 230 die("Error: failed to read config file"); 231 } 232 } 233 234 /** 235 * Setup benchmark reporter. 236 */ 237 static void setupReporter() { 238 String title = "Object Serialization Benchmark, v" + VERSION; 239 switch (format) { 240 case TEXT: 241 reporter = new TextReporter(repstr, title); 242 break; 243 244 case HTML: 245 reporter = new HtmlReporter(repstr, title); 246 break; 247 248 case XML: 249 reporter = new XmlReporter(repstr, title); 250 break; 251 252 default: 253 die("Error: unrecognized format type"); 254 } 255 } 256 257 /** 258 * Run benchmarks. 259 */ 260 static void runBenchmarks() { 261 harness.runBenchmarks(reporter, verbose); 262 } 263 }