aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt')
-rw-r--r--tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt309
1 files changed, 309 insertions, 0 deletions
diff --git a/tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt b/tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt
new file mode 100644
index 0000000..9786b80
--- /dev/null
+++ b/tests/unit/src/com/android/intentresolver/v2/listcontroller/ResolvedComponentFilteringTest.kt
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2023 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.intentresolver.v2.listcontroller
+
+import android.content.ComponentName
+import android.content.Intent
+import android.content.pm.ActivityInfo
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.content.pm.ResolveInfo
+import com.android.intentresolver.ResolvedComponentInfo
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Assert.assertThrows
+import org.junit.Before
+import org.junit.Test
+
+class ResolvedComponentFilteringTest {
+
+ private lateinit var resolvedComponentFiltering: ResolvedComponentFiltering
+
+ private val fakeFilterableComponents =
+ object : FilterableComponents {
+ override fun isComponentFiltered(name: ComponentName): Boolean {
+ return name.packageName == "FilteredPackage"
+ }
+ }
+
+ private val fakePermissionChecker =
+ object : PermissionChecker {
+ override suspend fun checkComponentPermission(
+ permission: String,
+ uid: Int,
+ owningUid: Int,
+ exported: Boolean
+ ): Int {
+ return if (permission == "MissingPermission") {
+ PackageManager.PERMISSION_DENIED
+ } else {
+ PackageManager.PERMISSION_GRANTED
+ }
+ }
+ }
+
+ @Before
+ fun setup() {
+ resolvedComponentFiltering =
+ ResolvedComponentFilteringImpl(
+ launchedFromUid = 123,
+ filterableComponents = fakeFilterableComponents,
+ permissionChecker = fakePermissionChecker,
+ )
+ }
+
+ @Test
+ fun filterIneligibleActivities_returnsListWithoutFilteredComponents() = runTest {
+ // Arrange
+ val testIntent = Intent("TestAction")
+ val testResolveInfo =
+ ResolveInfo().apply {
+ activityInfo = ActivityInfo()
+ activityInfo.packageName = "TestPackage"
+ activityInfo.name = "TestClass"
+ activityInfo.permission = "TestPermission"
+ activityInfo.applicationInfo = ApplicationInfo()
+ activityInfo.applicationInfo.uid = 456
+ activityInfo.exported = false
+ }
+ val filteredResolveInfo =
+ ResolveInfo().apply {
+ activityInfo = ActivityInfo()
+ activityInfo.packageName = "FilteredPackage"
+ activityInfo.name = "FilteredClass"
+ activityInfo.permission = "TestPermission"
+ activityInfo.applicationInfo = ApplicationInfo()
+ activityInfo.applicationInfo.uid = 456
+ activityInfo.exported = false
+ }
+ val missingPermissionResolveInfo =
+ ResolveInfo().apply {
+ activityInfo = ActivityInfo()
+ activityInfo.packageName = "NoPermissionPackage"
+ activityInfo.name = "NoPermissionClass"
+ activityInfo.permission = "MissingPermission"
+ activityInfo.applicationInfo = ApplicationInfo()
+ activityInfo.applicationInfo.uid = 456
+ activityInfo.exported = false
+ }
+ val testInput =
+ listOf(
+ ResolvedComponentInfo(
+ ComponentName("TestPackage", "TestClass"),
+ testIntent,
+ testResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("FilteredPackage", "FilteredClass"),
+ testIntent,
+ filteredResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("NoPermissionPackage", "NoPermissionClass"),
+ testIntent,
+ missingPermissionResolveInfo,
+ )
+ )
+
+ // Act
+ val result = resolvedComponentFiltering.filterIneligibleActivities(testInput)
+
+ // Assert
+ assertThat(result).hasSize(1)
+ with(result.first()) {
+ assertThat(name.packageName).isEqualTo("TestPackage")
+ assertThat(name.className).isEqualTo("TestClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(testResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ }
+
+ @Test
+ fun filterLowPriority_filtersAfterFirstDifferentPriority() {
+ // Arrange
+ val testIntent = Intent("TestAction")
+ val testResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val equalResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val diffResolveInfo =
+ ResolveInfo().apply {
+ priority = 2
+ isDefault = true
+ }
+ val testInput =
+ listOf(
+ ResolvedComponentInfo(
+ ComponentName("TestPackage", "TestClass"),
+ testIntent,
+ testResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("EqualPackage", "EqualClass"),
+ testIntent,
+ equalResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("DiffPackage", "DiffClass"),
+ testIntent,
+ diffResolveInfo,
+ ),
+ )
+
+ // Act
+ val result = resolvedComponentFiltering.filterLowPriority(testInput)
+
+ // Assert
+ assertThat(result).hasSize(2)
+ with(result.first()) {
+ assertThat(name.packageName).isEqualTo("TestPackage")
+ assertThat(name.className).isEqualTo("TestClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(testResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ with(result[1]) {
+ assertThat(name.packageName).isEqualTo("EqualPackage")
+ assertThat(name.className).isEqualTo("EqualClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(equalResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ }
+
+ @Test
+ fun filterLowPriority_filtersAfterFirstDifferentDefault() {
+ // Arrange
+ val testIntent = Intent("TestAction")
+ val testResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val equalResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val diffResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = false
+ }
+ val testInput =
+ listOf(
+ ResolvedComponentInfo(
+ ComponentName("TestPackage", "TestClass"),
+ testIntent,
+ testResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("EqualPackage", "EqualClass"),
+ testIntent,
+ equalResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("DiffPackage", "DiffClass"),
+ testIntent,
+ diffResolveInfo,
+ ),
+ )
+
+ // Act
+ val result = resolvedComponentFiltering.filterLowPriority(testInput)
+
+ // Assert
+ assertThat(result).hasSize(2)
+ with(result.first()) {
+ assertThat(name.packageName).isEqualTo("TestPackage")
+ assertThat(name.className).isEqualTo("TestClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(testResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ with(result[1]) {
+ assertThat(name.packageName).isEqualTo("EqualPackage")
+ assertThat(name.className).isEqualTo("EqualClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(equalResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ }
+
+ @Test
+ fun filterLowPriority_whenNoDifference_returnsOriginal() {
+ // Arrange
+ val testIntent = Intent("TestAction")
+ val testResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val equalResolveInfo =
+ ResolveInfo().apply {
+ priority = 1
+ isDefault = true
+ }
+ val testInput =
+ listOf(
+ ResolvedComponentInfo(
+ ComponentName("TestPackage", "TestClass"),
+ testIntent,
+ testResolveInfo,
+ ),
+ ResolvedComponentInfo(
+ ComponentName("EqualPackage", "EqualClass"),
+ testIntent,
+ equalResolveInfo,
+ ),
+ )
+
+ // Act
+ val result = resolvedComponentFiltering.filterLowPriority(testInput)
+
+ // Assert
+ assertThat(result).hasSize(2)
+ with(result.first()) {
+ assertThat(name.packageName).isEqualTo("TestPackage")
+ assertThat(name.className).isEqualTo("TestClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(testResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ with(result[1]) {
+ assertThat(name.packageName).isEqualTo("EqualPackage")
+ assertThat(name.className).isEqualTo("EqualClass")
+ assertThat(getIntentAt(0)).isEqualTo(testIntent)
+ assertThrows(IndexOutOfBoundsException::class.java) { getIntentAt(1) }
+ assertThat(getResolveInfoAt(0)).isEqualTo(equalResolveInfo)
+ assertThrows(IndexOutOfBoundsException::class.java) { getResolveInfoAt(1) }
+ }
+ }
+}