Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff37c941 authored by Ben Reich's avatar Ben Reich
Browse files

Fix up TrampolineActivityTest and make activity closing more robust

The current TrampolineActivityTest relies on the activity monitor to
close any activities that were found. Unfortunately when 2 activities
are shown OR one flakes, it has a knock on effect to the remainder
tests and causes them to fail. Instead of this, let's get the current
active tasks and close any that are from the documentsui or
photopicker package.

On top of this the extra_mime_types were being added singularly
instead of as a string array. This meant that although it showed
them as appearing to have multiple mime types only one was being
added.

Bug: 377771195
Fix: 401787099
Fix: 401466309
Fix: 400612295
Fix: 401786574
Fix: 398402760
Test: atest com.android.documentsui.TrampolineActivityTest
Flag: com.android.documentsui.flags.redirect_get_content_ro
Change-Id: Ia3f31e5f34da6758930dd3739785fd0cca330209
parent b83b6afa
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -15,10 +15,8 @@
 */
package com.android.documentsui

import android.app.Instrumentation
import android.content.Intent
import android.content.Intent.ACTION_GET_CONTENT
import android.content.IntentFilter
import android.os.Build.VERSION_CODES
import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.CheckFlagsRule
@@ -34,7 +32,6 @@ import com.android.documentsui.flags.Flags.FLAG_REDIRECT_GET_CONTENT_RO
import com.android.documentsui.picker.TrampolineActivity
import java.util.Optional
import java.util.regex.Pattern
import org.junit.After
import org.junit.Assert.assertNotNull
import org.junit.Before
import org.junit.BeforeClass
@@ -56,25 +53,28 @@ class TrampolineActivityTest() {
        const val UI_TIMEOUT = 5000L
        val PHOTOPICKER_PACKAGE_REGEX: Pattern = Pattern.compile(".*(photopicker|media\\.module).*")
        val DOCUMENTSUI_PACKAGE_REGEX: Pattern = Pattern.compile(".*documentsui.*")
        val STACK_LIST_REGEX: Pattern = Pattern.compile(
            "taskId=(?<taskId>[0-9]+):(.+?)(photopicker|media\\.module|documentsui)",
            Pattern.MULTILINE
        )

        private lateinit var device: UiDevice

        private lateinit var monitor: Instrumentation.ActivityMonitor
        fun removePhotopickerAndDocumentsUITasks() {
            // Get the current list of tasks that are visible.
            val result = device.executeShellCommand("am stack list")

            // Identify any that are from DocumentsUI or Photopicker and close them.
            val matcher = STACK_LIST_REGEX.matcher(result)
            while (matcher.find()) {
                device.executeShellCommand("am stack remove ${matcher.group("taskId")}")
            }
        }

        @BeforeClass
        @JvmStatic
        fun setUp() {
            device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

            // Monitor to wait for the activity that starts with the `ACTION_GET_CONTENT` intent.
            val intentFilter = IntentFilter().apply { addAction(ACTION_GET_CONTENT) }
            monitor =
                Instrumentation.ActivityMonitor(
                    intentFilter,
                    null, // Expected result from startActivityForResult.
                    true, // Whether to block until activity started or not.
                )
            InstrumentationRegistry.getInstrumentation().addMonitor(monitor)
        }
    }

@@ -157,24 +157,20 @@ class TrampolineActivityTest() {

        @Before
        fun setUp() {
            removePhotopickerAndDocumentsUITasks()

            val context = InstrumentationRegistry.getInstrumentation().targetContext
            val intent = Intent(ACTION_GET_CONTENT)
            intent.setClass(context, TrampolineActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.setType(testData.mimeType)
            if (testData.extraMimeTypes.isPresent) {
                testData.extraMimeTypes.get()
                    .forEach { intent.putExtra(Intent.EXTRA_MIME_TYPES, it) }
                intent.putExtra(Intent.EXTRA_MIME_TYPES, testData.extraMimeTypes.get())
            }

            context.startActivity(intent)
        }

        @After
        fun tearDown() {
            monitor.waitForActivityWithTimeout(UI_TIMEOUT)?.finish()
        }

        @Test
        fun testCorrectAppIsLaunched() {
            val bySelector = when (testData.expectedApp) {
@@ -208,6 +204,11 @@ class TrampolineActivityTest() {
        @get:Rule
        val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()

        @Before
        fun setUp() {
            removePhotopickerAndDocumentsUITasks()
        }

        @Test
        fun testReferredGetContentFromPhotopickerShouldNotRedirectBack() {
            val context = InstrumentationRegistry.getInstrumentation().targetContext