diff options
| -rw-r--r-- | tests/DumpRenderTree2/src/com/android/dumprendertree2/LayoutTestsExecutor.java | 28 | ||||
| -rw-r--r-- | tests/DumpRenderTree2/src/com/android/dumprendertree2/ManagerService.java | 14 |
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); } /** |