Bug 1469683 - 1. Fix crash tests; r?esawin draft
authorJim Chen <nchen@mozilla.com>
Wed, 20 Jun 2018 16:46:20 -0400
changeset 808812 71421653836ca2f9f86e52c5331da075dd63ce3a
parent 808726 681eb7dfa324dd50403c382888929ea8b8b11b00
child 808813 1b67d4396e588b7e69026ef6ba1e8723ebbb9f90
push id113501
push userbmo:nchen@mozilla.com
push dateWed, 20 Jun 2018 20:47:07 +0000
reviewersesawin
bugs1469683
milestone62.0a1
Bug 1469683 - 1. Fix crash tests; r?esawin Specify individual sessions in crash tests (i.e. "mainSession.waitUntilCalled" instead of "sessionRule.waitUntilCalled"), so that the tests assert behavior on the correct session, and not inadvertently on the cached session. Also, under x86 debug builds, Gecko installs an "ah_crap_handler" for SIGSEGV that waits for a long time, which causes our crash tests to time out. Therefore, ignore crash tests under x86 debug. MozReview-Commit-ID: DdtmRBLmPGp
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
@@ -60,53 +60,63 @@ class ContentDelegateTest : BaseSessionT
         })
     }
 
     @IgnoreCrash
     @ReuseSession(false)
     @Test fun crashContent() {
         // This test doesn't make sense without multiprocess
         assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
+        // Cannot test x86 debug builds due to Gecko's "ah_crap_handler"
+        // that waits for debugger to attach during a SIGSEGV.
+        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.cpuArch == "x86",
+                   equalTo(false))
 
-        sessionRule.session.loadUri(CONTENT_CRASH_URL)
-
-        sessionRule.waitUntilCalled(object : Callbacks.ContentDelegate {
+        mainSession.loadUri(CONTENT_CRASH_URL)
+        mainSession.waitUntilCalled(object : Callbacks.ContentDelegate {
             @AssertCalled(count = 1)
             override fun onCrash(session: GeckoSession) {
-                assertThat("Session should be closed after a crash", session.isOpen, equalTo(false))
-
-                // Recover immediately
-                session.open()
-                session.loadTestPath(HELLO_HTML_PATH)
+                assertThat("Session should be closed after a crash",
+                           session.isOpen, equalTo(false))
             }
         });
 
-        sessionRule.waitForPageStop()
-
-        sessionRule.forCallbacksDuringWait(object: Callbacks.ProgressDelegate {
+        // Recover immediately
+        mainSession.open()
+        mainSession.loadTestPath(HELLO_HTML_PATH)
+        mainSession.waitUntilCalled(object: Callbacks.ProgressDelegate {
             @AssertCalled(count = 1)
             override fun onPageStop(session: GeckoSession, success: Boolean) {
                 assertThat("Page should load successfully", success, equalTo(true))
             }
         })
     }
 
     @IgnoreCrash
     @ReuseSession(false)
     @Test fun crashContentMultipleSessions() {
         // This test doesn't make sense without multiprocess
         assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
+        // Cannot test x86 debug builds due to Gecko's "ah_crap_handler"
+        // that waits for debugger to attach during a SIGSEGV.
+        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.cpuArch == "x86",
+                   equalTo(false))
 
-        // We need to make sure all sessions in a given content process
-        // receive onCrash(). If we add multiple content processes, this
-        // test will need fixed to ensure the test sessions go into the
-        // same one.
-        sessionRule.createOpenSession()
-        sessionRule.session.loadUri(CONTENT_CRASH_URL)
+        // XXX we need to make sure all sessions in a given content process receive onCrash().
+        // If we add multiple content processes, this test will need to be fixed to ensure the
+        // test sessions go into the same one.
+        val newSession = sessionRule.createOpenSession()
+        mainSession.loadUri(CONTENT_CRASH_URL)
 
-        sessionRule.waitUntilCalled(object : Callbacks.ContentDelegate {
-            @AssertCalled(count = 2)
-            override fun onCrash(session: GeckoSession) {
-                assertThat("Session should be closed after a crash", session.isOpen, equalTo(false))
-            }
-        });
+        // We can inadvertently catch the `onCrash` call for the cached session if we don't specify
+        // individual sessions here. Therefore, assert 'onCrash' is called for the two sessions
+        // individually.
+        val remainingSessions = mutableListOf(newSession, mainSession)
+        while (remainingSessions.isNotEmpty()) {
+            sessionRule.waitUntilCalled(object : Callbacks.ContentDelegate {
+                @AssertCalled(count = 1)
+                override fun onCrash(session: GeckoSession) {
+                    remainingSessions.remove(session)
+                }
+            })
+        }
     }
 }
--- 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
@@ -1647,30 +1647,34 @@ class GeckoSessionTestRuleTest : BaseSes
                 delegate?.onDelegate("", ""), equalTo(42))
         sessionRule.performTestEndCheck()
     }
 
     @IgnoreCrash
     @ReuseSession(false)
     @Test fun contentCrashIgnored() {
         assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
+        // Cannot test x86 debug builds due to Gecko's "ah_crap_handler"
+        // that waits for debugger to attach during a SIGSEGV.
+        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.cpuArch == "x86",
+                   equalTo(false))
 
-        // This test has some kind of strange race on ARM emulators
-        assumeThat(!(sessionRule.env.isEmulator && sessionRule.env.cpuArch.contains("arm")),
-                equalTo(true))
-
-        sessionRule.session.loadUri(CONTENT_CRASH_URL)
-        sessionRule.waitUntilCalled(object : Callbacks.ContentDelegate {
+        mainSession.loadUri(CONTENT_CRASH_URL)
+        mainSession.waitUntilCalled(object : Callbacks.ContentDelegate {
             @AssertCalled(count = 1)
             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));
+        assumeThat(sessionRule.env.shouldShutdownOnCrash(), equalTo(false))
+        // Cannot test x86 debug builds due to Gecko's "ah_crap_handler"
+        // that waits for debugger to attach during a SIGSEGV.
+        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.cpuArch == "x86",
+                   equalTo(false))
 
         sessionRule.session.loadUri(CONTENT_CRASH_URL)
         sessionRule.waitForPageStop()
     }
 }