summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java28
-rw-r--r--tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java14
2 files changed, 38 insertions, 4 deletions
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
index e62335eaec72..0bd2302d0e00 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java
@@ -29,6 +29,7 @@ import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
+import android.os.Process;
import android.os.RemoteException;
import android.os.PowerManager.WakeLock;
import android.util.Log;
@@ -44,6 +45,7 @@ import android.webkit.GeolocationPermissions;
import android.webkit.WebStorage.QuotaUpdater;
import java.io.File;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
@@ -256,6 +258,32 @@ public class LayoutTestsExecutor extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ /**
+ * It detects the crash by catching all the uncaught exceptions. However, we
+ * still have to kill the process, because after catching the exception the
+ * activity remains in a strange state, where intents don't revive it.
+ * However, we send the message to the service to speed up the rebooting
+ * (we don't have to wait for time-out to kick in).
+ */
+ Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+ @Override
+ public void uncaughtException(Thread thread, Throwable e) {
+ Log.w(LOG_TAG,
+ "onTestCrashed(): " + mCurrentTestRelativePath + " thread=" + thread, e);
+
+ try {
+ Message serviceMsg =
+ Message.obtain(null, ManagerService.MSG_CURRENT_TEST_CRASHED);
+
+ mManagerServiceMessenger.send(serviceMsg);
+ } catch (RemoteException e2) {
+ Log.e(LOG_TAG, "mCurrentTestRelativePath=" + mCurrentTestRelativePath, e2);
+ }
+
+ Process.killProcess(Process.myPid());
+ }
+ });
+
requestWindowFeature(Window.FEATURE_PROGRESS);
Intent intent = getIntent();
diff --git a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
index c745593df047..fbc069b9a48e 100644
--- a/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
+++ b/tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java
@@ -38,7 +38,7 @@ public class ManagerService extends Service {
private static final String LOG_TAG = "ManagerService";
- private static final int MSG_TEST_CRASHED = 0;
+ private static final int MSG_CRASH_TIMEOUT_EXPIRED = 0;
private static final int CRASH_TIMEOUT_MS = 20 * 1000;
@@ -72,6 +72,7 @@ public class ManagerService extends Service {
static final int MSG_PROCESS_ACTUAL_RESULTS = 0;
static final int MSG_ALL_TESTS_FINISHED = 1;
static final int MSG_FIRST_TEST = 2;
+ static final int MSG_CURRENT_TEST_CRASHED = 3;
/**
* This handler is purely for IPC. It is used to create mMessenger
@@ -92,6 +93,11 @@ public class ManagerService extends Service {
onActualResultsObtained(msg.getData());
break;
+ case MSG_CURRENT_TEST_CRASHED:
+ mCrashMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
+ onTestCrashed();
+ break;
+
case MSG_ALL_TESTS_FINISHED:
mSummarizer.setTestsRelativePath(mAllTestsRelativePath);
mSummarizer.summarize();
@@ -110,7 +116,7 @@ public class ManagerService extends Service {
private Handler mCrashMessagesHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- if (msg.what == MSG_TEST_CRASHED) {
+ if (msg.what == MSG_CRASH_TIMEOUT_EXPIRED) {
onTestCrashed();
}
}
@@ -145,7 +151,7 @@ public class ManagerService extends Service {
}
private void onActualResultsObtained(Bundle bundle) {
- mCrashMessagesHandler.removeMessages(MSG_TEST_CRASHED);
+ mCrashMessagesHandler.removeMessages(MSG_CRASH_TIMEOUT_EXPIRED);
ensureNextTestSetup(bundle.getString("nextTest"), bundle.getInt("testIndex") + 1);
AbstractResult results =
@@ -163,7 +169,7 @@ public class ManagerService extends Service {
mCurrentlyRunningTest = nextTest;
mCurrentlyRunningTestIndex = index;
- mCrashMessagesHandler.sendEmptyMessageDelayed(MSG_TEST_CRASHED, CRASH_TIMEOUT_MS);
+ mCrashMessagesHandler.sendEmptyMessageDelayed(MSG_CRASH_TIMEOUT_EXPIRED, CRASH_TIMEOUT_MS);
}
/**