1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.intentresolver 18 19 import com.android.intentresolver.annotation.JavaInterop 20 import com.android.intentresolver.data.repository.FakeUserRepository 21 import com.android.intentresolver.domain.interactor.UserInteractor 22 import com.android.intentresolver.shared.model.Profile 23 import com.android.intentresolver.shared.model.User 24 import com.google.common.truth.Truth.assertThat 25 import kotlinx.coroutines.Dispatchers 26 import kotlinx.coroutines.test.runTest 27 import org.junit.Test 28 29 @OptIn(JavaInterop::class) 30 class ProfileHelperTest { 31 32 private val personalUser = User(0, User.Role.PERSONAL) 33 private val cloneUser = User(10, User.Role.CLONE) 34 35 private val personalProfile = Profile(Profile.Type.PERSONAL, personalUser) 36 private val personalWithCloneProfile = Profile(Profile.Type.PERSONAL, personalUser, cloneUser) 37 38 private val workUser = User(11, User.Role.WORK) 39 private val workProfile = Profile(Profile.Type.WORK, workUser) 40 41 private val privateUser = User(12, User.Role.PRIVATE) 42 private val privateProfile = Profile(Profile.Type.PRIVATE, privateUser) 43 assertProfilesnull44 private fun assertProfiles( 45 helper: ProfileHelper, 46 personalProfile: Profile, 47 workProfile: Profile? = null, 48 privateProfile: Profile? = null, 49 ) { 50 assertThat(helper.personalProfile).isEqualTo(personalProfile) 51 assertThat(helper.personalHandle).isEqualTo(personalProfile.primary.handle) 52 53 personalProfile.clone?.also { 54 assertThat(helper.cloneUserPresent).isTrue() 55 assertThat(helper.cloneHandle).isEqualTo(it.handle) 56 } 57 ?: { 58 assertThat(helper.cloneUserPresent).isFalse() 59 assertThat(helper.cloneHandle).isNull() 60 } 61 62 workProfile?.also { 63 assertThat(helper.workProfilePresent).isTrue() 64 assertThat(helper.workProfile).isEqualTo(it) 65 assertThat(helper.workHandle).isEqualTo(it.primary.handle) 66 } 67 ?: { 68 assertThat(helper.workProfilePresent).isFalse() 69 assertThat(helper.workProfile).isNull() 70 assertThat(helper.workHandle).isNull() 71 } 72 73 privateProfile?.also { 74 assertThat(helper.privateProfilePresent).isTrue() 75 assertThat(helper.privateProfile).isEqualTo(it) 76 assertThat(helper.privateHandle).isEqualTo(it.primary.handle) 77 } 78 ?: { 79 assertThat(helper.privateProfilePresent).isFalse() 80 assertThat(helper.privateProfile).isNull() 81 assertThat(helper.privateHandle).isNull() 82 } 83 } 84 85 @Test <lambda>null86 fun launchedByPersonal() = runTest { 87 val repository = FakeUserRepository(listOf(personalUser)) 88 val interactor = UserInteractor(repository, launchedAs = personalUser.handle) 89 90 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 91 92 assertProfiles(helper, personalProfile) 93 94 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 95 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PERSONAL) 96 assertThat(helper.getQueryIntentsHandle(personalUser.handle)) 97 .isEqualTo(personalProfile.primary.handle) 98 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(personalProfile.primary.handle) 99 } 100 101 @Test <lambda>null102 fun launchedByPersonal_withClone() = runTest { 103 val repository = FakeUserRepository(listOf(personalUser, cloneUser)) 104 val interactor = UserInteractor(repository, launchedAs = personalUser.handle) 105 106 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 107 108 assertProfiles(helper, personalWithCloneProfile) 109 110 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 111 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PERSONAL) 112 assertThat(helper.getQueryIntentsHandle(personalUser.handle)).isEqualTo(personalUser.handle) 113 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(personalProfile.primary.handle) 114 } 115 116 @Test <lambda>null117 fun launchedByClone() = runTest { 118 val repository = FakeUserRepository(listOf(personalUser, cloneUser)) 119 val interactor = UserInteractor(repository, launchedAs = cloneUser.handle) 120 121 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 122 123 assertProfiles(helper, personalWithCloneProfile) 124 125 assertThat(helper.isLaunchedAsCloneProfile).isTrue() 126 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PERSONAL) 127 assertThat(helper.getQueryIntentsHandle(personalWithCloneProfile.primary.handle)) 128 .isEqualTo(personalWithCloneProfile.clone?.handle) 129 assertThat(helper.tabOwnerUserHandleForLaunch) 130 .isEqualTo(personalWithCloneProfile.primary.handle) 131 } 132 133 @Test <lambda>null134 fun launchedByPersonal_withWork() = runTest { 135 val repository = FakeUserRepository(listOf(personalUser, workUser)) 136 val interactor = UserInteractor(repository, launchedAs = personalUser.handle) 137 138 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 139 140 assertProfiles(helper, personalProfile = personalProfile, workProfile = workProfile) 141 142 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PERSONAL) 143 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 144 assertThat(helper.getQueryIntentsHandle(personalUser.handle)) 145 .isEqualTo(personalProfile.primary.handle) 146 assertThat(helper.getQueryIntentsHandle(workUser.handle)) 147 .isEqualTo(workProfile.primary.handle) 148 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(personalProfile.primary.handle) 149 } 150 151 @Test <lambda>null152 fun launchedByWork() = runTest { 153 val repository = FakeUserRepository(listOf(personalUser, workUser)) 154 val interactor = UserInteractor(repository, launchedAs = workUser.handle) 155 156 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 157 158 assertProfiles(helper, personalProfile = personalProfile, workProfile = workProfile) 159 160 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 161 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.WORK) 162 assertThat(helper.getQueryIntentsHandle(personalProfile.primary.handle)) 163 .isEqualTo(personalProfile.primary.handle) 164 assertThat(helper.getQueryIntentsHandle(workProfile.primary.handle)) 165 .isEqualTo(workProfile.primary.handle) 166 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(workProfile.primary.handle) 167 } 168 169 @Test <lambda>null170 fun launchedByPersonal_withPrivate() = runTest { 171 val repository = FakeUserRepository(listOf(personalUser, privateUser)) 172 val interactor = UserInteractor(repository, launchedAs = personalUser.handle) 173 174 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 175 176 assertProfiles(helper, personalProfile = personalProfile, privateProfile = privateProfile) 177 178 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 179 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PERSONAL) 180 assertThat(helper.getQueryIntentsHandle(personalProfile.primary.handle)) 181 .isEqualTo(personalProfile.primary.handle) 182 assertThat(helper.getQueryIntentsHandle(privateProfile.primary.handle)) 183 .isEqualTo(privateProfile.primary.handle) 184 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(personalProfile.primary.handle) 185 } 186 187 @Test <lambda>null188 fun launchedByPrivate() = runTest { 189 val repository = FakeUserRepository(listOf(personalUser, privateUser)) 190 val interactor = UserInteractor(repository, launchedAs = privateUser.handle) 191 192 val helper = ProfileHelper(interactor = interactor, background = Dispatchers.Unconfined) 193 194 assertProfiles(helper, personalProfile = personalProfile, privateProfile = privateProfile) 195 196 assertThat(helper.isLaunchedAsCloneProfile).isFalse() 197 assertThat(helper.launchedAsProfileType).isEqualTo(Profile.Type.PRIVATE) 198 assertThat(helper.getQueryIntentsHandle(personalProfile.primary.handle)) 199 .isEqualTo(personalProfile.primary.handle) 200 assertThat(helper.getQueryIntentsHandle(privateProfile.primary.handle)) 201 .isEqualTo(privateProfile.primary.handle) 202 assertThat(helper.tabOwnerUserHandleForLaunch).isEqualTo(privateProfile.primary.handle) 203 } 204 } 205