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 package com.android.nfc.cardemulation; 17 18 import static org.junit.Assert.assertEquals; 19 import static org.junit.Assert.assertFalse; 20 import static org.mockito.ArgumentMatchers.anyInt; 21 import static org.mockito.Mockito.verify; 22 import static org.mockito.Mockito.when; 23 24 import androidx.test.runner.AndroidJUnit4; 25 26 import com.android.dx.mockito.inline.extended.ExtendedMockito; 27 import com.android.nfc.NfcService; 28 import com.android.nfc.dhimpl.NativeNfcManager; 29 30 import org.junit.After; 31 import org.junit.Before; 32 import org.junit.Test; 33 import org.junit.runner.RunWith; 34 import org.mockito.ArgumentCaptor; 35 import org.mockito.Captor; 36 import org.mockito.Mock; 37 import org.mockito.MockitoAnnotations; 38 import org.mockito.MockitoSession; 39 import org.mockito.quality.Strictness; 40 41 @RunWith(AndroidJUnit4.class) 42 public class RoutingOptionManagerTest { 43 44 @Mock 45 private NfcService mNfcService; 46 @Mock 47 private NativeNfcManager mNativeNfcManager; 48 49 @Captor 50 private ArgumentCaptor<Integer> mRouteCaptor; 51 52 private static final int DEFAULT_ROUTE = 0; 53 private static final int DEFAULT_ISO_DEP_ROUTE = 1; 54 private static final int NDEF_NFCEE_ROUTE = 4; 55 private static final int OVERRIDDEN_ISO_DEP_ROUTE = 10; 56 private static final int OVERRIDDEN_OFF_HOST_ROUTE = 20; 57 private static final int DEFAULT_OFF_HOST_ROUTE = 2; 58 private static final int DEFAULT_FELICA_ROUTE = 3; 59 private static final int DEFAULT_SC_ROUTE = 2; 60 private static final byte[] OFF_HOST_UICC = new byte[] {5, 6}; 61 private static final byte[] OFF_HOST_ESE = new byte[] {3, 4}; 62 private static final int AID_MATCHING_MODE = 3; 63 private static final int DEFAULT_EUICC_MEP_MODE = 0; 64 65 private static class TestRoutingOptionManager extends RoutingOptionManager { 66 @Override doGetDefaultRouteDestination()67 int doGetDefaultRouteDestination() { 68 return DEFAULT_ROUTE; 69 } 70 71 @Override doGetDefaultIsoDepRouteDestination()72 int doGetDefaultIsoDepRouteDestination() { 73 return DEFAULT_ISO_DEP_ROUTE; 74 } 75 76 @Override doGetDefaultOffHostRouteDestination()77 int doGetDefaultOffHostRouteDestination() { 78 return DEFAULT_OFF_HOST_ROUTE; 79 } 80 81 @Override doGetDefaultFelicaRouteDestination()82 int doGetDefaultFelicaRouteDestination() { 83 return DEFAULT_FELICA_ROUTE; 84 } 85 86 @Override doGetDefaultScRouteDestination()87 int doGetDefaultScRouteDestination() { 88 return DEFAULT_SC_ROUTE; 89 } 90 91 @Override doGetOffHostUiccDestination()92 byte[] doGetOffHostUiccDestination() { 93 return OFF_HOST_UICC; 94 } 95 96 @Override doGetOffHostEseDestination()97 byte[] doGetOffHostEseDestination() { 98 return OFF_HOST_ESE; 99 } 100 101 @Override doGetAidMatchingMode()102 int doGetAidMatchingMode() { 103 return AID_MATCHING_MODE; 104 } 105 106 @Override doGetEuiccMepMode()107 int doGetEuiccMepMode() { 108 return DEFAULT_EUICC_MEP_MODE; 109 } 110 } 111 112 private TestRoutingOptionManager mManager; 113 private MockitoSession mStaticMockSession; 114 115 @Before setUp()116 public void setUp() throws Exception { 117 mStaticMockSession = ExtendedMockito.mockitoSession() 118 .mockStatic(NfcService.class) 119 .mockStatic(NativeNfcManager.class) 120 .strictness(Strictness.LENIENT) 121 .startMocking(); 122 MockitoAnnotations.initMocks(this); 123 124 when(mNativeNfcManager.getNdefNfceeRouteId()).thenReturn(NDEF_NFCEE_ROUTE); 125 when(NfcService.getInstance()).thenReturn(mNfcService); 126 when(NativeNfcManager.getInstance()).thenReturn(mNativeNfcManager); 127 } 128 129 @After tearDown()130 public void tearDown() { 131 mStaticMockSession.finishMocking(); 132 } 133 134 @Test testConstructor()135 public void testConstructor() { 136 mManager = new TestRoutingOptionManager(); 137 138 assertEquals(DEFAULT_ROUTE, mManager.mDefaultRoute); 139 assertEquals(DEFAULT_ISO_DEP_ROUTE, mManager.mDefaultIsoDepRoute); 140 assertEquals(DEFAULT_OFF_HOST_ROUTE, mManager.mDefaultOffHostRoute); 141 assertEquals(DEFAULT_FELICA_ROUTE, mManager.mDefaultFelicaRoute); 142 assertEquals(OFF_HOST_UICC, mManager.mOffHostRouteUicc); 143 assertEquals(OFF_HOST_ESE, mManager.mOffHostRouteEse); 144 assertEquals(AID_MATCHING_MODE, mManager.mAidMatchingSupport); 145 } 146 147 @Test testOverrideDefaultIsoDepRoute()148 public void testOverrideDefaultIsoDepRoute() { 149 mManager = new TestRoutingOptionManager(); 150 151 mManager.overrideDefaultIsoDepRoute(OVERRIDDEN_ISO_DEP_ROUTE); 152 153 assertEquals(OVERRIDDEN_ISO_DEP_ROUTE, mManager.getOverrideDefaultIsoDepRoute()); 154 verify(mNfcService).setIsoDepProtocolRoute(mRouteCaptor.capture()); 155 assertEquals(Integer.valueOf(OVERRIDDEN_ISO_DEP_ROUTE), mRouteCaptor.getValue()); 156 } 157 158 @Test testOverrideDefaultOffHostRoute()159 public void testOverrideDefaultOffHostRoute() { 160 mManager = new TestRoutingOptionManager(); 161 162 mManager.overrideDefaultOffHostRoute(OVERRIDDEN_OFF_HOST_ROUTE); 163 164 assertEquals(OVERRIDDEN_OFF_HOST_ROUTE, mManager.getOverrideDefaultOffHostRoute()); 165 verify(mNfcService).setTechnologyABFRoute(mRouteCaptor.capture(), mRouteCaptor.capture()); 166 assertEquals(Integer.valueOf(OVERRIDDEN_OFF_HOST_ROUTE), mRouteCaptor.getValue()); 167 } 168 169 @Test testOverrideDefaulttRoute()170 public void testOverrideDefaulttRoute() { 171 mManager = new TestRoutingOptionManager(); 172 173 mManager.overrideDefaultRoute(OVERRIDDEN_OFF_HOST_ROUTE); 174 175 assertEquals(OVERRIDDEN_OFF_HOST_ROUTE, mManager.getOverrideDefaultRoute()); 176 } 177 178 @Test testRecoverOverridedRoutingTable()179 public void testRecoverOverridedRoutingTable() { 180 mManager = new TestRoutingOptionManager(); 181 182 mManager.recoverOverridedRoutingTable(); 183 184 verify(mNfcService).setIsoDepProtocolRoute(anyInt()); 185 verify(mNfcService).setTechnologyABFRoute(anyInt(), anyInt()); 186 assertEquals(RoutingOptionManager.ROUTE_UNKNOWN, mManager.mOverrideDefaultRoute); 187 assertEquals(RoutingOptionManager.ROUTE_UNKNOWN, mManager.mOverrideDefaultIsoDepRoute); 188 assertEquals(RoutingOptionManager.ROUTE_UNKNOWN, mManager.mOverrideDefaultOffHostRoute); 189 } 190 191 @Test testGetters()192 public void testGetters() { 193 mManager = new TestRoutingOptionManager(); 194 195 int overrideDefaultRoute = mManager.getOverrideDefaultRoute(); 196 int defaultRoute = mManager.getDefaultRoute(); 197 int defaultIsoDepRoute = mManager.getDefaultIsoDepRoute(); 198 int defaultOffHostRoute = mManager.getDefaultOffHostRoute(); 199 int defaultFelicaRoute = mManager.getDefaultFelicaRoute(); 200 byte[] offHostRouteUicc = mManager.getOffHostRouteUicc(); 201 byte[] offHostRouteEse = mManager.getOffHostRouteEse(); 202 int aidMatchingSupport = mManager.getAidMatchingSupport(); 203 204 assertEquals(-1, overrideDefaultRoute); 205 assertEquals(DEFAULT_ROUTE, defaultRoute); 206 assertEquals(DEFAULT_ISO_DEP_ROUTE, defaultIsoDepRoute); 207 assertEquals(DEFAULT_OFF_HOST_ROUTE, defaultOffHostRoute); 208 assertEquals(DEFAULT_FELICA_ROUTE, defaultFelicaRoute); 209 assertEquals(OFF_HOST_UICC, offHostRouteUicc); 210 assertEquals(OFF_HOST_ESE, offHostRouteEse); 211 assertEquals(AID_MATCHING_MODE, aidMatchingSupport); 212 } 213 214 @Test testIsRoutingTableOverrided()215 public void testIsRoutingTableOverrided() { 216 mManager = new TestRoutingOptionManager(); 217 218 boolean result = mManager.isRoutingTableOverrided(); 219 220 assertFalse(result); 221 } 222 } 223