1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.google.coretests;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.Test;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestResult;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestSuite;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.runner.BaseTestRunner;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.runner.StandardTestSuiteLoader;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.runner.TestSuiteLoader;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.PrintStream;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A command line based tool to run tests.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <pre>
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java junit.textui.TestRunner [-wait] TestCaseClass
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </pre>
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TestRunner expects the name of a TestCase class as argument.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If this class defines a static <code>suite</code> method it
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * will be invoked and the returned test is run. Otherwise all
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the methods starting with "test" having no arguments are run.
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When the wait command line argument is given TestRunner
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * waits until the users types RETURN.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TestRunner prints a trace as the tests are executed followed by a
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * summary at the end.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class StatTestRunner extends BaseTestRunner {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private ResultPrinter fPrinter;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private PerfStatCollector fPerfStatCollector;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int SUCCESS_EXIT= 0;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int FAILURE_EXIT= 1;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final int EXCEPTION_EXIT= 2;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String DEFAULT_DATABASE = "sqlite:/coretests.db";
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String DEFAULT_DRIVER = "SQLite.JDBCDriver";
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String connectionURL;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String jdbcDriver;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a TestRunner.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StatTestRunner() {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(System.out);
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a TestRunner using the given stream for all the output
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StatTestRunner(PrintStream writer) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this(new ResultPrinter(writer));
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a TestRunner using the given ResultPrinter all the output
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public StatTestRunner(ResultPrinter printer) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPrinter= printer;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPerfStatCollector = new PerfStatCollector(printer.getWriter());
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Runs a suite extracted from a TestCase subclass.
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static public void run(Class testClass) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        run(new TestSuite(testClass));
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Runs a single test and collects its results.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This method can be used to start a test run
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * from your program.
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <pre>
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * public static void main (String[] args) {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     test.textui.TestRunner.run(suite());
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </pre>
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static public TestResult run(Test test) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatTestRunner runner= new StatTestRunner();
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return runner.doRun(test, false);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (Exception e) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Runs a single test and waits until the user
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * types RETURN.
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static public void runAndWait(Test suite) {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatTestRunner aTestRunner= new StatTestRunner();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            aTestRunner.doRun(suite, true);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (Exception e) {}
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Always use the StandardTestSuiteLoader. Overridden from
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * BaseTestRunner.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TestSuiteLoader getLoader() {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new StandardTestSuiteLoader();
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testFailed(int status, Test test, Throwable t) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testStarted(String testName) {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testEnded(String testName) {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TestResult doRun(Test suite, boolean wait) throws Exception {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatsStore.open(jdbcDriver, connectionURL);
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TestResult result = new TestResult();
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.addListener(fPrinter);
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.addListener(fPerfStatCollector);
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long startTime= System.currentTimeMillis();
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatsStore.now = startTime;
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        suite.run(result);
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long endTime= System.currentTimeMillis();
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long runTime= endTime-startTime;
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPrinter.print(result, runTime);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPerfStatCollector.digest();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatsStore.close();
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pause(wait);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void pause(boolean wait) {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!wait) return;
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPrinter.printWaitPrompt();
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.in.read();
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch(Exception e) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main(String args[]) {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StatTestRunner aTestRunner= new StatTestRunner();
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TestResult r= aTestRunner.start(args);
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!r.wasSuccessful())
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.exit(FAILURE_EXIT);
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.exit(SUCCESS_EXIT);
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch(Exception e) {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.err.println(e.getMessage());
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            System.exit(EXCEPTION_EXIT);
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Starts a test run. Analyzes the command line arguments
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and runs the given test suite.
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected TestResult start(String args[]) throws Exception {
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String testCase= "";
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean wait= false;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        jdbcDriver = System.getProperty("android.coretests.driver", DEFAULT_DRIVER);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        connectionURL = System.getProperty("android.coretests.database", "jdbc:" + DEFAULT_DATABASE);
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i= 0; i < args.length; i++) {
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (args[i].equals("--all"))
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fPerfStatCollector.listAll = true;
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (args[i].equals("--bad"))
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fPerfStatCollector.listBad = true;
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (args[i].equals("--nobig"))
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fPerfStatCollector.bigMarking = false;
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (args[i].equals("--s")) {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fPerfStatCollector.thresholdDuration =
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Integer.valueOf(args[++i]);
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (args[i].equals("-wait"))
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                wait= true;
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (args[i].equals("-c"))
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                testCase= extractClassName(args[++i]);
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else if (args[i].equals("-v"))
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                System.err.println("JUnit "+Version.id()+" (plus Android performance stats)");
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                testCase= args[i];
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (testCase.equals(""))
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Test suite= getTest(testCase);
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return doRun(suite, wait);
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (Exception e) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new Exception("Exception: " + e);
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void runFailed(String message) {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.err.println(message);
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.exit(FAILURE_EXIT);
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setPrinter(ResultPrinter printer) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fPrinter= printer;
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
231