diff options
author | Jorg Pleumann <> | 2009-04-28 21:54:10 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-04-28 21:54:10 -0700 |
commit | 19aa8e01b8fe4ebd6d518bd48ea9b53ec95a49a7 (patch) | |
tree | f23ec51e8a83443dfa090faba0eddd8cde1d3e1d /test-runner | |
parent | e17210c17aa26d600f825e2f45c9aa66452e9988 (diff) | |
parent | b867019173d20cd4fd7ee79a3ce924096e95a241 (diff) | |
download | frameworks_base-19aa8e01b8fe4ebd6d518bd48ea9b53ec95a49a7.zip frameworks_base-19aa8e01b8fe4ebd6d518bd48ea9b53ec95a49a7.tar.gz frameworks_base-19aa8e01b8fe4ebd6d518bd48ea9b53ec95a49a7.tar.bz2 |
am b867019: AI 147725: Some fixes for the CTS test runner. One is a
Merge commit 'b867019173d20cd4fd7ee79a3ce924096e95a241' into donut
* commit 'b867019173d20cd4fd7ee79a3ce924096e95a241':
AI 147725: Some fixes for the CTS test runner. One is a
Diffstat (limited to 'test-runner')
-rw-r--r-- | test-runner/android/test/InstrumentationCoreTestRunner.java | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/test-runner/android/test/InstrumentationCoreTestRunner.java b/test-runner/android/test/InstrumentationCoreTestRunner.java index 3f77a60..ff99a74 100644 --- a/test-runner/android/test/InstrumentationCoreTestRunner.java +++ b/test-runner/android/test/InstrumentationCoreTestRunner.java @@ -49,7 +49,15 @@ import android.util.Log; */ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner { + /** + * Convenience definition of our log tag. + */ private static final String TAG = "InstrumentationCoreTestRunner"; + + /** + * True if (and only if) we are running in single-test mode (as opposed to + * batch mode). + */ private boolean singleTest = false; @Override @@ -57,6 +65,7 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner { // We might want to move this to /sdcard, if is is mounted/writable. File cacheDir = getTargetContext().getCacheDir(); + // Set some properties that the core tests absolutely need. System.setProperty("user.language", "en"); System.setProperty("user.region", "US"); @@ -74,38 +83,66 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner { super.onCreate(arguments); } + @Override protected AndroidTestRunner getAndroidTestRunner() { AndroidTestRunner runner = super.getAndroidTestRunner(); runner.addTestListener(new TestListener() { + /** + * The last test class we executed code from. + */ private Class<?> lastClass; + /** + * The minimum time we expect a test to take. + */ + private static final int MINIMUM_TIME = 100; + + /** + * The start time of our current test in System.currentTimeMillis(). + */ + private long startTime; + public void startTest(Test test) { if (test.getClass() != lastClass) { + lastClass = test.getClass(); printMemory(test.getClass()); } Thread.currentThread().setContextClassLoader( test.getClass().getClassLoader()); + + startTime = System.currentTimeMillis(); } public void endTest(Test test) { if (test instanceof TestCase) { - if (lastClass == null) { - lastClass = test.getClass(); - } else { - if (test.getClass() != lastClass) { - cleanup(lastClass); - lastClass = test.getClass(); + cleanup((TestCase)test); + + /* + * Make sure all tests take at least MINIMUM_TIME to + * complete. If they don't, we wait a bit. The Cupcake + * Binder can't handle too many operations in a very + * short time, which causes headache for the CTS. + */ + long timeTaken = System.currentTimeMillis() - startTime; + + if (timeTaken < MINIMUM_TIME) { + try { + Thread.sleep(MINIMUM_TIME - timeTaken); + } catch (InterruptedException ignored) { + // We don't care. } } } } public void addError(Test test, Throwable t) { + // This space intentionally left blank. } public void addFailure(Test test, AssertionFailedError t) { + // This space intentionally left blank. } /** @@ -125,30 +162,31 @@ public class InstrumentationCoreTestRunner extends InstrumentationTestRunner { } /** - * Nulls all static reference fields in the given test class. This - * method helps us with those test classes that don't have an + * Nulls all non-static reference fields in the given test class. + * This method helps us with those test classes that don't have an * explicit tearDown() method. Normally the garbage collector should * take care of everything, but since JUnit keeps references to all * test cases, a little help might be a good idea. */ - private void cleanup(Class<?> clazz) { - if (clazz != TestCase.class) { + private void cleanup(TestCase test) { + Class<?> clazz = test.getClass(); + + while (clazz != TestCase.class) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; if (!f.getType().isPrimitive() && - Modifier.isStatic(f.getModifiers())) { + !Modifier.isStatic(f.getModifiers())) { try { f.setAccessible(true); - f.set(null, null); + f.set(test, null); } catch (Exception ignored) { // Nothing we can do about it. } } } - // don't cleanup the superclass for now - //cleanup(clazz.getSuperclass()); + clazz = clazz.getSuperclass(); } } |