Vogar.java revision 06f9cc5c1a455157ff325c64d89acd1aade05f34
17850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com/* 27850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * Copyright (C) 2009 The Android Open Source Project 37850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * 47850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 57850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * you may not use this file except in compliance with the License. 67850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * You may obtain a copy of the License at 77850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * 87850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * http://www.apache.org/licenses/LICENSE-2.0 97850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * 107850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * Unless required by applicable law or agreed to in writing, software 117850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * distributed under the License is distributed on an "AS IS" BASIS, 127850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * See the License for the specific language governing permissions and 147850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * limitations under the License. 157850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com */ 167850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 177850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.compackage vogar; 187850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 19d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.comimport com.google.common.collect.Lists; 207850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.io.File; 217850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.io.IOException; 227850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.util.ArrayList; 237850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.util.LinkedHashSet; 247850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.util.List; 257850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.comimport java.util.Set; 26969d5622a380e2f2f9ebdfbf7a22cbb3e031125bjessewilson@google.comimport vogar.android.AndroidSdk; 27c7b173425beec5784c669388345eb3b7b96fc341enh@google.comimport vogar.util.Strings; 287850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 297850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com/** 307850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com * Command line interface for running benchmarks and tests on dalvik. 317850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com */ 327850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.compublic final class Vogar { 33f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com static final int LARGE_TIMEOUT_MULTIPLIER = 10; 343b3cf36f62d25eb950f0bf95071a82b83e730a58jessewilson@google.com public static final int NUM_PROCESSORS = Runtime.getRuntime().availableProcessors(); 358c03f5a6370cf6521384a268e12808e163ae4339jessewilson@google.com 36d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private final List<File> actionFiles = new ArrayList<File>(); 37d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private final List<String> actionClassesAndPackages = new ArrayList<String>(); 38f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com final List<String> targetArgs = new ArrayList<String>(); 39fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com private final OptionParser optionParser = new OptionParser(this); 4025d56e71aa66d20d4326eee3696f4ce060201708bdc@google.com private File configFile = Vogar.dotFile(".vogarconfig"); 41c7b173425beec5784c669388345eb3b7b96fc341enh@google.com private String[] configArgs; 4225d56e71aa66d20d4326eee3696f4ce060201708bdc@google.com 43969d5622a380e2f2f9ebdfbf7a22cbb3e031125bjessewilson@google.com public static File dotFile (String name) { 4425d56e71aa66d20d4326eee3696f4ce060201708bdc@google.com return new File(System.getProperty("user.home", "."), name); 4525d56e71aa66d20d4326eee3696f4ce060201708bdc@google.com } 4625d56e71aa66d20d4326eee3696f4ce060201708bdc@google.com 47d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--expectations" }) 48f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com Set<File> expectationFiles = new LinkedHashSet<File>(); 49d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com { 509f9a3ba8e244912c50140ba15ec583a8098dca41enh@google.com expectationFiles.addAll(AndroidSdk.defaultExpectations()); 51d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 527850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 53d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--mode" }) 54c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com ModeId modeId = ModeId.DEVICE; 55c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 5606f9cc5c1a455157ff325c64d89acd1aade05f34Nicolas Geoffray @Option(names = { "--variant" }) 57c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com Variant variant = Variant.X32; 587850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 590eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com @Option(names = { "--ssh" }) 600eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com String sshHost; 610eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com 62d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--timeout" }) 63f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int timeoutSeconds = 1 * 60; // default is one minute; 647850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 65126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com @Option(names = { "--first-monitor-port" }) 66f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int firstMonitorPort = -1; 67126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com 68d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--clean-before" }) 69f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean cleanBefore = true; 707850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 71d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--clean-after" }) 72f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean cleanAfter = true; 737850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 74d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--clean" }) 75d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private boolean clean = true; 767850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 77d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--xml-reports-directory" }) 78f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File xmlReportsDirectory; 797850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 80d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--indent" }) 81f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com String indent = " "; 827850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 83d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--verbose" }) 84f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean verbose; 857850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 86d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--stream" }) 87f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean stream = true; 887850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 89d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--color" }) 90f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean color = true; 917850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 9250bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com @Option(names = { "--pass-color" }) 93f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int passColor = 32; // green 9450bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com 9550bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com @Option(names = { "--warn-color" }) 96f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int warnColor = 33; // yellow 9750bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com 9850bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com @Option(names = { "--fail-color" }) 99f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int failColor = 31; // red 10050bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com 1010942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com @Option(names = { "--ansi" }) 102f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean ansi = !"dumb".equals(System.getenv("TERM")); 1030942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com 104d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--debug" }) 105f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com Integer debugPort; 106d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 1073d6e772fe3a0d392af6f6ca008c556ba7c253503bdc@google.com @Option(names = { "--device-dir" }) 1080eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com File deviceDir; 109d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 110d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--vm-arg" }) 111f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<String> vmArgs = new ArrayList<String>(); 112d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 113f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com @Option(names = { "--vm-command" }) 114f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com String vmCommand; 115f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 116f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com @Option(names = { "--dalvik-cache" }) 117f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com String dalvikCache = "dalvik-cache"; 118f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 119d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--java-home" }) 120f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File javaHome; 121d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 122d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--javac-arg" }) 123f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<String> javacArgs = new ArrayList<String>(); 124d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 12582131e6aba37e8b6f8ebbadbbe57fb5a78b4f743jessewilson@google.com @Option(names = { "--use-bootclasspath" }) 126f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean useBootClasspath = false; 127d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 128d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--build-classpath" }) 129f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> buildClasspath = new ArrayList<File>(); 130d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 131d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--classpath", "-cp" }) 132f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> classpath = new ArrayList<File>(); 133d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 1345379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com @Option(names = { "--resource-classpath" }) 1355379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com List<File> resourceClasspath = new ArrayList<File>(); 1365379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com { 1375379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com resourceClasspath.addAll(AndroidSdk.defaultResourceClassPath()); 1385379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com } 1395379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com 140d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--sourcepath" }) 141f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> sourcepath = new ArrayList<File>(); 142dd2774574cb456b48b8ec2aafbf0e6583f4faa41enh@google.com { 143dd2774574cb456b48b8ec2aafbf0e6583f4faa41enh@google.com sourcepath.addAll(AndroidSdk.defaultSourcePath()); 144dd2774574cb456b48b8ec2aafbf0e6583f4faa41enh@google.com } 145d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 146d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com @Option(names = { "--jar-search-dir" }) 147f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> jarSearchDirs = Lists.newArrayList(); 148d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 149d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com @Option(names = { "--vogar-dir" }) 150f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File vogarDir = Vogar.dotFile(".vogar"); 1514cb68042e7513b3f9444a17d91eb0d92480a74b4jsharpe@google.com 152d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com @Option(names = { "--record-results" }) 153f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean recordResults = false; 154d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 155d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com @Option(names = { "--results-dir" }) 156f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File resultsDir = null; 157d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 1583dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com @Option(names = { "--suggest-classpaths" }) 159f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean suggestClasspaths = false; 1603dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com 1610ebefc061203658ed8b7f5df31a65d2cf6ea89b2jsharpe@google.com @Option(names = { "--invoke-with" }) 162f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com String invokeWith = null; 1635bbc674fa121ae7898bfa6987e7a39c5ba4299e2enh@google.com 164e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com @Option(names = { "--benchmark" }) 165f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean benchmark = false; 166e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com 16734688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com @Option(names = { "--open-bugs-command" }) 168f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com String openBugsCommand; 16934688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com 1701bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com @Option(names = { "--profile" }) 171f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean profile = false; 1721bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com 17334b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com @Option(names = { "--profile-binary" }) 174f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean profileBinary = false; 17534b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com 1761bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com @Option(names = { "--profile-file" }) 177f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File profileFile; 1781bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com 1791bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com @Option(names = { "--profile-depth" }) 180f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int profileDepth = 4; 1811bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com 1821bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com @Option(names = { "--profile-interval" }) 183f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int profileInterval = 10; 1841bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com 1851bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com @Option(names = { "--profile-thread-group" }) 186f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean profileThreadGroup = false; 1871bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com 188d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private Vogar() {} 189d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 190d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private void printUsage() { 191fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com // have to reset fields so that "Default is: FOO" lines are accurate 192fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com optionParser.reset(); 193fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com 194d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Usage: Vogar [options]... <actions>... [-- target args]..."); 195d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 196d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" <actions>: .java files, directories, or class names."); 197d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" These should be JUnit tests, jtreg tests, Caliper benchmarks"); 198d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" or executable Java classes."); 199d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 20072c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(" When passing in a JUnit test class, it may have \"#method_name\""); 20172c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(" appended to it, to specify a single test method."); 20272c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(); 203d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" [args]: arguments passed to the target process. This is only useful when"); 204d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" the target process is a Caliper benchmark or main method."); 205d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 206d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("GENERAL OPTIONS"); 207d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 208c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" --mode <activity|device|device_dalvik|host|host_dalvik|jvm>: specify which environment to run in."); 209d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" activity: runs in an Android application on a device or emulator"); 210c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device: runs in an ART runtime on a device or emulator"); 211c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device_dalvik: runs in a Dalvik runtime on a device or emulator"); 212c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device_art_kitkat: runs in a KitKat ART runtime on a device or emulator"); 213c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host: runs in an ART runtime on the local desktop built with any lunch combo."); 214c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host_dalvik: runs in a Dalvik runtime on the local desktop built with any lunch combo."); 215c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host_art_kitkat: runs in a KitKat ART runtime on the local desktop built with any lunch combo."); 21679e4231584a3b24b44f42224475d41fcbe957af4jessewilson@google.com System.out.println(" jvm: runs in a Java VM on the local desktop"); 217c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is: " + modeId); 218c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(); 219c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" --variant <x32>: specify which architecture variant to execute with."); 220c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" x32: 32-bit"); 221c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is: " + variant); 222d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 2230eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com System.out.println(" --ssh <host:port>: target a remote machine via SSH."); 2240eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com System.out.println(); 225d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean: synonym for --clean-before and --clean-after (default)."); 226d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Disable with --no-clean if you want no files removed."); 227d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 228d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --stream: stream output as it is emitted."); 229d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 230e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" --benchmark: for use with dalvikvm, this dexes all files together,"); 231e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" and is mandatory for running Caliper benchmarks, and a good idea"); 232e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" other performance sensitive code."); 233e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(); 23434b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" --profile: run with a profiler to produce an hprof file."); 23534b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(); 23634b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" --profile-binary: produce a binary hprof file instead of the default ASCII."); 2371bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2381bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-file <filename>: filename for hprof profile data."); 23934b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" Default is java.hprof.txt in ASCII mode and java.hprof in binary mode."); 2401bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2411bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-depth <count>: number of frames in profile stack traces."); 2421bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileDepth); 2431bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2441bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-interval <milliseconds>: interval between profile samples."); 2451bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileInterval); 2461bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2471bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-thread-group: profile thread group instead of single thread in dalvikvms"); 2481bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Note --mode jvm only supports full VM profiling."); 2491bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileThreadGroup); 2501bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2515b644afaebd7afc43f75010b7c32f02129638a49bdc@google.com System.out.println(" --invoke-with: provide a command to invoke the VM with. Examples:"); 2525b644afaebd7afc43f75010b7c32f02129638a49bdc@google.com System.out.println(" --mode host --invoke-with \"valgrind --leak-check=full\""); 253fe3edd898b04ad1647a8fe4914a70245c01dc03abdc@google.com System.out.println(" --mode device --invoke-with \"strace -f -o/sdcard/strace.txt\""); 2545bbc674fa121ae7898bfa6987e7a39c5ba4299e2enh@google.com System.out.println(); 255d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --timeout <seconds>: maximum execution time of each action before the"); 256d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" runner aborts it. Specifying zero seconds or using --debug will"); 2578c03f5a6370cf6521384a268e12808e163ae4339jessewilson@google.com System.out.println(" disable the execution timeout. Tests tagged with 'large' will time"); 2588c03f5a6370cf6521384a268e12808e163ae4339jessewilson@google.com System.out.println(" out in " + LARGE_TIMEOUT_MULTIPLIER + "x this timeout."); 259d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: " + timeoutSeconds); 260d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 261d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --xml-reports-directory <path>: directory to emit JUnit-style"); 262d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" XML test results."); 263d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 264d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --classpath <jar file>: add the .jar to both build and execute classpaths."); 265d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 266ba0670d6c4481a866ae558d4e31f8004c709dd77jessewilson@google.com System.out.println(" --use-bootclasspath: use the classpath as search path for bootstrap classes."); 267d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 268d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --build-classpath <element>: add the directory or .jar to the build"); 269d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" classpath. Such classes are available as build dependencies, but"); 270d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" not at runtime."); 271d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 272d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --sourcepath <directory>: add the directory to the build sourcepath."); 273d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 274d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --vogar-dir <directory>: directory in which to find Vogar"); 275f7cb247687b72084b71a434a25d8b3c320071a96jessewilson@google.com System.out.println(" configuration information, caches, saved and results"); 2766a52e048641707c987c6a00691ba8c9f891ccf00jsharpe@google.com System.out.println(" unless they've been put explicitly elsewhere."); 277d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" Default is: " + vogarDir); 2784cb68042e7513b3f9444a17d91eb0d92480a74b4jsharpe@google.com System.out.println(); 279d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --record-results: record test results for future comparison."); 280d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 281d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --results-dir <directory>: read and write (if --record-results used)"); 282d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" results from and to this directory."); 283d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 284d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --verbose: turn on persistent verbose output."); 285d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 286d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("TARGET OPTIONS"); 287d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 288d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --debug <port>: enable Java debugging on the specified port."); 289d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" This port must be free both on the device and on the local"); 290d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" system. Disables the timeout specified by --timeout-seconds."); 291d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 2923d6e772fe3a0d392af6f6ca008c556ba7c253503bdc@google.com System.out.println(" --device-dir <directory>: use the specified directory for"); 293d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" on-device temporary files and code."); 294d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 295d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --vm-arg <argument>: include the specified argument when spawning a"); 296d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" virtual machine. Examples: -Xint:fast, -ea, -Xmx16M"); 297d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 298f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" --vm-command <argument>: override default vm executable name."); 299c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is 'java' for the JVM and a version of dalvikvm for the host and target."); 300f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(); 301d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --java-home <java_home>: execute the actions on the local workstation"); 302d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" using the specified java home directory. This does not impact"); 303d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" which javac gets used. When unset, java is used from the PATH."); 304d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 305d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("EXOTIC OPTIONS"); 306d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 3073dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" --suggest-classpaths: build an index of jar files under the"); 308d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" directories given by --jar-search-dir arguments. If Vogar then "); 309d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" fails due to missing classes or packages, it will use the index to"); 310d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" diagnose the problem and suggest a fix."); 3113dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(); 3123dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" Currently only looks for jars called exactly \"classes.jar\"."); 3133dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(); 314d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --jar-search-dir <directory>: a directory that should be searched for"); 315d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" jar files to add to the class file index for use with"); 316d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --suggest-classpaths."); 317d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 318d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean-before: remove working directories before building and"); 319d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" running (default). Disable with --no-clean-before if you are"); 320d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" using interactively with your own temporary input files."); 321d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 322d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean-after: remove temporary files after running (default)."); 323d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Disable with --no-clean-after and use with --verbose if"); 324d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" you'd like to manually re-run commands afterwards."); 325d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 326d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --color: format output in technicolor."); 327d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 32850bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" --pass-color: ANSI color code to use for passes."); 32950bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 32 (green)"); 33050bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 33150bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" --warn-color: ANSI color code to use for warnings."); 33250bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 33 (yellow)"); 33350bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 33450bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" --fail-color: ANSI color code to use for failures."); 33550bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 31 (red)"); 33650bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 337dc0120df8603b26adfd4ddfbeac422ff99a002b5jessewilson@google.com System.out.println(" --ansi: use ANSI escape sequences to remove intermediate output."); 3380942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com System.out.println(); 339d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --expectations <file>: include the specified file when looking for"); 340d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" action expectations. The file should include qualified action names"); 341d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" and the corresponding expected output."); 342d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: " + expectationFiles); 343d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 3443dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" --indent: amount to indent action result output. Can be set to ''"); 345d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" (aka empty string) to simplify output parsing."); 346d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: '" + indent + "'"); 347d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 348d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --javac-arg <argument>: include the specified argument when invoking"); 349d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" javac. Examples: --javac-arg -Xmaxerrs --javac-arg 1"); 350d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 351f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" --dalvik-cache <argument>: override default dalvik-cache location."); 352f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" Default is: " + dalvikCache); 353f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(); 354126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" --first-monitor-port <port>: the port on the host (and possibly target)"); 355126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" used to traffic control messages between vogar and forked processes."); 356126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" Use this to avoid port conflicts when running multiple vogar instances"); 357126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" concurrently. Vogar will use up to N ports starting with this one,"); 358126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" where N is the number of processors on the host (" + NUM_PROCESSORS + "). "); 359126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(); 36034688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" --open-bugs-command <command>: a command that will take bug IDs as parameters"); 36134688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" and return those bugs that are still open. For example, if bugs 123 and"); 36234688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 789 are both open, the command should echo those values:"); 36334688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" $ ~/bin/bug-command 123 456 789"); 36434688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 123"); 36534688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 789"); 36634688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(); 367d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println("CONFIG FILE"); 368d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 369d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" User-defined default arguments can be specified in ~/.vogarconfig. See"); 370d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" .vogarconfig.example for an example."); 371d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 372d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 373d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 374d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private boolean parseArgs(String[] args) { 375d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // extract arguments from config file 376c7b173425beec5784c669388345eb3b7b96fc341enh@google.com configArgs = optionParser.readFile(configFile); 377d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 378d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // config file args are added first so that in a conflict, the currently supplied 379d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // arguments win. 380c7b173425beec5784c669388345eb3b7b96fc341enh@google.com List<String> actionsAndTargetArgs = optionParser.parse(configArgs); 3818918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com if (!actionsAndTargetArgs.isEmpty()) { 3828918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com throw new RuntimeException( 3838918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com "actions or targets given in .vogarconfig: " + actionsAndTargetArgs); 3848918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com } 385d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 386d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com try { 387d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com actionsAndTargetArgs.addAll(optionParser.parse(args)); 388d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } catch (RuntimeException e) { 389d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(e.getMessage()); 390d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 391d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 392d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 393d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 394d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // Semantic error validation 395d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 396d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 397d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (javaHome != null && !new File(javaHome, "/bin/java").exists()) { 398d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Invalid java home: " + javaHome); 399d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 400d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4017850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 402d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // check vm option consistency 403c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.acceptsVmArgs() && !vmArgs.isEmpty()) { 404c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("VM args " + vmArgs + " should not be specified for mode " + modeId); 405c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return false; 406c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 407c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 408c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com // Check variant / mode compatibility. 409c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.supportsVariant(variant)) { 410c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("Variant " + variant + " not supported for mode " + modeId); 411d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 412d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 413d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 414d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (xmlReportsDirectory != null && !xmlReportsDirectory.isDirectory()) { 415d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Invalid XML reports directory: " + xmlReportsDirectory); 416d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 417d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 418d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 419d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (!clean) { 420d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com cleanBefore = false; 421d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com cleanAfter = false; 422d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4237850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 424d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 425d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // Post-processing arguments 426d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 427d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 428f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com if (vmCommand == null) { 429c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com vmCommand = modeId.defaultVmCommand(variant); 430f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 431f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 4328627ce00fa3feb5d0ade63eb1a5ec41bbfad4282enh@google.com // disable timeout when benchmarking or debugging 4338627ce00fa3feb5d0ade63eb1a5ec41bbfad4282enh@google.com if (benchmark || debugPort != null) { 434d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com timeoutSeconds = 0; 435d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 436d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 437126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com if (firstMonitorPort == -1) { 438c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com firstMonitorPort = modeId.isLocal() ? 8788 : 8787; 439126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com } 440126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com 44134b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com if (profileFile == null) { 44234b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com profileFile = new File(profileBinary ? "java.hprof" : "java.hprof.txt"); 44334b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com } 44434b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com 445d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // separate the actions and the target args 446d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com int index = 0; 447d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com for (; index < actionsAndTargetArgs.size(); index++) { 448d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com String arg = actionsAndTargetArgs.get(index); 449d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (arg.equals("--")) { 450d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com index++; 451d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com break; 4527850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 4537850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 454d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com File file = new File(arg); 455d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (file.exists()) { 456d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (arg.endsWith(".java") || file.isDirectory()) { 457995a215ce56a98ed522888b0fdc286cd612c0218jessewilson@google.com actionFiles.add(file.getAbsoluteFile()); 458d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } else { 459d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Expected a .jar file, .java file, directory, " 460d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com + "package name or classname, but was: " + arg); 461d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 462d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 463d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } else { 464d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com actionClassesAndPackages.add(arg); 4657850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 466d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 467d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 468d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com targetArgs.addAll(actionsAndTargetArgs.subList(index, actionsAndTargetArgs.size())); 4697850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 470d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (actionFiles.isEmpty() && actionClassesAndPackages.isEmpty()) { 471d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("No actions provided."); 472d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 4737850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 4747850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 475c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.acceptsVmArgs() && !targetArgs.isEmpty()) { 476c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("Target args " + targetArgs + " should not be specified for mode " + modeId); 477d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 478d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4797850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 480d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return true; 481d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4827850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 483f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com private boolean run() throws IOException { 484f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com Run run = new Run(this); 485c7b173425beec5784c669388345eb3b7b96fc341enh@google.com if (configArgs.length > 0) { 486c7b173425beec5784c669388345eb3b7b96fc341enh@google.com run.console.verbose("loaded arguments from .vogarconfig: " + 4872f7dda9ade5ebaba54984c09f30d13226a295c86Nicolas Geoffray Strings.join(" ", (Object)configArgs)); 488c7b173425beec5784c669388345eb3b7b96fc341enh@google.com } 489f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com return run.driver.buildAndRun(actionFiles, actionClassesAndPackages); 4907850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 4917850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 492f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com public static void main(String[] args) throws IOException { 4937850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com Vogar vogar = new Vogar(); 494d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (!vogar.parseArgs(args)) { 495d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com vogar.printUsage(); 49606f9cc5c1a455157ff325c64d89acd1aade05f34Nicolas Geoffray System.exit(1); 4977850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 49875a72cc4c645e7e038f381c936d3f521ac6c30adbdc@google.com boolean allSuccess = vogar.run(); 49975a72cc4c645e7e038f381c936d3f521ac6c30adbdc@google.com System.exit(allSuccess ? 0 : 1); 5007850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 5017850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com} 502