1 19 20 package startup; 21 22 import java.io.BufferedReader ; 23 import java.io.File ; 24 import java.io.FileReader ; 25 import java.io.IOException ; 26 import java.io.InputStream ; 27 import java.io.InputStreamReader ; 28 import java.io.PrintStream ; 29 import java.util.HashSet ; 30 import java.util.Hashtable ; 31 32 import junit.framework.Test; 33 import junit.framework.TestSuite; 34 35 import org.netbeans.junit.NbPerformanceTestCase; 36 import org.netbeans.junit.NbTestSuite; 37 38 50 public class MeasureJ2EEStartupTime extends NbPerformanceTestCase { 51 52 53 protected static final String UNIX = "unix"; 54 55 56 protected static final String WINDOWS = "windows"; 57 58 59 protected static final String UNKNOWN = "unknown"; 60 61 62 protected static int repeat = Integer.getInteger("org.netbeans.performance.repeat", 1).intValue(); 63 64 65 protected static int repeatNewUserdir = Integer.getInteger("org.netbeans.performance.repeat.with.new.userdir", 1).intValue(); 66 67 68 protected final static long UNKNOWN_TIME = -1; 69 70 71 protected static final String [][] SUPPORTED_PLATFORMS = { 72 {"Linux,i386",UNIX}, 74 {"SunOS,sparc",UNIX}, 75 {"SunOS,x86",UNIX}, 76 {"Windows_NT,x86",WINDOWS}, 77 {"Windows_2000,x86",WINDOWS}, 78 {"Windows_XP,x86",WINDOWS}, 79 {"Windows_95,x86",WINDOWS}, 80 {"Windows_98,x86",WINDOWS}, 81 {"Windows_Me,x86",WINDOWS} 82 }; 83 84 protected static final String [][] STARTUP_DATA = { 85 {"ModuleSystem.readList finished", "ModuleSystem.readList finished, took ","ms"}, 86 {"Preparation finished", "Preparation finished, took ","ms"}, 87 {"Window system loaded", "Window system loaded dT=", ""}, 88 {"Window system shown" , "Window system shown dT=",""}, 89 {"Start", "IDE starts t=", ""}, 90 {"End", "IDE is running t=", ""} 91 }; 92 93 96 public MeasureJ2EEStartupTime(java.lang.String testName) { 97 super(testName); 98 } 99 100 103 public void testStartIDE() throws IOException { 104 runIDE(getIdeHome(),new File (getWorkDir(),"ideuserdir_prepare"),getMeasureFile(0,0),0); 106 107 for (int n=1;n <= repeatNewUserdir; n++){ 108 for (int i=1; i <= repeat; i++) { 109 long measuredTime = runIDEandMeasureStartup(getMeasureFile(i,n), getUserdirFile(n),5000); 110 reportPerformance("Startup Time", measuredTime, "ms", i>1?2:1); 111 } 112 } 113 } 114 115 118 public void testStartIDEWithOpenedFiles() throws IOException { 119 for (int i=1; i <= repeat; i++) { 120 long measuredTime = runIDEandMeasureStartup(getMeasureFile(i), getUserdirFile(), 30000); 121 reportPerformance("Startup Time with opened J2EE projects", measuredTime, "ms", 2); 122 } 123 124 } 125 126 129 public void testStartIDEWithWeb() throws IOException { 130 for (int i=1; i <= repeat; i++) { 131 long measuredTime = runIDEandMeasureStartup(getMeasureFile(i), getUserdirFile(), 30000); 132 reportPerformance("Startup Time with opened Web projects", measuredTime, "ms", 2); 133 } 134 135 } 136 137 143 private long runIDEandMeasureStartup(File measureFile, File userdir, long timeout) throws IOException { 144 long startTime = runIDE(getIdeHome(),userdir,measureFile,timeout); 145 Hashtable measuredValues = parseMeasuredValues(measureFile); 146 147 if(measuredValues==null) 148 fail("It isn't possible measure startup time"); 149 150 long runTime=((Long )measuredValues.get("IDE starts t=")).longValue(); measuredValues.remove("IDE starts t="); long endTime=((Long )measuredValues.get("IDE is running t=")).longValue(); measuredValues.remove("IDE is running t="); 155 long startupTime = endTime - startTime; 156 157 System.out.println("Measured Startup Time=" + startupTime + " (run-start="+(runTime-startTime)+" , end-run="+(endTime-runTime)+")"); 158 159 if (startupTime <= 0) 160 fail("Measured value ["+startupTime+"] is not > 0 !"); 161 162 reportPerformance("IDE run",(runTime-startTime),"ms",1); 163 164 165 for(int i=0; i<STARTUP_DATA.length; i++){ 166 if(measuredValues.containsKey(STARTUP_DATA[i][1])){ 167 long value = ((Long )measuredValues.get(STARTUP_DATA[i][1])).longValue(); 168 System.out.println(STARTUP_DATA[i][0]+"="+value); 169 reportPerformance(STARTUP_DATA[i][0],value,"ms",1); 170 }else{ 171 System.out.println("Value for "+STARTUP_DATA[i][1]+" isn't present"); 172 } 173 } 174 175 return startupTime; 176 } 177 178 179 182 protected static String getPlatform() { 183 String platformString=(System.getProperty("os.name","")+","+ System.getProperty("os.arch","")).replace(' ','_'); 184 for (int i=0; i<SUPPORTED_PLATFORMS.length; i++) { 185 if (platformString.equalsIgnoreCase(SUPPORTED_PLATFORMS[i][0])) { 186 return SUPPORTED_PLATFORMS[i][1]; 187 } 188 } 189 return UNKNOWN; 190 } 191 192 193 194 200 protected static long runIDE(File ideHome, File userdir, File measureFile, long timeout) throws IOException { 201 202 if(new File (userdir, "lock").exists()) 204 fail("Original Userdir is locked!"); 205 206 String classpath = System.getProperty("performance.testutilities.dist.jar"); 208 209 String jdkhome = System.getProperty("java.home"); 211 if(jdkhome.endsWith("jre")) 212 jdkhome = jdkhome.substring(0, jdkhome.length()-4); 213 214 String platform = getPlatform(); 215 File ideBinDir = new File (ideHome,"bin"); 216 String cmd; 217 if (platform.equals(WINDOWS)) { 218 cmd = (new File (ideBinDir,"netbeans.exe")).getAbsolutePath(); 219 } else { 220 cmd = (new File (ideBinDir,"netbeans")).getAbsolutePath(); 221 } 222 cmd += " --cp:a "+classpath; 225 cmd += " --userdir "+userdir.getAbsolutePath(); 227 cmd += " --jdkhome "+jdkhome; 229 cmd += " -J-Dnetbeans.full.hack=true"; 231 cmd += " -J-Dorg.netbeans.log.startup.logfile="+measureFile.getAbsolutePath(); 233 cmd += " -J-Dorg.netbeans.log.startup=tests"; 235 cmd += " -J-Dnetbeans.close=true"; 237 cmd += " -J-Dorg.netbeans.performance.waitafterstartup="+timeout; 239 242 System.out.println("Running: "+cmd); 243 244 Runtime runtime = Runtime.getRuntime(); 245 246 long startTime=System.currentTimeMillis(); 247 248 Process ideProcess = runtime.exec(cmd,null,ideBinDir); 250 251 ThreadReader sout = new ThreadReader(ideProcess.getInputStream(), null); 254 ThreadReader serr = new ThreadReader(ideProcess.getErrorStream(), null); 255 try { 256 int exitStatus = ideProcess.waitFor(); 257 System.out.println("IDE exited with status = "+exitStatus); 258 } catch (InterruptedException ie) { 259 ie.printStackTrace(System.err); 260 IOException ioe = new IOException ("Caught InterruptedException :"+ie.getMessage()); 261 ioe.initCause(ie); 262 throw ioe; 263 } 264 265 return startTime; 266 } 267 268 272 protected File getIdeHome() throws IOException { 273 String nbHome = System.getProperty("netbeans.dest.dir"); 274 File ideHome = new File (nbHome); 275 if (!ideHome.isDirectory()) { 276 throw new IOException ("Cannot found netbeans.dest.dir - supplied value is "+nbHome); 277 } 278 return ideHome; 279 } 280 281 285 protected File getUserdirFile(int n) throws IOException { 286 return new File (getWorkDir(),"ideuserdir_"+n); 287 } 288 289 295 protected File getUserdirFile() throws IOException { 296 return new File (new File (System.getProperty("userdir.prepared"),"sys"),"ide"); 297 } 298 299 303 private File getSketchpad() throws IOException { 304 String xtestSketchpad = System.getProperty("xtest.sketchpad"); 305 if (xtestSketchpad == null) { 306 throw new IOException ("Cannot find xtest.sketchpad"); 307 } else { 308 return new File (xtestSketchpad); 309 } 310 } 311 312 313 319 protected File getMeasureFile(int i, int j) throws IOException { 320 return new File (getWorkDir(),"measured_startup_"+i+"_"+j+".txt"); 321 } 322 323 324 329 protected File getMeasureFile(int i) throws IOException { 330 return new File (getWorkDir(),"measured_startup_"+i+".txt"); 331 } 332 333 337 protected static Hashtable parseMeasuredValues(File measuredFile) { 338 Hashtable measuredValues = new Hashtable (); 339 340 Hashtable startup_data = new Hashtable (); 341 for(int i=0; i<STARTUP_DATA.length; i++) 342 startup_data.put(STARTUP_DATA[i][1], STARTUP_DATA[i][2]); 343 344 BufferedReader br = null; 345 try { 346 br = new BufferedReader (new FileReader (measuredFile)); 347 String readLine, str, value; 348 int begin, end; 349 while((readLine = br.readLine())!=null && !startup_data.isEmpty()){ 350 try { 351 java.util.Iterator iter = startup_data.keySet().iterator(); 352 while(iter.hasNext()){ 353 str = (String )iter.next(); 354 begin = readLine.indexOf(str); 355 if(begin!=-1){ 356 end = readLine.indexOf((String )startup_data.get(str)); 357 358 if(end<=begin) end=readLine.length(); 359 360 value = readLine.substring(begin+str.length(), end); 361 measuredValues.put(str, new Long (value)); 362 startup_data.remove(str); 363 break; 364 } 365 366 } 367 368 } catch (NumberFormatException nfe) { 369 nfe.printStackTrace(System.err); 370 return null; 371 } 372 } 373 return measuredValues; 374 } catch (IOException ioe) { 375 ioe.printStackTrace(System.err); 376 return null; 377 } finally { 378 if (br != null) { 379 try { 380 br.close(); 381 } catch (IOException ioe) { 382 ioe.printStackTrace(System.err); 383 return null; 384 } 385 } 386 } 387 } 388 389 390 protected static class ThreadReader implements Runnable { 391 392 private Thread thread; 393 private BufferedReader br; 394 private PrintStream out; 395 private String s; 396 397 ThreadReader(InputStream in, PrintStream out) { 398 br = new BufferedReader (new InputStreamReader (in)); 399 this.out = out; 400 thread = new Thread (this); 401 thread.start(); 402 } 403 404 public void run() { 405 Thread myThread = Thread.currentThread(); 406 while (thread == myThread) { 407 try { 408 s = br.readLine(); 409 if (s == null) { 410 stop(); 411 break; 412 } else { 413 if (out != null) { 414 out.println(s); 415 } 416 } 417 } catch (IOException ioe) { 418 ioe.printStackTrace(System.err); 419 if (out != null) { 420 out.println("Caught IOE when reading IDE's out or err streams:"+ioe); 421 } 422 stop(); 423 } 424 } 425 } 426 427 public void stop() { 428 thread = null; 429 } 430 431 } 432 433 } 434
| Popular Tags
|