diff options
Diffstat (limited to 'tests/src/com/android/camera/functional/CameraTest.java')
-rw-r--r-- | tests/src/com/android/camera/functional/CameraTest.java | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/src/com/android/camera/functional/CameraTest.java b/tests/src/com/android/camera/functional/CameraTest.java index 9eca03e..bf0bb64 100644 --- a/tests/src/com/android/camera/functional/CameraTest.java +++ b/tests/src/com/android/camera/functional/CameraTest.java @@ -1,5 +1,6 @@ package com.android.camera.functional; +import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Environment; @@ -7,11 +8,16 @@ import android.os.Process; import android.provider.MediaStore; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; +import android.util.Log; import java.io.File; +import java.lang.ref.WeakReference; +import java.util.ArrayList; public class CameraTest extends InstrumentationTestCase { + private static final String TAG = "CameraTest"; private static final String CAMERA_PACKAGE = "com.google.android.camera"; + private static final String CAMERA_ACTIVITY = "com.android.camera.Camera"; private static final String CAMCORDER_ACTIVITY = "com.android.camera.VideoCamera"; @LargeTest @@ -28,4 +34,35 @@ public class CameraTest extends InstrumentationTestCase { assertEquals(-1, f.getCanonicalPath().indexOf("test_fd_leak.3gp")); } } + + @LargeTest + public void testActivityLeak() throws Exception { + checkActivityLeak(CAMERA_ACTIVITY); + checkActivityLeak(CAMCORDER_ACTIVITY); + } + + private void checkActivityLeak(String activityName) throws Exception { + final int TEST_COUNT = 5; + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setClassName(CAMERA_PACKAGE, activityName); + ArrayList<WeakReference<Activity>> refs = + new ArrayList<WeakReference<Activity>>(); + for (int i = 0; i < TEST_COUNT; i++) { + Activity activity = getInstrumentation().startActivitySync(intent); + refs.add(new WeakReference<Activity>(activity)); + activity.finish(); + getInstrumentation().waitForIdleSync(); + activity = null; + } + Runtime.getRuntime().gc(); + Runtime.getRuntime().runFinalization(); + Runtime.getRuntime().gc(); + int refCount = 0; + for (WeakReference<Activity> c: refs) { + if (c.get() != null) refCount++; + } + // If applications are leaking activity, every reference is reachable. + assertTrue(refCount != TEST_COUNT); + } } |