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.nfc.cardemulation;
18 
19 import static org.mockito.ArgumentMatchers.any;
20 import static org.mockito.ArgumentMatchers.eq;
21 import static org.mockito.Mockito.verify;
22 import static org.mockito.Mockito.verifyZeroInteractions;
23 import static org.mockito.Mockito.when;
24 
25 import android.app.role.RoleManager;
26 import android.content.Context;
27 import android.os.UserHandle;
28 
29 import androidx.test.ext.junit.runners.AndroidJUnit4;
30 
31 import com.google.common.collect.ImmutableList;
32 import com.android.nfc.NfcEventLog;
33 import com.android.nfc.NfcInjector;
34 
35 import org.junit.Assert;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.ArgumentCaptor;
40 import org.mockito.Captor;
41 import org.mockito.Mock;
42 import org.mockito.MockitoAnnotations;
43 
44 
45 
46 import java.util.List;
47 import java.util.concurrent.Executor;
48 
49 @RunWith(AndroidJUnit4.class)
50 public class WalletRoleObserverTest {
51 
52     private static final int USER_ID = 1;
53     private static final UserHandle USER_HANDLE = UserHandle.of(USER_ID);
54 
55     private static final String WALLET_ROLE_HOLDER = "gms.wallet.stuff";
56 
57     WalletRoleObserver mWalletRoleObserver;
58     @Mock
59     Context mContext;
60     @Mock
61     RoleManager mRoleManager;
62     @Mock
63     WalletRoleObserver.Callback mCallback;
64     @Mock
65     Executor mExecutor;
66     @Mock
67     NfcInjector mNfcInjector;
68     @Mock
69     NfcEventLog mNfcEventLog;
70     @Captor
71     ArgumentCaptor<String> mRoleNameCaptor;
72     @Captor
73     ArgumentCaptor<UserHandle> mUserHandlerCaptor;
74     @Captor
75     ArgumentCaptor<Executor> mExecutorCaptor;
76     @Captor
77     ArgumentCaptor<String> mRoleHolderCaptor;
78     @Before
setUp()79     public void setUp() {
80         MockitoAnnotations.initMocks(this);
81         when(mContext.getMainExecutor()).thenReturn(mExecutor);
82         when(mNfcInjector.getNfcEventLog()).thenReturn(mNfcEventLog);
83         mWalletRoleObserver =
84             new WalletRoleObserver(mContext, mRoleManager, mCallback, mNfcInjector);
85     }
86 
87     @Test
testConstructor()88     public void testConstructor() {
89         verify(mContext).getMainExecutor();
90         verify(mRoleManager).addOnRoleHoldersChangedListenerAsUser(mExecutorCaptor.capture(),any(),
91                 mUserHandlerCaptor.capture());
92         Assert.assertEquals(mExecutor, mExecutorCaptor.getValue());
93         Assert.assertEquals(UserHandle.ALL, mUserHandlerCaptor.getValue());
94     }
95 
96     @Test
testGetDefaultWalletRoleHolder_roleAvailable_returnsTheHolder()97     public void testGetDefaultWalletRoleHolder_roleAvailable_returnsTheHolder() {
98         List<String> roleHolders = ImmutableList.of(WALLET_ROLE_HOLDER);
99         when(mRoleManager.isRoleAvailable(eq(RoleManager.ROLE_WALLET))).thenReturn(true);
100         when(mRoleManager.getRoleHoldersAsUser(eq(RoleManager.ROLE_WALLET),
101                 eq(USER_HANDLE))).thenReturn(roleHolders);
102 
103         String roleHolder = mWalletRoleObserver.getDefaultWalletRoleHolder(USER_ID);
104 
105         verify(mRoleManager).isRoleAvailable(mRoleNameCaptor.capture());
106         verify(mRoleManager).getRoleHoldersAsUser(mRoleNameCaptor.capture(),
107                 mUserHandlerCaptor.capture());
108         Assert.assertEquals(roleHolder, WALLET_ROLE_HOLDER);
109         Assert.assertEquals(RoleManager.ROLE_WALLET, mRoleNameCaptor.getAllValues().get(0));
110         Assert.assertEquals(RoleManager.ROLE_WALLET, mRoleNameCaptor.getAllValues().get(1));
111     }
112 
113     @Test
testGetDefaultWalletRoleHolder_roleNotAvailable_returnsNull()114     public void testGetDefaultWalletRoleHolder_roleNotAvailable_returnsNull() {
115         when(mRoleManager.isRoleAvailable(eq(RoleManager.ROLE_WALLET))).thenReturn(false);
116 
117         String roleHolder = mWalletRoleObserver.getDefaultWalletRoleHolder(USER_ID);
118 
119         Assert.assertNull(roleHolder);
120     }
121 
122     @Test
testCallbackFiringOnRoleChange_roleWallet()123     public void testCallbackFiringOnRoleChange_roleWallet() {
124         List<String> roleHolders = ImmutableList.of(WALLET_ROLE_HOLDER);
125         when(mRoleManager.getRoleHolders(eq(RoleManager.ROLE_WALLET))).thenReturn(roleHolders);
126         mWalletRoleObserver.mOnRoleHoldersChangedListener
127                 .onRoleHoldersChanged(RoleManager.ROLE_WALLET, USER_HANDLE);
128 
129         verify(mRoleManager).getRoleHolders(mRoleNameCaptor.capture());
130         verify(mCallback).onWalletRoleHolderChanged(mRoleHolderCaptor.capture(), eq(USER_ID));
131         Assert.assertEquals(RoleManager.ROLE_WALLET, mRoleNameCaptor.getValue());
132         Assert.assertEquals(WALLET_ROLE_HOLDER, mRoleHolderCaptor.getValue());
133     }
134 
135     @Test
testCallbackNotFiringOnRoleChange_roleNonWallet()136     public void testCallbackNotFiringOnRoleChange_roleNonWallet() {
137         mWalletRoleObserver.mOnRoleHoldersChangedListener
138                 .onRoleHoldersChanged(RoleManager.ROLE_ASSISTANT, USER_HANDLE);
139 
140         verifyZeroInteractions(mCallback);
141     }
142 
143     @Test
testOnUserSwitched_callsCallback()144     public void testOnUserSwitched_callsCallback() {
145         List<String> roleHolders = ImmutableList.of(WALLET_ROLE_HOLDER);
146         when(mRoleManager.isRoleAvailable(eq(RoleManager.ROLE_WALLET))).thenReturn(true);
147         when(mRoleManager.getRoleHoldersAsUser(eq(RoleManager.ROLE_WALLET),
148                 eq(USER_HANDLE))).thenReturn(roleHolders);
149 
150         mWalletRoleObserver.onUserSwitched(USER_ID);
151         verify(mRoleManager).isRoleAvailable(mRoleNameCaptor.capture());
152         verify(mRoleManager).getRoleHoldersAsUser(mRoleNameCaptor.capture(),
153                 mUserHandlerCaptor.capture());
154         verify(mCallback).onWalletRoleHolderChanged(mRoleHolderCaptor.capture(), eq(USER_ID));
155         Assert.assertEquals(WALLET_ROLE_HOLDER, mRoleHolderCaptor.getValue());
156         Assert.assertEquals(RoleManager.ROLE_WALLET, mRoleNameCaptor.getAllValues().get(0));
157         Assert.assertEquals(RoleManager.ROLE_WALLET, mRoleNameCaptor.getAllValues().get(1));
158     }
159 
160 }
161