• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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