• 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 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