summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson <chiuwinson@google.com> 2020-08-10 16:30:42 -0700
committer Winson <chiuwinson@google.com> 2020-08-13 17:44:15 -0700
commitd3a10584c55fb4ea738734aa8ffcd3a97cd47e49 (patch)
tree7788bd02b5b552dfdfd0be7140e62196d6258903
parent8a783b2fdc3be1b5191bcafb3653f3b1af743b90 (diff)
Add IntentFilter verification tests
In preparation for later changes, adds tests for the existing domain verification flow for auto verified app links. Implements a proxy verifier which saves incoming requests to a file on disk which can be read back later by another call from the host side test to send a success/failure code. This tests some basic known success/failure cases, as well as verifies the presence of bugs, which have been marked with TODOs against the feature bug number, to be fixed with later work. Also migrates manual test cases from I200d85085ce79842a3ed39377d1f75ec381c8991. Bug: 159952358 Bug: 162346237 Test: atest com.android.server.pm.test.intent.verify.IntentFilterVerificationTest Change-Id: Ib646b7f6f155ae342195dd25f82bb2463a9ca2b7
-rw-r--r--services/tests/PackageManagerServiceTests/host/Android.bp11
-rw-r--r--services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/Android.bp19
-rw-r--r--services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/IntentVerifyTestParams.kt (renamed from tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java)9
-rw-r--r--services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/SetActivityAsAlwaysParams.kt43
-rw-r--r--services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/StartActivityParams.kt48
-rw-r--r--services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/VerifyRequest.kt48
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/FactoryPackageTest.kt3
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt14
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt3
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt3
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt1
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt3
-rw-r--r--services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt413
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp28
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml38
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt62
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt160
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp48
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml94
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml34
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml32
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml33
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml33
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml34
-rw-r--r--services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml34
-rw-r--r--tests/AutoVerify/app1/Android.bp11
-rw-r--r--tests/AutoVerify/app1/AndroidManifest.xml43
-rw-r--r--tests/AutoVerify/app1/res/values/strings.xml21
-rw-r--r--tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java15
-rw-r--r--tests/AutoVerify/app2/Android.bp11
-rw-r--r--tests/AutoVerify/app2/AndroidManifest.xml44
-rw-r--r--tests/AutoVerify/app2/res/values/strings.xml21
-rw-r--r--tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java15
-rw-r--r--tests/AutoVerify/app3/Android.bp11
-rw-r--r--tests/AutoVerify/app3/AndroidManifest.xml44
-rw-r--r--tests/AutoVerify/app3/res/values/strings.xml21
-rw-r--r--tests/AutoVerify/app4/Android.bp11
-rw-r--r--tests/AutoVerify/app4/AndroidManifest.xml45
-rw-r--r--tests/AutoVerify/app4/res/values/strings.xml21
-rw-r--r--tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java15
-rw-r--r--tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java30
41 files changed, 1270 insertions, 357 deletions
diff --git a/services/tests/PackageManagerServiceTests/host/Android.bp b/services/tests/PackageManagerServiceTests/host/Android.bp
index e4e7e2288590..4f636efc7c06 100644
--- a/services/tests/PackageManagerServiceTests/host/Android.bp
+++ b/services/tests/PackageManagerServiceTests/host/Android.bp
@@ -22,6 +22,7 @@ java_test_host {
],
static_libs: [
"frameworks-base-hostutils",
+ "PackageManagerServiceHostTestsIntentVerifyUtils",
],
test_suites: ["general-tests"],
java_resources: [
@@ -33,7 +34,15 @@ java_test_host {
":PackageManagerTestAppVersion4",
":PackageManagerTestAppOriginalOverride",
":PackageManagerServiceDeviceSideTests",
- ],
+ ":PackageManagerTestIntentVerifier",
+ ":PackageManagerTestIntentVerifierTarget1",
+ ":PackageManagerTestIntentVerifierTarget2",
+ ":PackageManagerTestIntentVerifierTarget3",
+ ":PackageManagerTestIntentVerifierTarget4Base",
+ ":PackageManagerTestIntentVerifierTarget4NoAutoVerify",
+ ":PackageManagerTestIntentVerifierTarget4Wildcard",
+ ":PackageManagerTestIntentVerifierTarget4WildcardNoAutoVerify",
+ ]
}
genrule {
diff --git a/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/Android.bp b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/Android.bp
new file mode 100644
index 000000000000..b7a0624e02b8
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/Android.bp
@@ -0,0 +1,19 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+java_library {
+ name: "PackageManagerServiceHostTestsIntentVerifyUtils",
+ srcs: ["src/**/*.kt"],
+ host_supported: true,
+}
diff --git a/tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/IntentVerifyTestParams.kt
index 09ef47212622..48119e0088c4 100644
--- a/tests/AutoVerify/app3/src/com/android/test/autoverify/MainActivity.java
+++ b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/IntentVerifyTestParams.kt
@@ -13,3 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+package com.android.server.pm.test.intent.verify
+
+interface IntentVerifyTestParams {
+
+ val methodName: String
+
+ fun toArgsMap(): Map<String, String>
+}
diff --git a/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/SetActivityAsAlwaysParams.kt b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/SetActivityAsAlwaysParams.kt
new file mode 100644
index 000000000000..26c3903b20d6
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/SetActivityAsAlwaysParams.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verify
+
+data class SetActivityAsAlwaysParams(
+ val uri: String,
+ val packageName: String,
+ val activityName: String,
+ override val methodName: String = "setActivityAsAlways"
+) : IntentVerifyTestParams {
+
+ companion object {
+ private const val KEY_URI = "uri"
+ private const val KEY_PACKAGE_NAME = "packageName"
+ private const val KEY_ACTIVITY_NAME = "activityName"
+
+ fun fromArgs(args: Map<String, String>) = SetActivityAsAlwaysParams(
+ args.getValue(KEY_URI),
+ args.getValue(KEY_PACKAGE_NAME),
+ args.getValue(KEY_ACTIVITY_NAME)
+ )
+ }
+
+ override fun toArgsMap() = mapOf(
+ KEY_URI to uri,
+ KEY_PACKAGE_NAME to packageName,
+ KEY_ACTIVITY_NAME to activityName
+ )
+}
diff --git a/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/StartActivityParams.kt b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/StartActivityParams.kt
new file mode 100644
index 000000000000..7eddcfb621c4
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/StartActivityParams.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verify
+
+data class StartActivityParams(
+ val uri: String,
+ val expected: List<String>,
+ val withBrowsers: Boolean = false,
+ override val methodName: String = "verifyActivityStart"
+) : IntentVerifyTestParams {
+ companion object {
+ private const val KEY_URI = "uri"
+ private const val KEY_EXPECTED = "expected"
+ private const val KEY_BROWSER = "browser"
+
+ fun fromArgs(args: Map<String, String>) = StartActivityParams(
+ args.getValue(KEY_URI),
+ args.getValue(KEY_EXPECTED).split(","),
+ args.getValue(KEY_BROWSER).toBoolean()
+ )
+ }
+
+ constructor(
+ uri: String,
+ expected: String,
+ withBrowsers: Boolean = false
+ ) : this(uri, listOf(expected), withBrowsers)
+
+ override fun toArgsMap() = mapOf(
+ KEY_URI to uri,
+ KEY_EXPECTED to expected.joinToString(separator = ","),
+ KEY_BROWSER to withBrowsers.toString()
+ )
+}
diff --git a/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/VerifyRequest.kt b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/VerifyRequest.kt
new file mode 100644
index 000000000000..f93b1e0e7e37
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/libs/IntentVerifyUtils/src/com/android/server/pm/test/intent/verify/VerifyRequest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verify
+
+data class VerifyRequest(
+ val id: Int = -1,
+ val scheme: String,
+ val hosts: List<String>,
+ val packageName: String
+) {
+
+ companion object {
+ fun deserialize(value: String?): VerifyRequest {
+ val lines = value?.trim()?.lines()
+ ?: return VerifyRequest(scheme = "", hosts = emptyList(), packageName = "")
+ return VerifyRequest(
+ lines[0].removePrefix("id=").toInt(),
+ lines[1].removePrefix("scheme="),
+ lines[2].removePrefix("hosts=").split(","),
+ lines[3].removePrefix("packageName=")
+ )
+ }
+ }
+
+ constructor(id: Int = -1, scheme: String, host: String, packageName: String) :
+ this(id, scheme, listOf(host), packageName)
+
+ fun serializeToString() = """
+ id=$id
+ scheme=$scheme
+ hosts=${hosts.joinToString(separator = ",")}
+ packageName=$packageName
+ """.trimIndent() + "\n"
+}
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/FactoryPackageTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/FactoryPackageTest.kt
index 3847658def6a..e17358d38d8c 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/FactoryPackageTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/FactoryPackageTest.kt
@@ -31,7 +31,8 @@ class FactoryPackageTest : BaseHostJUnit4Test() {
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
- @get:Rule
+ @Rule
+ @JvmField
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
private val filePath =
HostUtils.makePathForApk("PackageManagerTestApp.apk", Partition.SYSTEM)
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
index 8dfefaf9750f..24c714c0d5f2 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/HostUtils.kt
@@ -18,6 +18,7 @@ package com.android.server.pm.test
import com.android.internal.util.test.SystemPreparer
import com.android.tradefed.device.ITestDevice
+import org.junit.rules.TemporaryFolder
import java.io.File
import java.io.FileOutputStream
@@ -34,6 +35,19 @@ internal fun SystemPreparer.deleteApkFolders(
}
}
+internal fun ITestDevice.installJavaResourceApk(
+ tempFolder: TemporaryFolder,
+ javaResource: String,
+ reinstall: Boolean = true,
+ extraArgs: Array<String> = emptyArray()
+): String? {
+ val file = HostUtils.copyResourceToHostFile(javaResource, tempFolder.newFile())
+ return installPackage(file, reinstall, *extraArgs)
+}
+
+internal fun ITestDevice.uninstallPackages(vararg pkgNames: String) =
+ pkgNames.forEach { uninstallPackage(it) }
+
internal object HostUtils {
fun getDataDir(device: ITestDevice, pkgName: String) =
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
index b7d135991ccd..37c999cbee68 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/InvalidNewSystemAppTest.kt
@@ -47,7 +47,8 @@ class InvalidNewSystemAppTest : BaseHostJUnit4Test() {
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
- @get:Rule
+ @Rule
+ @JvmField
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
private val filePath = HostUtils.makePathForApk("PackageManagerTestApp.apk", Partition.PRODUCT)
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
index 4ae3ca5f7263..4becae66633f 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/OriginalPackageMigrationTest.kt
@@ -47,7 +47,8 @@ class OriginalPackageMigrationTest : BaseHostJUnit4Test() {
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
- @get:Rule
+ @Rule
+ @JvmField
val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
@Before
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
index 654c11c5bf81..6479f584324f 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/Partition.kt
@@ -22,6 +22,7 @@ import java.nio.file.Paths
// Unfortunately no easy way to access PMS SystemPartitions, so mock them here
internal enum class Partition(val baseAppFolder: Path) {
SYSTEM("/system/app"),
+ SYSTEM_PRIVILEGED("/system/priv-app"),
VENDOR("/vendor/app"),
PRODUCT("/product/app"),
SYSTEM_EXT("/system_ext/app")
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
index 207f10a3027b..46120af06550 100644
--- a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/SystemStubMultiUserDisableUninstallTest.kt
@@ -110,7 +110,8 @@ class SystemStubMultiUserDisableUninstallTest : BaseHostJUnit4Test() {
private val preparer: SystemPreparer = SystemPreparer(tempFolder,
SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
- @get:Rule
+ @Rule
+ @JvmField
val rules = RuleChain.outerRule(tempFolder).let {
if (DEBUG_NO_REBOOT) {
it!!
diff --git a/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt
new file mode 100644
index 000000000000..fffda8ebd36c
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/src/com/android/server/pm/test/intent/verify/IntentFilterVerificationTest.kt
@@ -0,0 +1,413 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verify
+
+import com.android.internal.util.test.SystemPreparer
+import com.android.server.pm.test.Partition
+import com.android.server.pm.test.deleteApkFolders
+import com.android.server.pm.test.installJavaResourceApk
+import com.android.server.pm.test.pushApk
+import com.android.server.pm.test.uninstallPackages
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.ClassRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.RuleChain
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.RunWith
+import java.io.File
+import java.util.concurrent.TimeUnit
+
+@RunWith(DeviceJUnit4ClassRunner::class)
+class IntentFilterVerificationTest : BaseHostJUnit4Test() {
+
+ companion object {
+ private const val VERIFIER = "PackageManagerTestIntentVerifier.apk"
+ private const val VERIFIER_PKG_NAME = "com.android.server.pm.test.intent.verifier"
+ private const val TARGET_PKG_PREFIX = "$VERIFIER_PKG_NAME.target"
+ private const val TARGET_APK_PREFIX = "PackageManagerTestIntentVerifierTarget"
+ private const val TARGET_ONE = "${TARGET_APK_PREFIX}1.apk"
+ private const val TARGET_ONE_PKG_NAME = "$TARGET_PKG_PREFIX.one"
+ private const val TARGET_TWO = "${TARGET_APK_PREFIX}2.apk"
+ private const val TARGET_TWO_PKG_NAME = "$TARGET_PKG_PREFIX.two"
+ private const val TARGET_THREE = "${TARGET_APK_PREFIX}3.apk"
+ private const val TARGET_THREE_PKG_NAME = "$TARGET_PKG_PREFIX.three"
+ private const val TARGET_FOUR_BASE = "${TARGET_APK_PREFIX}4Base.apk"
+ private const val TARGET_FOUR_PKG_NAME = "$TARGET_PKG_PREFIX.four"
+ private const val TARGET_FOUR_NO_AUTO_VERIFY = "${TARGET_APK_PREFIX}4NoAutoVerify.apk"
+ private const val TARGET_FOUR_WILDCARD = "${TARGET_APK_PREFIX}4Wildcard.apk"
+ private const val TARGET_FOUR_WILDCARD_NO_AUTO_VERIFY =
+ "${TARGET_APK_PREFIX}4WildcardNoAutoVerify.apk"
+
+ @get:ClassRule
+ val deviceRebootRule = SystemPreparer.TestRuleDelegate(true)
+ }
+
+ private val tempFolder = TemporaryFolder()
+ private val preparer: SystemPreparer = SystemPreparer(tempFolder,
+ SystemPreparer.RebootStrategy.FULL, deviceRebootRule) { this.device }
+
+ @Rule
+ @JvmField
+ val rules = RuleChain.outerRule(tempFolder).around(preparer)!!
+
+ private val permissionsFile = File("/system/etc/permissions" +
+ "/privapp-PackageManagerIntentFilterVerificationTest-permissions.xml")
+
+ @Before
+ fun cleanupAndPushPermissionsFile() {
+ // In order for the test app to be the verification agent, it needs a permission file
+ // which can be pushed onto the system and removed afterwards.
+ val file = tempFolder.newFile().apply {
+ """
+ <permissions>
+ <privapp-permissions package="$VERIFIER_PKG_NAME">
+ <permission name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"/>
+ </privapp-permissions>
+ </permissions>
+ """
+ .trimIndent()
+ .let { writeText(it) }
+ }
+ device.uninstallPackages(TARGET_ONE_PKG_NAME, TARGET_TWO_PKG_NAME, TARGET_THREE_PKG_NAME,
+ TARGET_FOUR_PKG_NAME)
+ preparer.pushApk(VERIFIER, Partition.SYSTEM_PRIVILEGED)
+ .pushFile(file, permissionsFile.toString())
+ .reboot()
+ runTest("clearResponse")
+ }
+
+ @After
+ fun cleanupAndDeletePermissionsFile() {
+ device.uninstallPackages(TARGET_ONE_PKG_NAME, TARGET_TWO_PKG_NAME, TARGET_THREE_PKG_NAME,
+ TARGET_FOUR_PKG_NAME)
+ preparer.deleteApkFolders(Partition.SYSTEM_PRIVILEGED, VERIFIER)
+ .deleteFile(permissionsFile.toString())
+ device.reboot()
+ }
+
+ @Test
+ fun verifyOne() {
+ installPackage(TARGET_ONE)
+
+ assertReceivedRequests(true, VerifyRequest(
+ scheme = "https",
+ hosts = listOf(
+ "https_only.pm.server.android.com",
+ "other_activity.pm.server.android.com",
+ "http_only.pm.server.android.com",
+ "verify.pm.server.android.com",
+ "https_plus_non_web_scheme.pm.server.android.com",
+ "multiple.pm.server.android.com",
+ // TODO(b/159952358): the following domain should not be
+ // verified, this is because the verifier tries to verify all web domains,
+ // even in intent filters not marked for auto verify
+ "no_verify.pm.server.android.com"
+ ),
+ packageName = TARGET_ONE_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "https://https_only.pm.server.android.com",
+ expected = "$TARGET_ONE_PKG_NAME.TargetActivity"
+ ))
+ }
+
+ @Test
+ fun nonWebScheme() {
+ installPackage(TARGET_TWO)
+ assertReceivedRequests(null)
+ }
+
+ @Test
+ fun verifyHttpNonSecureOnly() {
+ installPackage(TARGET_THREE)
+ assertReceivedRequests(true, VerifyRequest(
+ scheme = "https",
+ hosts = listOf(
+ "multiple.pm.server.android.com"
+ ),
+ packageName = TARGET_THREE_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "http://multiple.pm.server.android.com",
+ expected = "$TARGET_THREE_PKG_NAME.TargetActivity"
+ ))
+ }
+
+ @Test
+ fun multipleResults() {
+ installPackage(TARGET_ONE)
+ installPackage(TARGET_THREE)
+ assertReceivedRequests(true, VerifyRequest(
+ scheme = "https",
+ hosts = listOf(
+ "https_only.pm.server.android.com",
+ "other_activity.pm.server.android.com",
+ "http_only.pm.server.android.com",
+ "verify.pm.server.android.com",
+ "https_plus_non_web_scheme.pm.server.android.com",
+ "multiple.pm.server.android.com",
+ // TODO(b/159952358): the following domain should not be
+ // verified, this is because the verifier tries to verify all web domains,
+ // even in intent filters not marked for auto verify
+ "no_verify.pm.server.android.com"
+ ),
+ packageName = TARGET_ONE_PKG_NAME
+ ), VerifyRequest(
+ scheme = "https",
+ hosts = listOf(
+ "multiple.pm.server.android.com"
+ ),
+ packageName = TARGET_THREE_PKG_NAME
+ ))
+
+ // Target3 declares http non-s, so it should be included in the set here
+ runTest(StartActivityParams(
+ uri = "http://multiple.pm.server.android.com",
+ expected = listOf(
+ "$TARGET_ONE_PKG_NAME.TargetActivity2",
+ "$TARGET_THREE_PKG_NAME.TargetActivity"
+ )
+ ))
+
+ // But it excludes https, so it shouldn't resolve here
+ runTest(StartActivityParams(
+ uri = "https://multiple.pm.server.android.com",
+ expected = "$TARGET_ONE_PKG_NAME.TargetActivity2"
+ ))
+
+ // Remove Target3 and return to single verified Target1 app for http non-s
+ device.uninstallPackage(TARGET_THREE_PKG_NAME)
+ runTest(StartActivityParams(
+ uri = "http://multiple.pm.server.android.com",
+ expected = "$TARGET_ONE_PKG_NAME.TargetActivity2"
+ ))
+ }
+
+ @Test
+ fun demoteAlways() {
+ installPackage(TARGET_FOUR_BASE)
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
+ withBrowsers = true
+ ))
+ runTest(SetActivityAsAlwaysParams(
+ uri = "https://failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME,
+ activityName = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ // Re-installing with same host/verify set will maintain always setting
+ installPackage(TARGET_FOUR_BASE)
+ assertReceivedRequests(null)
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ // Installing with new wildcard host will downgrade out of always, re-including browsers
+ installPackage(TARGET_FOUR_WILDCARD)
+
+ // TODO(b/159952358): The first request without the wildcard should not be sent. This is
+ // caused by the request being queued even if it should be dropped from the previous
+ // install case since the host set didn't change.
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ hosts = listOf("failing.pm.server.android.com"),
+ packageName = TARGET_FOUR_PKG_NAME
+ ), VerifyRequest(
+ scheme = "https",
+ hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
+ withBrowsers = true
+ ))
+ }
+
+ @Test
+ fun unverifiedReinstallResendRequest() {
+ installPackage(TARGET_FOUR_BASE)
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ installPackage(TARGET_FOUR_BASE)
+
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+ }
+
+ @Test
+ fun unverifiedUpdateRemovingDomainNoRequestDemoteAlways() {
+ installPackage(TARGET_FOUR_WILDCARD)
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ runTest(SetActivityAsAlwaysParams(
+ uri = "https://failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME,
+ activityName = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ // Re-installing with a smaller host/verify set will not request re-verification
+ installPackage(TARGET_FOUR_BASE)
+ assertReceivedRequests(null)
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ // Re-installing with a (now) larger host/verify set will re-request and demote
+ installPackage(TARGET_FOUR_WILDCARD)
+ // TODO(b/159952358): The first request should not be sent. This is caused by the request
+ // being queued even if it should be dropped from the previous install case.
+ assertReceivedRequests(false, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ), VerifyRequest(
+ scheme = "https",
+ hosts = listOf("failing.pm.server.android.com", "wildcard.tld"),
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
+ withBrowsers = true
+ ))
+ }
+
+ // TODO(b/159952358): I would expect this to demote
+ // TODO(b/32810168)
+ @Test
+ fun verifiedUpdateRemovingAutoVerifyMaintainsAlways() {
+ installPackage(TARGET_FOUR_BASE)
+ assertReceivedRequests(true, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ installPackage(TARGET_FOUR_NO_AUTO_VERIFY)
+ assertReceivedRequests(null)
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+ }
+
+ @Test
+ fun verifiedUpdateRemovingAutoVerifyAddingDomainDemotesAlways() {
+ installPackage(TARGET_FOUR_BASE)
+
+ assertReceivedRequests(true, VerifyRequest(
+ scheme = "https",
+ host = "failing.pm.server.android.com",
+ packageName = TARGET_FOUR_PKG_NAME
+ ))
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity"
+ ))
+
+ installPackage(TARGET_FOUR_WILDCARD_NO_AUTO_VERIFY)
+ assertReceivedRequests(null)
+
+ runTest(StartActivityParams(
+ uri = "https://failing.pm.server.android.com",
+ expected = "$TARGET_FOUR_PKG_NAME.TargetActivity",
+ withBrowsers = true
+ ))
+ }
+
+ private fun installPackage(javaResourceName: String) {
+ // Need to pass --user as verification is not currently run for all user installs
+ assertThat(device.installJavaResourceApk(tempFolder, javaResourceName,
+ extraArgs = arrayOf("--user", device.currentUser.toString()))).isNull()
+ }
+
+ private fun assertReceivedRequests(success: Boolean?, vararg expected: VerifyRequest?) {
+ // TODO(b/159952358): This can probably be less than 10
+ // Because tests have to assert that multiple broadcasts aren't received, there's no real
+ // better way to await for a value than sleeping for a long enough time.
+ TimeUnit.SECONDS.sleep(10)
+
+ val params = mutableMapOf<String, String>()
+ if (expected.any { it != null }) {
+ params["expected"] = expected.filterNotNull()
+ .joinToString(separator = "") { it.serializeToString() }
+ }
+ runTest("compareLastReceived", params)
+
+ if (success != null) {
+ if (success) {
+ runTest("verifyPreviousReceivedSuccess")
+ } else {
+ runTest("verifyPreviousReceivedFailure")
+ }
+ runTest("clearResponse")
+ }
+ }
+
+ private fun runTest(params: IntentVerifyTestParams) =
+ runTest(params.methodName, params.toArgsMap())
+
+ private fun runTest(testName: String, args: Map<String, String> = emptyMap()) {
+ val escapedArgs = args.mapValues {
+ // Need to escape strings so that args are passed properly through the shell command
+ "\"${it.value.trim('"')}\""
+ }
+ runDeviceTests(device, null, VERIFIER_PKG_NAME, "$VERIFIER_PKG_NAME.VerifyReceiverTest",
+ testName, null, 10 * 60 * 1000L, 10 * 60 * 1000L, 0L, true, false, escapedArgs)
+ }
+}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp
new file mode 100644
index 000000000000..e82f57d20fcc
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/Android.bp
@@ -0,0 +1,28 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifier",
+ srcs: [ "src/**/*.kt" ],
+ static_libs: [
+ "androidx.test.core",
+ "androidx.test.espresso.core",
+ "androidx.test.runner",
+ "compatibility-device-util-axt",
+ "junit",
+ "truth-prebuilt",
+ "PackageManagerServiceHostTestsIntentVerifyUtils",
+ ],
+ platform_apis: true,
+}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml
new file mode 100644
index 000000000000..17b50b0ec949
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier"
+ >
+
+ <uses-permission android:name="android.permission.INTENT_FILTER_VERIFICATION_AGENT" />
+ <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+ <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
+
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.server.pm.test.intent.verifier"
+ />
+
+ <application>
+ <receiver android:name=".VerifyReceiver" android:exported="true">
+ <intent-filter android:priority="999">
+ <action android:name="android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"/>
+ <data android:mimeType="application/vnd.android.package-archive"/>
+ </intent-filter>
+ </receiver>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt
new file mode 100644
index 000000000000..073c2be75424
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiver.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verifier
+
+import android.content.BroadcastReceiver
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager
+import com.android.server.pm.test.intent.verify.VerifyRequest
+
+class VerifyReceiver : BroadcastReceiver() {
+
+ override fun onReceive(context: Context, intent: Intent) {
+ if (intent.action != Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION) return
+ val params = intent.toVerifyParams()
+
+ // If the receiver is called for a normal request, proxy it to the real verifier on device
+ if (params.hosts.none { it.contains("pm.server.android.com") }) {
+ sendToRealVerifier(context, Intent(intent))
+ return
+ }
+
+ // When the receiver is invoked for a test install, there is no direct connection to host,
+ // so store the result in a file to read and assert on later. Append is intentional so that
+ // amount of invocations and clean up can be verified.
+ context.filesDir.resolve("test.txt")
+ .appendText(params.serializeToString())
+ }
+
+ private fun sendToRealVerifier(context: Context, intent: Intent) {
+ context.packageManager.queryBroadcastReceivers(intent, 0)
+ .first { it.activityInfo?.packageName != context.packageName }
+ .let { it.activityInfo!! }
+ .let { intent.setComponent(ComponentName(it.packageName, it.name)) }
+ .run { context.sendBroadcast(intent) }
+ }
+
+ private fun Intent.toVerifyParams() = VerifyRequest(
+ id = getIntExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_ID, -1),
+ scheme = getStringExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME)!!,
+ hosts = getStringExtra(PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_HOSTS)!!
+ .split(' '),
+ packageName = getStringExtra(
+ PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME)!!
+
+ )
+}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
new file mode 100644
index 000000000000..6de3d4e160ec
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifier/src/com/android/server/pm/test/intent/verifier/VerifyReceiverTest.kt
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.test.intent.verifier
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.pm.PackageManager
+import android.net.Uri
+import android.os.Bundle
+import android.os.UserHandle
+import androidx.test.InstrumentationRegistry
+import androidx.test.runner.AndroidJUnit4
+import com.android.compatibility.common.util.ShellIdentityUtils
+import com.android.server.pm.test.intent.verify.SetActivityAsAlwaysParams
+import com.android.server.pm.test.intent.verify.StartActivityParams
+import com.android.server.pm.test.intent.verify.VerifyRequest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.File
+
+@RunWith(AndroidJUnit4::class)
+class VerifyReceiverTest {
+
+ val args: Bundle = InstrumentationRegistry.getArguments()
+ val context: Context = InstrumentationRegistry.getContext()
+
+ private val file = context.filesDir.resolve("test.txt")
+
+ @Test
+ fun clearResponse() {
+ file.delete()
+ }
+
+ @Test
+ fun compareLastReceived() {
+ val lastReceivedText = file.readTextIfExists()
+ val expectedText = args.getString("expected")
+ if (expectedText.isNullOrEmpty()) {
+ assertThat(lastReceivedText).isEmpty()
+ return
+ }
+
+ val expectedParams = expectedText.parseParams()
+ val lastReceivedParams = lastReceivedText.parseParams()
+
+ assertThat(lastReceivedParams).hasSize(expectedParams.size)
+
+ lastReceivedParams.zip(expectedParams).forEach { (actual, expected) ->
+ assertThat(actual.hosts).containsExactlyElementsIn(expected.hosts)
+ assertThat(actual.packageName).isEqualTo(expected.packageName)
+ assertThat(actual.scheme).isEqualTo(expected.scheme)
+ }
+ }
+
+ @Test
+ fun setActivityAsAlways() {
+ val params = SetActivityAsAlwaysParams.fromArgs(
+ args.keySet().associateWith { args.getString(it)!! })
+ val uri = Uri.parse(params.uri)
+ val filter = IntentFilter().apply {
+ addAction(Intent.ACTION_VIEW)
+ addCategory(Intent.CATEGORY_DEFAULT)
+ addDataScheme(uri.scheme)
+ addDataAuthority(uri.authority, null)
+ }
+
+ val intent = Intent(Intent.ACTION_VIEW, uri).apply {
+ addCategory(Intent.CATEGORY_DEFAULT)
+ }
+ val allResults = context.packageManager.queryIntentActivities(intent, 0)
+ val allComponents = allResults
+ .map { ComponentName(it.activityInfo.packageName, it.activityInfo.name) }
+ .toTypedArray()
+ val matchingInfo = allResults.first {
+ it.activityInfo.packageName == params.packageName &&
+ it.activityInfo.name == params.activityName
+ }
+
+ ShellIdentityUtils.invokeMethodWithShellPermissions(context.packageManager,
+ ShellIdentityUtils.ShellPermissionMethodHelper<Unit, PackageManager> {
+ it.addUniquePreferredActivity(filter, matchingInfo.match, allComponents,
+ ComponentName(matchingInfo.activityInfo.packageName,
+ matchingInfo.activityInfo.name))
+ it.updateIntentVerificationStatusAsUser(params.packageName,
+ PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
+ UserHandle.myUserId())
+ }, "android.permission.SET_PREFERRED_APPLICATIONS")
+ }
+
+ @Test
+ fun verifyPreviousReceivedSuccess() {
+ file.readTextIfExists()
+ .parseParams()
+ .forEach {
+ context.packageManager.verifyIntentFilter(it.id,
+ PackageManager.INTENT_FILTER_VERIFICATION_SUCCESS, emptyList())
+ }
+ }
+
+ @Test
+ fun verifyPreviousReceivedFailure() {
+ file.readTextIfExists()
+ .parseParams()
+ .forEach {
+ context.packageManager.verifyIntentFilter(it.id,
+ PackageManager.INTENT_FILTER_VERIFICATION_FAILURE, it.hosts)
+ }
+ }
+
+ @Test
+ fun verifyActivityStart() {
+ val params = StartActivityParams
+ .fromArgs(args.keySet().associateWith { args.getString(it)!! })
+ val uri = Uri.parse(params.uri)
+ val intent = Intent(Intent.ACTION_VIEW).apply {
+ data = uri
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ }
+
+ val expectedActivities = params.expected.toMutableList()
+
+ if (params.withBrowsers) {
+ // Since the host doesn't know what browsers the device has, query here and add it to
+ // set if it's expected that browser are returned
+ val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))
+ expectedActivities += context.packageManager.queryIntentActivities(browserIntent, 0)
+ .map { it.activityInfo.name }
+ }
+
+ val infos = context.packageManager.queryIntentActivities(intent, 0)
+ .map { it.activityInfo.name }
+ assertThat(infos).containsExactlyElementsIn(expectedActivities)
+ }
+
+ private fun File.readTextIfExists() = if (exists()) readText() else ""
+
+ // Rudimentary list deserialization by splitting text block into 4 line sections
+ private fun String.parseParams() = trim()
+ .lines()
+ .windowed(4, 4)
+ .map { it.joinToString(separator = "\n") }
+ .map { VerifyRequest.deserialize(it) }
+}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp
new file mode 100644
index 000000000000..7161fdd33516
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/Android.bp
@@ -0,0 +1,48 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget1",
+ manifest: "AndroidManifest1.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget2",
+ manifest: "AndroidManifest2.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget3",
+ manifest: "AndroidManifest3.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget4Base",
+ manifest: "AndroidManifest4Base.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget4NoAutoVerify",
+ manifest: "AndroidManifest4NoAutoVerify.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget4Wildcard",
+ manifest: "AndroidManifest4Wildcard.xml",
+}
+
+android_test_helper_app {
+ name: "PackageManagerTestIntentVerifierTarget4WildcardNoAutoVerify",
+ manifest: "AndroidManifest4WildcardNoAutoVerify.xml",
+}
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml
new file mode 100644
index 000000000000..6cf5c7619a30
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest1.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.one" android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="verify.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="false">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="no_verify.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:host="http_only.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="https" />
+ <data android:host="https_only.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="htttps" />
+ <data android:host="non_http.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="https" />
+ <data android:scheme="non_web_scheme" />
+ <data android:host="https_plus_non_web_scheme.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".TargetActivity2" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="other_activity.pm.server.android.com" />
+ </intent-filter>
+
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="multiple.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml
new file mode 100644
index 000000000000..087ef70595f9
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.two"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:scheme="non_web_scheme" />
+ <data android:host="only_https_plus_non_web_scheme.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml
new file mode 100644
index 000000000000..eb75b5e53bc8
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest3.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.three"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:host="multiple.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml
new file mode 100644
index 000000000000..7eacb8bc8fb7
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Base.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.four"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="failing.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml
new file mode 100644
index 000000000000..ecfee55b9c4a
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4NoAutoVerify.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.four"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="false">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="failing.pm.server.android.com" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml
new file mode 100644
index 000000000000..0f0f53ba07e9
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4Wildcard.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.four"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="true">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="failing.pm.server.android.com" />
+ <data android:host="*.wildcard.tld" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml
new file mode 100644
index 000000000000..d5652e1b924d
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/host/test-apps/IntentVerifierTarget/AndroidManifest4WildcardNoAutoVerify.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2020 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.pm.test.intent.verifier.target.four"
+ android:versionCode="1">
+
+ <application>
+ <activity android:name=".TargetActivity" android:exported="true">
+ <intent-filter android:autoVerify="false">
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="failing.pm.server.android.com" />
+ <data android:host="*.wildcard.tld" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/tests/AutoVerify/app1/Android.bp b/tests/AutoVerify/app1/Android.bp
deleted file mode 100644
index 548519fa653b..000000000000
--- a/tests/AutoVerify/app1/Android.bp
+++ /dev/null
@@ -1,11 +0,0 @@
-android_app {
- name: "AutoVerifyTest",
- srcs: ["src/**/*.java"],
- resource_dirs: ["res"],
- platform_apis: true,
- min_sdk_version: "26",
- target_sdk_version: "26",
- optimize: {
- enabled: false,
- },
-}
diff --git a/tests/AutoVerify/app1/AndroidManifest.xml b/tests/AutoVerify/app1/AndroidManifest.xml
deleted file mode 100644
index d9caad490d82..000000000000
--- a/tests/AutoVerify/app1/AndroidManifest.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test.autoverify" >
-
- <uses-sdk android:targetSdkVersion="26" />
-
- <application
- android:label="@string/app_name" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="explicit.example.com" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/AutoVerify/app1/res/values/strings.xml b/tests/AutoVerify/app1/res/values/strings.xml
deleted file mode 100644
index e234355041c6..000000000000
--- a/tests/AutoVerify/app1/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2020 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<resources>
- <!-- app icon label, do not translate -->
- <string name="app_name" translatable="false">AutoVerify Test</string>
-</resources>
diff --git a/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java
deleted file mode 100644
index 09ef47212622..000000000000
--- a/tests/AutoVerify/app1/src/com/android/test/autoverify/MainActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
diff --git a/tests/AutoVerify/app2/Android.bp b/tests/AutoVerify/app2/Android.bp
deleted file mode 100644
index 1c6c97bdf350..000000000000
--- a/tests/AutoVerify/app2/Android.bp
+++ /dev/null
@@ -1,11 +0,0 @@
-android_app {
- name: "AutoVerifyTest2",
- srcs: ["src/**/*.java"],
- resource_dirs: ["res"],
- platform_apis: true,
- min_sdk_version: "26",
- target_sdk_version: "26",
- optimize: {
- enabled: false,
- },
-}
diff --git a/tests/AutoVerify/app2/AndroidManifest.xml b/tests/AutoVerify/app2/AndroidManifest.xml
deleted file mode 100644
index a00807883cfc..000000000000
--- a/tests/AutoVerify/app2/AndroidManifest.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test.autoverify" >
-
- <uses-sdk android:targetSdkVersion="26" />
-
- <application
- android:label="@string/app_name" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
-
- <intent-filter android:autoVerify="true">
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="explicit.example.com" />
- <data android:host="*.wildcard.tld" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/AutoVerify/app2/res/values/strings.xml b/tests/AutoVerify/app2/res/values/strings.xml
deleted file mode 100644
index e234355041c6..000000000000
--- a/tests/AutoVerify/app2/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2020 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<resources>
- <!-- app icon label, do not translate -->
- <string name="app_name" translatable="false">AutoVerify Test</string>
-</resources>
diff --git a/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java
deleted file mode 100644
index 09ef47212622..000000000000
--- a/tests/AutoVerify/app2/src/com/android/test/autoverify/MainActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
diff --git a/tests/AutoVerify/app3/Android.bp b/tests/AutoVerify/app3/Android.bp
deleted file mode 100644
index 70a2b77d1000..000000000000
--- a/tests/AutoVerify/app3/Android.bp
+++ /dev/null
@@ -1,11 +0,0 @@
-android_app {
- name: "AutoVerifyTest3",
- srcs: ["src/**/*.java"],
- resource_dirs: ["res"],
- platform_apis: true,
- min_sdk_version: "26",
- target_sdk_version: "26",
- optimize: {
- enabled: false,
- },
-}
diff --git a/tests/AutoVerify/app3/AndroidManifest.xml b/tests/AutoVerify/app3/AndroidManifest.xml
deleted file mode 100644
index efaabc9a38d3..000000000000
--- a/tests/AutoVerify/app3/AndroidManifest.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test.autoverify" >
-
- <uses-sdk android:targetSdkVersion="26" />
-
- <application
- android:label="@string/app_name" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
-
- <!-- does not request autoVerify -->
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="explicit.example.com" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/AutoVerify/app3/res/values/strings.xml b/tests/AutoVerify/app3/res/values/strings.xml
deleted file mode 100644
index e234355041c6..000000000000
--- a/tests/AutoVerify/app3/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2020 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<resources>
- <!-- app icon label, do not translate -->
- <string name="app_name" translatable="false">AutoVerify Test</string>
-</resources>
diff --git a/tests/AutoVerify/app4/Android.bp b/tests/AutoVerify/app4/Android.bp
deleted file mode 100644
index fbdae1181a7a..000000000000
--- a/tests/AutoVerify/app4/Android.bp
+++ /dev/null
@@ -1,11 +0,0 @@
-android_app {
- name: "AutoVerifyTest4",
- srcs: ["src/**/*.java"],
- resource_dirs: ["res"],
- platform_apis: true,
- min_sdk_version: "26",
- target_sdk_version: "26",
- optimize: {
- enabled: false,
- },
-}
diff --git a/tests/AutoVerify/app4/AndroidManifest.xml b/tests/AutoVerify/app4/AndroidManifest.xml
deleted file mode 100644
index 1c975f8336c9..000000000000
--- a/tests/AutoVerify/app4/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test.autoverify" >
-
- <uses-sdk android:targetSdkVersion="26" />
-
- <application
- android:label="@string/app_name" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
-
- <!-- intentionally does not autoVerify -->
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="http" />
- <data android:scheme="https" />
- <data android:host="explicit.example.com" />
- <data android:host="*.wildcard.tld" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/AutoVerify/app4/res/values/strings.xml b/tests/AutoVerify/app4/res/values/strings.xml
deleted file mode 100644
index e234355041c6..000000000000
--- a/tests/AutoVerify/app4/res/values/strings.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2020 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-
-<resources>
- <!-- app icon label, do not translate -->
- <string name="app_name" translatable="false">AutoVerify Test</string>
-</resources>
diff --git a/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java b/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java
deleted file mode 100644
index 09ef47212622..000000000000
--- a/tests/AutoVerify/app4/src/com/android/test/autoverify/MainActivity.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
diff --git a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
index c2a5459ae125..f80af034fa2b 100644
--- a/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
+++ b/tests/utils/hostutils/src/com/android/internal/util/test/SystemPreparer.java
@@ -62,12 +62,22 @@ public class SystemPreparer extends ExternalResource {
private final RebootStrategy mRebootStrategy;
private final TearDownRule mTearDownRule;
+ // When debugging, it may be useful to run a test case without rebooting the device afterwards,
+ // to manually verify the device state.
+ private boolean mDebugSkipAfterReboot;
+
public SystemPreparer(TemporaryFolder hostTempFolder, DeviceProvider deviceProvider) {
this(hostTempFolder, RebootStrategy.FULL, null, deviceProvider);
}
public SystemPreparer(TemporaryFolder hostTempFolder, RebootStrategy rebootStrategy,
@Nullable TestRuleDelegate testRuleDelegate, DeviceProvider deviceProvider) {
+ this(hostTempFolder, rebootStrategy, testRuleDelegate, false, deviceProvider);
+ }
+
+ public SystemPreparer(TemporaryFolder hostTempFolder, RebootStrategy rebootStrategy,
+ @Nullable TestRuleDelegate testRuleDelegate, boolean debugSkipAfterReboot,
+ DeviceProvider deviceProvider) {
mHostTempFolder = hostTempFolder;
mDeviceProvider = deviceProvider;
mRebootStrategy = rebootStrategy;
@@ -75,6 +85,7 @@ public class SystemPreparer extends ExternalResource {
if (testRuleDelegate != null) {
testRuleDelegate.setDelegate(mTearDownRule);
}
+ mDebugSkipAfterReboot = debugSkipAfterReboot;
}
/** Copies a file within the host test jar to a path on device. */
@@ -172,7 +183,9 @@ public class SystemPreparer extends ExternalResource {
case USERSPACE_UNTIL_ONLINE:
device.rebootUserspaceUntilOnline();
break;
- case START_STOP:
+ // TODO(b/159540015): Make this START_STOP instead of default once it's fixed. Can't
+ // currently be done because START_STOP is commented out.
+ default:
device.executeShellCommand("stop");
device.executeShellCommand("start");
ITestDevice.RecoveryMode cachedRecoveryMode = device.getRecoveryMode();
@@ -228,7 +241,9 @@ public class SystemPreparer extends ExternalResource {
for (final String packageName : mInstalledPackages) {
device.uninstallPackage(packageName);
}
- reboot();
+ if (!mDebugSkipAfterReboot) {
+ reboot();
+ }
} catch (DeviceNotAvailableException e) {
Assert.fail(e.toString());
}
@@ -355,6 +370,7 @@ public class SystemPreparer extends ExternalResource {
/**
* How to reboot the device. Ordered from slowest to fastest.
*/
+ @SuppressWarnings("DanglingJavadoc")
public enum RebootStrategy {
/** @see ITestDevice#reboot() */
FULL,
@@ -374,7 +390,15 @@ public class SystemPreparer extends ExternalResource {
*
* TODO(b/159540015): There's a bug with this causing unnecessary disk space usage, which
* can eventually lead to an insufficient storage space error.
+ *
+ * This can be uncommented for local development, but should be left out when merging.
+ * It is done this way to hopefully be caught by code review, since merging this will
+ * break all of postsubmit. But the nearly 50% reduction in test runtime is worth having
+ * this option exist.
+ *
+ * @deprecated do not use this in merged code until bug is resolved
*/
- START_STOP
+// @Deprecated
+// START_STOP
}
}