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 955ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray @Option(names = { "--skip-color" }) 965ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray int skipColor = 33; // yellow 9750bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com 9850bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com @Option(names = { "--fail-color" }) 99f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com int failColor = 31; // red 10050bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com 1015ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray @Option(names = { "--warn-color" }) 1025ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray int warnColor = 35; // purple 1035ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray 1040942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com @Option(names = { "--ansi" }) 105f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean ansi = !"dumb".equals(System.getenv("TERM")); 1060942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com 107d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--debug" }) 108f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com Integer debugPort; 109d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 1103d6e772fe3a0d392af6f6ca008c556ba7c253503bdc@google.com @Option(names = { "--device-dir" }) 1110eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com File deviceDir; 112d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 113d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--vm-arg" }) 114f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<String> vmArgs = new ArrayList<String>(); 115d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 116f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com @Option(names = { "--vm-command" }) 117f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com String vmCommand; 118f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 119f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com @Option(names = { "--dalvik-cache" }) 120f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com String dalvikCache = "dalvik-cache"; 121f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 122d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--java-home" }) 123f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com File javaHome; 124d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 125d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--javac-arg" }) 126f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<String> javacArgs = new ArrayList<String>(); 127d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 12882131e6aba37e8b6f8ebbadbbe57fb5a78b4f743jessewilson@google.com @Option(names = { "--use-bootclasspath" }) 129f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com boolean useBootClasspath = false; 130d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 131d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--build-classpath" }) 132f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> buildClasspath = new ArrayList<File>(); 133d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 134d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com @Option(names = { "--classpath", "-cp" }) 135f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com List<File> classpath = new ArrayList<File>(); 136d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 1375379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com @Option(names = { "--resource-classpath" }) 1385379730d1295c75e2b7b1c6d193e74ba5f54cf17enh@google.com List<File> resourceClasspath = new ArrayList<File>(); 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 188cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray @Option(names = { "--test-only" }) 189cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray boolean testOnly = false; 190cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray 191d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private Vogar() {} 192d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 193d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private void printUsage() { 194fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com // have to reset fields so that "Default is: FOO" lines are accurate 195fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com optionParser.reset(); 196fc358e65b59087a1fe4e17ff64e23eaf2922b72ejsharpe@google.com 197d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Usage: Vogar [options]... <actions>... [-- target args]..."); 198d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 199d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" <actions>: .java files, directories, or class names."); 200d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" These should be JUnit tests, jtreg tests, Caliper benchmarks"); 201d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" or executable Java classes."); 202d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 20372c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(" When passing in a JUnit test class, it may have \"#method_name\""); 20472c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(" appended to it, to specify a single test method."); 20572c9585a2c7535a2a847b8c316d28d875582dc09jsharpe@google.com System.out.println(); 206d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" [args]: arguments passed to the target process. This is only useful when"); 207d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" the target process is a Caliper benchmark or main method."); 208d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 209d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("GENERAL OPTIONS"); 210d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 211c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" --mode <activity|device|device_dalvik|host|host_dalvik|jvm>: specify which environment to run in."); 212d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" activity: runs in an Android application on a device or emulator"); 213c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device: runs in an ART runtime on a device or emulator"); 214c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device_dalvik: runs in a Dalvik runtime on a device or emulator"); 215c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" device_art_kitkat: runs in a KitKat ART runtime on a device or emulator"); 216c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host: runs in an ART runtime on the local desktop built with any lunch combo."); 217c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host_dalvik: runs in a Dalvik runtime on the local desktop built with any lunch combo."); 218c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" host_art_kitkat: runs in a KitKat ART runtime on the local desktop built with any lunch combo."); 21979e4231584a3b24b44f42224475d41fcbe957af4jessewilson@google.com System.out.println(" jvm: runs in a Java VM on the local desktop"); 220c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is: " + modeId); 221c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(); 222c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" --variant <x32>: specify which architecture variant to execute with."); 223c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" x32: 32-bit"); 224c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is: " + variant); 225d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 2260eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com System.out.println(" --ssh <host:port>: target a remote machine via SSH."); 2270eb0936e90bf11463c8ee937ca996d7bd654a098jessewilson@google.com System.out.println(); 228d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean: synonym for --clean-before and --clean-after (default)."); 229d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Disable with --no-clean if you want no files removed."); 230d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 231d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --stream: stream output as it is emitted."); 232d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 233e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" --benchmark: for use with dalvikvm, this dexes all files together,"); 234e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" and is mandatory for running Caliper benchmarks, and a good idea"); 235e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(" other performance sensitive code."); 236e5dfbecbaa8568c2885a4cb859c8afa8b6a08d5bjsharpe@google.com System.out.println(); 23734b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" --profile: run with a profiler to produce an hprof file."); 23834b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(); 23934b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" --profile-binary: produce a binary hprof file instead of the default ASCII."); 2401bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2411bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-file <filename>: filename for hprof profile data."); 24234b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com System.out.println(" Default is java.hprof.txt in ASCII mode and java.hprof in binary mode."); 2431bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2441bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-depth <count>: number of frames in profile stack traces."); 2451bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileDepth); 2461bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2471bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-interval <milliseconds>: interval between profile samples."); 2481bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileInterval); 2491bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2501bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" --profile-thread-group: profile thread group instead of single thread in dalvikvms"); 2511bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Note --mode jvm only supports full VM profiling."); 2521bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(" Default is: " + profileThreadGroup); 2531bdeb9dd8f1ab3f308c285729af007ae8970425bbdc@google.com System.out.println(); 2545b644afaebd7afc43f75010b7c32f02129638a49bdc@google.com System.out.println(" --invoke-with: provide a command to invoke the VM with. Examples:"); 2555b644afaebd7afc43f75010b7c32f02129638a49bdc@google.com System.out.println(" --mode host --invoke-with \"valgrind --leak-check=full\""); 256fe3edd898b04ad1647a8fe4914a70245c01dc03abdc@google.com System.out.println(" --mode device --invoke-with \"strace -f -o/sdcard/strace.txt\""); 2575bbc674fa121ae7898bfa6987e7a39c5ba4299e2enh@google.com System.out.println(); 258d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --timeout <seconds>: maximum execution time of each action before the"); 259d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" runner aborts it. Specifying zero seconds or using --debug will"); 2608c03f5a6370cf6521384a268e12808e163ae4339jessewilson@google.com System.out.println(" disable the execution timeout. Tests tagged with 'large' will time"); 2618c03f5a6370cf6521384a268e12808e163ae4339jessewilson@google.com System.out.println(" out in " + LARGE_TIMEOUT_MULTIPLIER + "x this timeout."); 262d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: " + timeoutSeconds); 263d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 264d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --xml-reports-directory <path>: directory to emit JUnit-style"); 265d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" XML test results."); 266d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 267d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --classpath <jar file>: add the .jar to both build and execute classpaths."); 268d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 269ba0670d6c4481a866ae558d4e31f8004c709dd77jessewilson@google.com System.out.println(" --use-bootclasspath: use the classpath as search path for bootstrap classes."); 270d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 271d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --build-classpath <element>: add the directory or .jar to the build"); 272d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" classpath. Such classes are available as build dependencies, but"); 273d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" not at runtime."); 274d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 275d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --sourcepath <directory>: add the directory to the build sourcepath."); 276d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 277d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --vogar-dir <directory>: directory in which to find Vogar"); 278f7cb247687b72084b71a434a25d8b3c320071a96jessewilson@google.com System.out.println(" configuration information, caches, saved and results"); 2796a52e048641707c987c6a00691ba8c9f891ccf00jsharpe@google.com System.out.println(" unless they've been put explicitly elsewhere."); 280d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" Default is: " + vogarDir); 2814cb68042e7513b3f9444a17d91eb0d92480a74b4jsharpe@google.com System.out.println(); 282d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --record-results: record test results for future comparison."); 283d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 284d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --results-dir <directory>: read and write (if --record-results used)"); 285d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" results from and to this directory."); 286d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 287cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray System.out.println(" --test-only: only run JUnit tests."); 288cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray System.out.println(" Default is: " + testOnly); 289cef780b87ae30112756d40ea3c639a1660fd7c29Nicolas Geoffray System.out.println(); 290d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --verbose: turn on persistent verbose output."); 291d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 292d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("TARGET OPTIONS"); 293d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 294d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --debug <port>: enable Java debugging on the specified port."); 295d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" This port must be free both on the device and on the local"); 296d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" system. Disables the timeout specified by --timeout-seconds."); 297d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 2983d6e772fe3a0d392af6f6ca008c556ba7c253503bdc@google.com System.out.println(" --device-dir <directory>: use the specified directory for"); 299d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" on-device temporary files and code."); 300d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 301d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --vm-arg <argument>: include the specified argument when spawning a"); 302d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" virtual machine. Examples: -Xint:fast, -ea, -Xmx16M"); 303d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 304f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" --vm-command <argument>: override default vm executable name."); 305c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println(" Default is 'java' for the JVM and a version of dalvikvm for the host and target."); 306f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(); 307d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --java-home <java_home>: execute the actions on the local workstation"); 308d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" using the specified java home directory. This does not impact"); 309d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" which javac gets used. When unset, java is used from the PATH."); 310d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 311d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("EXOTIC OPTIONS"); 312d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 3133dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" --suggest-classpaths: build an index of jar files under the"); 314d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" directories given by --jar-search-dir arguments. If Vogar then "); 315d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" fails due to missing classes or packages, it will use the index to"); 316d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" diagnose the problem and suggest a fix."); 3173dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(); 3183dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" Currently only looks for jars called exactly \"classes.jar\"."); 3193dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(); 320d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --jar-search-dir <directory>: a directory that should be searched for"); 321d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" jar files to add to the class file index for use with"); 322d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" --suggest-classpaths."); 323d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 324d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean-before: remove working directories before building and"); 325d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" running (default). Disable with --no-clean-before if you are"); 326d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" using interactively with your own temporary input files."); 327d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 328d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --clean-after: remove temporary files after running (default)."); 329d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Disable with --no-clean-after and use with --verbose if"); 330d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" you'd like to manually re-run commands afterwards."); 331d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 332d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --color: format output in technicolor."); 333d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 33450bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" --pass-color: ANSI color code to use for passes."); 33550bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 32 (green)"); 33650bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 3375ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray System.out.println(" --skip-color: ANSI color code to use for skips."); 33850bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 33 (yellow)"); 33950bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 3405ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray System.out.println(" --warn-color: ANSI color code to use for warnings."); 3415ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray System.out.println(" Default: 35 (purple)"); 3425ad56966d0c66ab4b733fe97c4b862f5f85711e8Nicolas Geoffray System.out.println(); 34350bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" --fail-color: ANSI color code to use for failures."); 34450bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(" Default: 31 (red)"); 34550bd7c43bee5854a7a824265ec224c58c67c698bjsharpe@google.com System.out.println(); 346dc0120df8603b26adfd4ddfbeac422ff99a002b5jessewilson@google.com System.out.println(" --ansi: use ANSI escape sequences to remove intermediate output."); 3470942355a74d759fb2e50a002b6b0b93430f07d72bdc@google.com System.out.println(); 348d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --expectations <file>: include the specified file when looking for"); 349d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" action expectations. The file should include qualified action names"); 350d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" and the corresponding expected output."); 351d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: " + expectationFiles); 352d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 3533dafbce3b8d025f465ebf0a4c6d018c7dc31654ejsharpe@google.com System.out.println(" --indent: amount to indent action result output. Can be set to ''"); 354d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" (aka empty string) to simplify output parsing."); 355d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" Default is: '" + indent + "'"); 356d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 357d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" --javac-arg <argument>: include the specified argument when invoking"); 358d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(" javac. Examples: --javac-arg -Xmaxerrs --javac-arg 1"); 359d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(); 360f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" --dalvik-cache <argument>: override default dalvik-cache location."); 361f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(" Default is: " + dalvikCache); 362f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com System.out.println(); 363126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" --first-monitor-port <port>: the port on the host (and possibly target)"); 364126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" used to traffic control messages between vogar and forked processes."); 365126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" Use this to avoid port conflicts when running multiple vogar instances"); 366126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" concurrently. Vogar will use up to N ports starting with this one,"); 367126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(" where N is the number of processors on the host (" + NUM_PROCESSORS + "). "); 368126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com System.out.println(); 36934688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" --open-bugs-command <command>: a command that will take bug IDs as parameters"); 37034688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" and return those bugs that are still open. For example, if bugs 123 and"); 37134688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 789 are both open, the command should echo those values:"); 37234688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" $ ~/bin/bug-command 123 456 789"); 37334688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 123"); 37434688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(" 789"); 37534688e44757e5f31838dee7d52106531791fcb43jessewilson@google.com System.out.println(); 376d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println("CONFIG FILE"); 377d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 378d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" User-defined default arguments can be specified in ~/.vogarconfig. See"); 379d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(" .vogarconfig.example for an example."); 380d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com System.out.println(); 381d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 382d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 383d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com private boolean parseArgs(String[] args) { 384d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // extract arguments from config file 385c7b173425beec5784c669388345eb3b7b96fc341enh@google.com configArgs = optionParser.readFile(configFile); 386d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 387d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // config file args are added first so that in a conflict, the currently supplied 388d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com // arguments win. 389c7b173425beec5784c669388345eb3b7b96fc341enh@google.com List<String> actionsAndTargetArgs = optionParser.parse(configArgs); 3908918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com if (!actionsAndTargetArgs.isEmpty()) { 3918918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com throw new RuntimeException( 3928918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com "actions or targets given in .vogarconfig: " + actionsAndTargetArgs); 3938918b5cafd482363a48e0bc9ae0114028cda7e79jsharpe@google.com } 394d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com 395d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com try { 396d806c4c900e08bf04e07b5c564f2f61d8c490731jsharpe@google.com actionsAndTargetArgs.addAll(optionParser.parse(args)); 397d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } catch (RuntimeException e) { 398d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println(e.getMessage()); 399d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 400d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 401d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 402d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 403d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // Semantic error validation 404d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 405d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 406d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (javaHome != null && !new File(javaHome, "/bin/java").exists()) { 407d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Invalid java home: " + javaHome); 408d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 409d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4107850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 411d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // check vm option consistency 412c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.acceptsVmArgs() && !vmArgs.isEmpty()) { 413c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("VM args " + vmArgs + " should not be specified for mode " + modeId); 414c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return false; 415c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 416c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 417c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com // Check variant / mode compatibility. 418c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.supportsVariant(variant)) { 419c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("Variant " + variant + " not supported for mode " + modeId); 420d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 421d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 422d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 423d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (xmlReportsDirectory != null && !xmlReportsDirectory.isDirectory()) { 424d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Invalid XML reports directory: " + xmlReportsDirectory); 425d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 426d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 427d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 428d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (!clean) { 429d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com cleanBefore = false; 430d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com cleanAfter = false; 431d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4327850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 433d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 434d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // Post-processing arguments 435d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // 436d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 437f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com if (vmCommand == null) { 438c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com vmCommand = modeId.defaultVmCommand(variant); 439f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 440f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 4418627ce00fa3feb5d0ade63eb1a5ec41bbfad4282enh@google.com // disable timeout when benchmarking or debugging 4428627ce00fa3feb5d0ade63eb1a5ec41bbfad4282enh@google.com if (benchmark || debugPort != null) { 443d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com timeoutSeconds = 0; 444d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 445d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 446126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com if (firstMonitorPort == -1) { 447c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com firstMonitorPort = modeId.isLocal() ? 8788 : 8787; 448126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com } 449126b86dba3853c165e2d2f46e3cdffd7b2bb2f5bjessewilson@google.com 45034b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com if (profileFile == null) { 45134b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com profileFile = new File(profileBinary ? "java.hprof" : "java.hprof.txt"); 45234b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com } 45334b70bff9faaac07abcffa193b05cfb52d6d9908bdc@google.com 454d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com // separate the actions and the target args 455d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com int index = 0; 456d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com for (; index < actionsAndTargetArgs.size(); index++) { 457d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com String arg = actionsAndTargetArgs.get(index); 458d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (arg.equals("--")) { 459d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com index++; 460d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com break; 4617850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 4627850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 463d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com File file = new File(arg); 464d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (file.exists()) { 465d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (arg.endsWith(".java") || file.isDirectory()) { 466995a215ce56a98ed522888b0fdc286cd612c0218jessewilson@google.com actionFiles.add(file.getAbsoluteFile()); 467d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } else { 468d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("Expected a .jar file, .java file, directory, " 469d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com + "package name or classname, but was: " + arg); 470d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 471d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 472d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } else { 473d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com actionClassesAndPackages.add(arg); 4747850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 475d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 476d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com 477d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com targetArgs.addAll(actionsAndTargetArgs.subList(index, actionsAndTargetArgs.size())); 4787850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 479d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (actionFiles.isEmpty() && actionClassesAndPackages.isEmpty()) { 480d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com System.out.println("No actions provided."); 481d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 4827850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 4837850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 484c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com if (!modeId.acceptsVmArgs() && !targetArgs.isEmpty()) { 485c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com System.out.println("Target args " + targetArgs + " should not be specified for mode " + modeId); 486d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return false; 487d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4887850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 489d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com return true; 490d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com } 4917850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 492f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com private boolean run() throws IOException { 493f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com Run run = new Run(this); 494c7b173425beec5784c669388345eb3b7b96fc341enh@google.com if (configArgs.length > 0) { 495c7b173425beec5784c669388345eb3b7b96fc341enh@google.com run.console.verbose("loaded arguments from .vogarconfig: " + 4962f7dda9ade5ebaba54984c09f30d13226a295c86Nicolas Geoffray Strings.join(" ", (Object)configArgs)); 497c7b173425beec5784c669388345eb3b7b96fc341enh@google.com } 498f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com return run.driver.buildAndRun(actionFiles, actionClassesAndPackages); 4997850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 5007850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com 501f83be5e4273263df2bb9ef609946b911695b3996jessewilson@google.com public static void main(String[] args) throws IOException { 5027850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com Vogar vogar = new Vogar(); 503d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com if (!vogar.parseArgs(args)) { 504d0944e3ecda89a97ac35537e280b2776b53c25ecjessewilson@google.com vogar.printUsage(); 50506f9cc5c1a455157ff325c64d89acd1aade05f34Nicolas Geoffray System.exit(1); 5067850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 50775a72cc4c645e7e038f381c936d3f521ac6c30adbdc@google.com boolean allSuccess = vogar.run(); 50875a72cc4c645e7e038f381c936d3f521ac6c30adbdc@google.com System.exit(allSuccess ? 0 : 1); 5097850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com } 5107850f3f3da0099b76f09ed64d23e0a43ba4a5c76jessewilson@google.com} 511