From a9f790340375e48caf718b03140635b2aad41f7b Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 23 Mar 2026 16:14:48 -0400 Subject: [PATCH] Fix CustomTabsTest intent resolution with ActivityScenario ActivityScenario.launch resolves intents through normal Android routing, so an ACTION_VIEW intent with an HTTP URL resolved to Chrome rather than IntentReceiverActivity. Set the component explicitly before launching to force the activity within the test process. Improve error message when BrowserActivityTestRule.activity is unavailable --- .../helpers/BrowserActivityTestRule.kt | 2 +- .../reference/browser/ui/CustomTabsTest.kt | 45 +++++++++---------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt index e09bc91c5..81fa861be 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/helpers/BrowserActivityTestRule.kt @@ -29,7 +29,7 @@ class BrowserActivityTestRule : ExternalResource() { get() { var result: BrowserActivity? = null scenario.onActivity { result = it } - return result!! + return checkNotNull(result) { "Activity unavailable — scenario may be in a terminal state" } } override fun before() { diff --git a/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt b/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt index 59fc55843..bd95cbf6f 100644 --- a/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt +++ b/app/src/androidTest/java/org/mozilla/reference/browser/ui/CustomTabsTest.kt @@ -4,7 +4,9 @@ package org.mozilla.reference.browser.ui +import android.content.ComponentName import androidx.test.core.app.ActivityScenario +import androidx.test.platform.app.InstrumentationRegistry import mockwebserver3.MockWebServer import org.junit.After import org.junit.Before @@ -28,6 +30,19 @@ class CustomTabsTest { @JvmField val retryTestRule = RetryTestRule(3) + // ActivityScenario.launch resolves intents via normal Android routing, so an ACTION_VIEW + // intent with an HTTP URL would resolve to the browser rather than IntentReceiverActivity. + // Setting the component explicitly forces it to launch within the test process. + private fun launchCustomTab(pageUrl: String) = + ActivityScenario.launch( + createCustomTabIntent(pageUrl).apply { + component = ComponentName( + InstrumentationRegistry.getInstrumentation().targetContext, + IntentReceiverActivity::class.java, + ) + }, + ) + @Before fun setUp() { mockWebServer = MockWebServer().apply { @@ -45,10 +60,7 @@ class CustomTabsTest { fun openCustomTabTest() { val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(customTabPage.url.toString()), - ).use { + launchCustomTab(customTabPage.url.toString()).use { customTabScreen { verifyCloseButton() verifyTrackingProtectionIcon() @@ -65,10 +77,7 @@ class CustomTabsTest { fun verifyCustomTabMenuItemsTest() { val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(customTabPage.url.toString()), - ).use { + launchCustomTab(customTabPage.url.toString()).use { customTabScreen { }.openMainMenu { verifyForwardButton() @@ -87,10 +96,7 @@ class CustomTabsTest { val pageLinks = TestAssetHelper.getGenericAsset(mockWebServer, 4) val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(pageLinks.url.toString()), - ).use { + launchCustomTab(pageLinks.url.toString()).use { customTabScreen { clickGenericLink("Link 1") verifyPageTitle(genericURL.title) @@ -110,10 +116,7 @@ class CustomTabsTest { fun customTabShareTest() { val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(customTabPage.url.toString()), - ).use { + launchCustomTab(customTabPage.url.toString()).use { customTabScreen { }.openMainMenu { }.clickShareButton { @@ -126,10 +129,7 @@ class CustomTabsTest { fun customTabRequestDesktopSiteTest() { val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(customTabPage.url.toString()), - ).use { + launchCustomTab(customTabPage.url.toString()).use { customTabScreen { }.openMainMenu { switchRequestDesktopSiteToggle() @@ -146,10 +146,7 @@ class CustomTabsTest { fun customTabOpenInBrowserTest() { val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) - ActivityScenario - .launch( - createCustomTabIntent(customTabPage.url.toString()), - ).use { + launchCustomTab(customTabPage.url.toString()).use { customTabScreen { }.openMainMenu { }.clickOpenInBrowserButton {