158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.runner;
258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.BufferedReader;
458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.File;
558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.FileInputStream;
658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.FileOutputStream;
758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.IOException;
858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.InputStream;
958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintWriter;
1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.StringReader;
1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.StringWriter;
1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.lang.reflect.InvocationTargetException;
1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.lang.reflect.Method;
1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.lang.reflect.Modifier;
1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.text.NumberFormat;
1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.util.Properties;
1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.AssertionFailedError;
1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test;
2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestListener;
2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite;
2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/**
2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Base class for all test runners.
2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * This class was born live on stage in Sardinia during XP2000.
2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */
2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic abstract class BaseTestRunner implements TestListener {
2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static final String SUITE_METHODNAME= "suite";
2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static Properties fPreferences;
3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static int fgMaxMessageLength= 500;
3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static boolean fgFilterStack= true;
3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	boolean fLoading= true;
3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot    /*
3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot    * Implementation of TestListener
3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot    */
3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void startTest(Test test) {
3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		testStarted(test.toString());
4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected static void setPreferences(Properties preferences) {
4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fPreferences= preferences;
4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected static Properties getPreferences() {
4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fPreferences == null) {
4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fPreferences= new Properties();
4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 		fPreferences.put("loading", "true");
5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 			fPreferences.put("filterstack", "true");
5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot  			readPreferences();
5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return fPreferences;
5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static void savePreferences() throws IOException {
5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		FileOutputStream fos= new FileOutputStream(getPreferencesFile());
5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			getPreferences().store(fos, "");
6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} finally {
6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			fos.close();
6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
6549c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	// android-changed remove 'static' qualifier for API compatibility
6649c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	public void setPreference(String key, String value) {
6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		getPreferences().put(key, value);
6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void endTest(Test test) {
7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		testEnded(test.toString());
7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addError(final Test test, final Throwable t) {
7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		testFailed(TestRunListener.STATUS_ERROR, test, t);
7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public synchronized void addFailure(final Test test, final AssertionFailedError t) {
7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		testFailed(TestRunListener.STATUS_FAILURE, test, t);
8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	// TestRunListener implementation
8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public abstract void testStarted(String testName);
8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public abstract void testEnded(String testName);
8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public abstract void testFailed(int status, Test test, Throwable t);
8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns the Test corresponding to the given suite. This is
9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * a template method, subclasses override runFailed(), clearStatus().
9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public Test getTest(String suiteClassName) {
9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (suiteClassName.length() <= 0) {
9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			clearStatus();
9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
99b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		Class<?> testClass= null;
10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			testClass= loadSuiteClass(suiteClassName);
10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (ClassNotFoundException e) {
10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			String clazz= e.getMessage();
10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (clazz == null)
10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				clazz= suiteClassName;
10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runFailed("Class not found \""+clazz+"\"");
10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch(Exception e) {
10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runFailed("Error: "+e.toString());
11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Method suiteMethod= null;
11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			suiteMethod= testClass.getMethod(SUITE_METHODNAME, new Class[0]);
11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 	} catch(Exception e) {
11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 		// try to extract a test suite automatically
11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			clearStatus();
11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return new TestSuite(testClass);
11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (! Modifier.isStatic(suiteMethod.getModifiers())) {
12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runFailed("Suite() method must be static");
12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		Test test= null;
12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			test= (Test)suiteMethod.invoke(null, (Object[])new Class[0]); // static method
12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (test == null)
12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				return test;
12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (InvocationTargetException e) {
13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runFailed("Failed to invoke suite():" + e.getTargetException().toString());
13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		catch (IllegalAccessException e) {
13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			runFailed("Failed to invoke suite():" + e.toString());
13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return null;
13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		clearStatus();
14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return test;
14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns the formatted string of the elapsed time.
14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public String elapsedTimeAsString(long runTime) {
14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return NumberFormat.getInstance().format((double)runTime/1000);
14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Processes the command line arguments and
15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * returns the name of the suite class to run or null
15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected String processArguments(String[] args) {
15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String suiteName= null;
15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 0; i < args.length; i++) {
15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (args[i].equals("-noloading")) {
15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				setLoading(false);
15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} else if (args[i].equals("-nofilterstack")) {
16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				fgFilterStack= false;
16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} else if (args[i].equals("-c")) {
16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				if (args.length > i+1)
16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					suiteName= extractClassName(args[i+1]);
16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				else
16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					System.out.println("Missing Test class name");
16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				i++;
16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} else {
16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				suiteName= args[i];
16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return suiteName;
17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Sets the loading behaviour of the test runner
17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public void setLoading(boolean enable) {
17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		fLoading= enable;
17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Extract the class name from a String in VA/Java style
18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public String extractClassName(String className) {
18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if(className.startsWith("Default package for"))
18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return className.substring(className.lastIndexOf(".")+1);
18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return className;
18758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Truncates a String to the maximum length.
19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
19258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static String truncate(String s) {
19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (fgMaxMessageLength != -1 && s.length() > fgMaxMessageLength)
19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			s= s.substring(0, fgMaxMessageLength)+"...";
19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return s;
19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Override to define how to handle a failed loading of
20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * a test suite.
20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected abstract void runFailed(String message);
20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
20449c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	// BEGIN android-changed - add back getLoader() for API compatibility
20549c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	/**
20649c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	 * Returns the loader to be used.
20749c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	 *
20849c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	 * @deprecated not present in JUnit4.10
20949c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	 */
21049c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	public TestSuiteLoader getLoader() {
21149c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		return new StandardTestSuiteLoader();
21249c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	}
21349c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	// END android-changed
21449c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot
21558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
21658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns the loaded Class for a suite name.
21758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
218b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected Class<?> loadSuiteClass(String suiteClassName) throws ClassNotFoundException {
219b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Class.forName(suiteClassName);
22058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
22158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
22258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
22358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Clears the status message.
22458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
22558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected void clearStatus() { // Belongs in the GUI TestRunner class
22658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
22758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
22858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected boolean useReloadingTestSuiteLoader() {
229b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return getPreference("loading").equals("true") && fLoading;
23058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
23158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
23258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	private static File getPreferencesFile() {
23358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 	String home= System.getProperty("user.home");
23458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		return new File(home, "junit.properties");
23558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	}
23658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
23758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	private static void readPreferences() {
23858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		InputStream is= null;
23958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		try {
24058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 			is= new FileInputStream(getPreferencesFile());
24158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 			setPreferences(new Properties(getPreferences()));
24258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			getPreferences().load(is);
24358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (IOException e) {
24458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			try {
24558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				if (is != null)
24658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					is.close();
24758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			} catch (IOException e1) {
24858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
24958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
25058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	}
25158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
25258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	public static String getPreference(String key) {
25358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		return getPreferences().getProperty(key);
25458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	}
25558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
25658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	public static int getPreference(String key, int dflt) {
25758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		String value= getPreference(key);
25858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		int intValue= dflt;
25958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		if (value == null)
26058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 			return intValue;
26158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		try {
26258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 			intValue= Integer.parseInt(value);
26358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	 	} catch (NumberFormatException ne) {
26458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		}
26558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		return intValue;
26658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	}
26758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
26858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
26958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Returns a filtered stack trace
27058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
27158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static String getFilteredTrace(Throwable t) {
27258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		StringWriter stringWriter= new StringWriter();
27358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		PrintWriter writer= new PrintWriter(stringWriter);
27458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		t.printStackTrace(writer);
27558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		StringBuffer buffer= stringWriter.getBuffer();
27658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String trace= buffer.toString();
27758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return BaseTestRunner.getFilteredTrace(trace);
27858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
27958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
28049c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	// BEGIN android-changed - add back this method for API compatibility
28149c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	/** @deprecated not present in JUnit4.10 */
28249c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	public static boolean inVAJava() {
28349c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		return false;
28449c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	}
28549c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot	// END android-changed
28649c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot
28758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	/**
28858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 * Filters stack frames from internal JUnit classes
28958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	 */
29058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	public static String getFilteredTrace(String stack) {
29158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		if (showStackRaw())
29258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return stack;
29358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
29458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		StringWriter sw= new StringWriter();
29558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		PrintWriter pw= new PrintWriter(sw);
29658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		StringReader sr= new StringReader(stack);
29749c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// BEGIN android-changed
29849c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// Use a sensible default buffer size
29949c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		BufferedReader br= new BufferedReader(sr, 1000);
30049c1b9df188a5be52ffd80a2bd1b9723755d8168Brett Chabot		// END android-changed
30158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
30258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String line;
30358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		try {
30458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			while ((line= br.readLine()) != null) {
30558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				if (!filterLine(line))
30658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot					pw.println(line);
30758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			}
30858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		} catch (Exception IOException) {
30958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			return stack; // return the stack unfiltered
31058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
31158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return sw.toString();
31258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
31358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
31458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	protected static boolean showStackRaw() {
31558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return !getPreference("filterstack").equals("true") || fgFilterStack == false;
31658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
31758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
31858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	static boolean filterLine(String line) {
31958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		String[] patterns= new String[] {
32058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.framework.TestCase",
32158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.framework.TestResult",
32258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.framework.TestSuite",
32358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.framework.Assert.", // don't filter AssertionFailure
32458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.swingui.TestRunner",
32558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.awtui.TestRunner",
32658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"junit.textui.TestRunner",
32758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			"java.lang.reflect.Method.invoke("
32858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		};
32958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		for (int i= 0; i < patterns.length; i++) {
33058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot			if (line.indexOf(patterns[i]) > 0)
33158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot				return true;
33258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		}
33358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot		return false;
33458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot	}
33558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
33658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	static {
33758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 		fgMaxMessageLength= getPreference("maxmessage", fgMaxMessageLength);
33858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 	}
33958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot
34058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}
341