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