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