Bug 1465480 - Exit GeckoView tests after crash if MOZ_CRASHREPORTER_SHUTDOWN is set r=jchen draft
authorJames Willcox <snorp@snorp.net>
Tue, 05 Jun 2018 15:19:12 -0500
changeset 804896 8326be23b1c7f1e222cded46bcac33ded8184e22
parent 804895 aa6477eb011817a63687b5e03ab5f46bba6631a0
child 804897 ee8c211b80548a8548941a0aa1a0d1c5f1fc518a
push id112488
push userbmo:snorp@snorp.net
push dateWed, 06 Jun 2018 17:59:13 +0000
reviewersjchen
bugs1465480
milestone62.0a1
Bug 1465480 - Exit GeckoView tests after crash if MOZ_CRASHREPORTER_SHUTDOWN is set r=jchen MozReview-Commit-ID: B5sPnbYojlr
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt
@@ -1645,13 +1645,14 @@ class GeckoSessionTestRuleTest : BaseSes
             override fun onCrash(session: GeckoSession) = Unit
         })
     }
 
     @Test(expected = RuntimeException::class)
     @ReuseSession(false)
     fun contentCrashFails() {
         assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
+        assumeThat(sessionRule.env.shouldShutdownOnCrash(), equalTo(false));
 
         sessionRule.session.loadUri(CONTENT_CRASH_URL)
         sessionRule.waitForPageStop()
     }
 }
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
@@ -37,16 +37,17 @@ import android.graphics.SurfaceTexture;
 import android.net.LocalSocketAddress;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Debug;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.os.MessageQueue;
+import android.os.Process;
 import android.os.SystemClock;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.rule.UiThreadTestRule;
 import android.util.Log;
 import android.util.Pair;
 import android.view.MotionEvent;
@@ -557,16 +558,20 @@ public class GeckoSessionTestRule extend
             }
             return "";
         }
 
         public boolean isAutomation() {
             return !getEnvVar("MOZ_IN_AUTOMATION").isEmpty();
         }
 
+        public boolean shouldShutdownOnCrash() {
+            return !getEnvVar("MOZ_CRASHREPORTER_SHUTDOWN").isEmpty();
+        }
+
         public boolean isMultiprocess() {
             return Boolean.valueOf(InstrumentationRegistry.getArguments()
                                                           .getString("use_multiprocess",
                                                                      "true"));
         }
 
         public boolean isDebugging() {
             return Debug.isDebuggerConnected();
@@ -1179,16 +1184,20 @@ public class GeckoSessionTestRule extend
                         assertThat("Callback first argument must be session object",
                                    args, arrayWithSize(greaterThan(0)));
                         assertThat("Callback first argument must be session object",
                                    args[0], instanceOf(GeckoSession.class));
                         session = (GeckoSession) args[0];
                     }
 
                     if (sOnCrash.equals(method) && !mIgnoreCrash && isUsingSession(session)) {
+                        if (env.shouldShutdownOnCrash()) {
+                            sRuntime.shutdown();
+                        }
+
                         throw new RuntimeException("Content process crashed");
                     }
 
                     records.add(new CallRecord(session, method, args));
 
                     call = waitDelegates.prepareMethodCall(session, method);
                     if (call == null) {
                         call = testDelegates.prepareMethodCall(session, method);
@@ -1237,23 +1246,34 @@ public class GeckoSessionTestRule extend
                                                 classes, recorder);
         mAllDelegates = new HashSet<>(DEFAULT_DELEGATES);
 
         if (sRuntime == null) {
             final GeckoRuntimeSettings.Builder runtimeSettingsBuilder =
                 new GeckoRuntimeSettings.Builder();
             runtimeSettingsBuilder.arguments(new String[] { "-purgecaches" })
                     .extras(InstrumentationRegistry.getArguments())
-                    .nativeCrashReportingEnabled(true)
-                    .javaCrashReportingEnabled(true)
                     .remoteDebuggingEnabled(true);
 
+            if (env.isAutomation()) {
+                runtimeSettingsBuilder
+                        .nativeCrashReportingEnabled(true)
+                        .javaCrashReportingEnabled(true);
+            }
+
             sRuntime = GeckoRuntime.create(
                 InstrumentationRegistry.getTargetContext(),
                 runtimeSettingsBuilder.build());
+
+            sRuntime.setDelegate(new GeckoRuntime.Delegate() {
+                @Override
+                public void onShutdown() {
+                    Process.killProcess(Process.myPid());
+                }
+            });
         }
 
         if (sCachedSession != null && !sCachedSession.isOpen()) {
             sCachedSession = null;
         }
 
         final boolean useDefaultSession = !mClosedSession && mDefaultSettings.equals(settings);
         if (useDefaultSession && mReuseSession && sCachedSession != null) {