• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 #include <radio_hidl_hal_utils_v1_0.h>
18 
19 /*
20  * Test IRadio.getIccCardStatus() for the response returned.
21  */
TEST_F(RadioHidlTest,getIccCardStatus)22 TEST_F(RadioHidlTest, getIccCardStatus) {
23     EXPECT_LE(cardStatus.applications.size(), (unsigned int)RadioConst::CARD_MAX_APPS);
24     EXPECT_LT(cardStatus.gsmUmtsSubscriptionAppIndex, (int)RadioConst::CARD_MAX_APPS);
25     EXPECT_LT(cardStatus.cdmaSubscriptionAppIndex, (int)RadioConst::CARD_MAX_APPS);
26     EXPECT_LT(cardStatus.imsSubscriptionAppIndex, (int)RadioConst::CARD_MAX_APPS);
27 }
28 
29 /*
30  * Test IRadio.supplyIccPinForApp() for the response returned
31  */
TEST_F(RadioHidlTest,supplyIccPinForApp)32 TEST_F(RadioHidlTest, supplyIccPinForApp) {
33     serial = GetRandomSerialNumber();
34 
35     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
36     // 3GPP2 apps only
37     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
38         if (cardStatus.applications[i].appType == AppType::SIM ||
39             cardStatus.applications[i].appType == AppType::USIM ||
40             cardStatus.applications[i].appType == AppType::RUIM ||
41             cardStatus.applications[i].appType == AppType::CSIM) {
42             radio->supplyIccPinForApp(serial, hidl_string("test1"),
43                                       cardStatus.applications[i].aidPtr);
44             EXPECT_EQ(std::cv_status::no_timeout, wait());
45             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
46             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
47             EXPECT_EQ(RadioError::PASSWORD_INCORRECT, radioRsp->rspInfo.error);
48         }
49     }
50 }
51 
52 /*
53  * Test IRadio.supplyIccPukForApp() for the response returned.
54  */
TEST_F(RadioHidlTest,supplyIccPukForApp)55 TEST_F(RadioHidlTest, supplyIccPukForApp) {
56     serial = GetRandomSerialNumber();
57 
58     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
59     // 3GPP2 apps only
60     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
61         if (cardStatus.applications[i].appType == AppType::SIM ||
62             cardStatus.applications[i].appType == AppType::USIM ||
63             cardStatus.applications[i].appType == AppType::RUIM ||
64             cardStatus.applications[i].appType == AppType::CSIM) {
65             radio->supplyIccPukForApp(serial, hidl_string("test1"), hidl_string("test2"),
66                                       cardStatus.applications[i].aidPtr);
67             EXPECT_EQ(std::cv_status::no_timeout, wait());
68             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
69             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
70             EXPECT_EQ(RadioError::PASSWORD_INCORRECT, radioRsp->rspInfo.error);
71         }
72     }
73 }
74 
75 /*
76  * Test IRadio.supplyIccPin2ForApp() for the response returned.
77  */
TEST_F(RadioHidlTest,supplyIccPin2ForApp)78 TEST_F(RadioHidlTest, supplyIccPin2ForApp) {
79     serial = GetRandomSerialNumber();
80 
81     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
82     // 3GPP2 apps only
83     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
84         if (cardStatus.applications[i].appType == AppType::SIM ||
85             cardStatus.applications[i].appType == AppType::USIM ||
86             cardStatus.applications[i].appType == AppType::RUIM ||
87             cardStatus.applications[i].appType == AppType::CSIM) {
88             radio->supplyIccPin2ForApp(serial, hidl_string("test1"),
89                                        cardStatus.applications[i].aidPtr);
90             EXPECT_EQ(std::cv_status::no_timeout, wait());
91             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
92             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
93             EXPECT_EQ(RadioError::PASSWORD_INCORRECT, radioRsp->rspInfo.error);
94         }
95     }
96 }
97 
98 /*
99  * Test IRadio.supplyIccPuk2ForApp() for the response returned.
100  */
TEST_F(RadioHidlTest,supplyIccPuk2ForApp)101 TEST_F(RadioHidlTest, supplyIccPuk2ForApp) {
102     serial = GetRandomSerialNumber();
103 
104     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
105     // 3GPP2 apps only
106     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
107         if (cardStatus.applications[i].appType == AppType::SIM ||
108             cardStatus.applications[i].appType == AppType::USIM ||
109             cardStatus.applications[i].appType == AppType::RUIM ||
110             cardStatus.applications[i].appType == AppType::CSIM) {
111             radio->supplyIccPuk2ForApp(serial, hidl_string("test1"), hidl_string("test2"),
112                                        cardStatus.applications[i].aidPtr);
113             EXPECT_EQ(std::cv_status::no_timeout, wait());
114             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
115             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
116             EXPECT_EQ(RadioError::PASSWORD_INCORRECT, radioRsp->rspInfo.error);
117         }
118     }
119 }
120 
121 /*
122  * Test IRadio.changeIccPinForApp() for the response returned.
123  */
TEST_F(RadioHidlTest,changeIccPinForApp)124 TEST_F(RadioHidlTest, changeIccPinForApp) {
125     serial = GetRandomSerialNumber();
126 
127     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
128     // 3GPP2 apps only
129     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
130         if (cardStatus.applications[i].appType == AppType::SIM ||
131             cardStatus.applications[i].appType == AppType::USIM ||
132             cardStatus.applications[i].appType == AppType::RUIM ||
133             cardStatus.applications[i].appType == AppType::CSIM) {
134             radio->changeIccPinForApp(serial, hidl_string("test1"), hidl_string("test2"),
135                                       cardStatus.applications[i].aidPtr);
136             EXPECT_EQ(std::cv_status::no_timeout, wait());
137             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
138             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
139             ASSERT_TRUE(CheckAnyOfErrors(
140                 radioRsp->rspInfo.error,
141                 {RadioError::PASSWORD_INCORRECT, RadioError::REQUEST_NOT_SUPPORTED}));
142         }
143     }
144 }
145 
146 /*
147  * Test IRadio.changeIccPin2ForApp() for the response returned.
148  */
TEST_F(RadioHidlTest,changeIccPin2ForApp)149 TEST_F(RadioHidlTest, changeIccPin2ForApp) {
150     serial = GetRandomSerialNumber();
151 
152     // Pass wrong password and check PASSWORD_INCORRECT returned for 3GPP and
153     // 3GPP2 apps only
154     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
155         if (cardStatus.applications[i].appType == AppType::SIM ||
156             cardStatus.applications[i].appType == AppType::USIM ||
157             cardStatus.applications[i].appType == AppType::RUIM ||
158             cardStatus.applications[i].appType == AppType::CSIM) {
159             radio->changeIccPin2ForApp(serial, hidl_string("test1"), hidl_string("test2"),
160                                        cardStatus.applications[i].aidPtr);
161             EXPECT_EQ(std::cv_status::no_timeout, wait());
162             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
163             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
164             ASSERT_TRUE(CheckAnyOfErrors(
165                 radioRsp->rspInfo.error,
166                 {RadioError::PASSWORD_INCORRECT, RadioError::REQUEST_NOT_SUPPORTED}));
167         }
168     }
169 }
170 
171 /*
172  * Test IRadio.getImsiForApp() for the response returned.
173  */
TEST_F(RadioHidlTest,getImsiForApp)174 TEST_F(RadioHidlTest, getImsiForApp) {
175     serial = GetRandomSerialNumber();
176 
177     // Check success returned while getting imsi for 3GPP and 3GPP2 apps only
178     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
179         if (cardStatus.applications[i].appType == AppType::SIM ||
180             cardStatus.applications[i].appType == AppType::USIM ||
181             cardStatus.applications[i].appType == AppType::RUIM ||
182             cardStatus.applications[i].appType == AppType::CSIM) {
183             radio->getImsiForApp(serial, cardStatus.applications[i].aidPtr);
184             EXPECT_EQ(std::cv_status::no_timeout, wait());
185             EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
186             EXPECT_EQ(serial, radioRsp->rspInfo.serial);
187             EXPECT_EQ(RadioError::NONE, radioRsp->rspInfo.error);
188 
189             // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more than 15
190             if (radioRsp->rspInfo.error == RadioError::NONE) {
191                 EXPECT_NE(radioRsp->imsi, hidl_string());
192                 EXPECT_GE((int)(radioRsp->imsi).size(), 6);
193                 EXPECT_LE((int)(radioRsp->imsi).size(), 15);
194             }
195         }
196     }
197 }
198 
199 /*
200  * Test IRadio.iccIOForApp() for the response returned.
201  */
TEST_F(RadioHidlTest,iccIOForApp)202 TEST_F(RadioHidlTest, iccIOForApp) {
203     serial = GetRandomSerialNumber();
204 
205     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
206         IccIo iccIo;
207         iccIo.command = 0xc0;
208         iccIo.fileId = 0x6f11;
209         iccIo.path = hidl_string("3F007FFF");
210         iccIo.p1 = 0;
211         iccIo.p2 = 0;
212         iccIo.p3 = 0;
213         iccIo.data = hidl_string();
214         iccIo.pin2 = hidl_string();
215         iccIo.aid = cardStatus.applications[i].aidPtr;
216 
217         radio->iccIOForApp(serial, iccIo);
218         EXPECT_EQ(std::cv_status::no_timeout, wait());
219         EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
220         EXPECT_EQ(serial, radioRsp->rspInfo.serial);
221     }
222 }
223 
224 /*
225  * Test IRadio.iccTransmitApduBasicChannel() for the response returned.
226  */
TEST_F(RadioHidlTest,iccTransmitApduBasicChannel)227 TEST_F(RadioHidlTest, iccTransmitApduBasicChannel) {
228     serial = GetRandomSerialNumber();
229     SimApdu msg;
230     memset(&msg, 0, sizeof(msg));
231     msg.data = hidl_string();
232 
233     radio->iccTransmitApduBasicChannel(serial, msg);
234     EXPECT_EQ(std::cv_status::no_timeout, wait());
235     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
236     EXPECT_EQ(serial, radioRsp->rspInfo.serial);
237 
238     // TODO(sanketpadawe): Add test for error code
239 }
240 
241 /*
242  * Test IRadio.iccOpenLogicalChannel() for the response returned.
243  */
TEST_F(RadioHidlTest,iccOpenLogicalChannel)244 TEST_F(RadioHidlTest, iccOpenLogicalChannel) {
245     serial = GetRandomSerialNumber();
246     int p2 = 0x04;
247     // Specified in ISO 7816-4 clause 7.1.1 0x04 means that FCP template is requested.
248     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
249         radio->iccOpenLogicalChannel(serial, cardStatus.applications[i].aidPtr, p2);
250         EXPECT_EQ(std::cv_status::no_timeout, wait());
251         EXPECT_EQ(serial, radioRsp->rspInfo.serial);
252         EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
253     }
254 }
255 
256 /*
257  * Test IRadio.iccCloseLogicalChannel() for the response returned.
258  */
TEST_F(RadioHidlTest,iccCloseLogicalChannel)259 TEST_F(RadioHidlTest, iccCloseLogicalChannel) {
260     serial = GetRandomSerialNumber();
261     // Try closing invalid channel and check INVALID_ARGUMENTS returned as error
262     radio->iccCloseLogicalChannel(serial, 0);
263     EXPECT_EQ(std::cv_status::no_timeout, wait());
264     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
265     EXPECT_EQ(serial, radioRsp->rspInfo.serial);
266 
267     EXPECT_EQ(RadioError::INVALID_ARGUMENTS, radioRsp->rspInfo.error);
268 }
269 
270 /*
271  * Test IRadio.iccTransmitApduLogicalChannel() for the response returned.
272  */
TEST_F(RadioHidlTest,iccTransmitApduLogicalChannel)273 TEST_F(RadioHidlTest, iccTransmitApduLogicalChannel) {
274     serial = GetRandomSerialNumber();
275     SimApdu msg;
276     memset(&msg, 0, sizeof(msg));
277     msg.data = hidl_string();
278 
279     radio->iccTransmitApduLogicalChannel(serial, msg);
280     EXPECT_EQ(std::cv_status::no_timeout, wait());
281     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
282     EXPECT_EQ(serial, radioRsp->rspInfo.serial);
283 
284     // TODO(sanketpadawe): Add test for error code
285 }
286 
287 /*
288  * Test IRadio.requestIccSimAuthentication() for the response returned.
289  */
TEST_F(RadioHidlTest,requestIccSimAuthentication)290 TEST_F(RadioHidlTest, requestIccSimAuthentication) {
291     serial = GetRandomSerialNumber();
292 
293     // Pass wrong challenge string and check RadioError::INVALID_ARGUMENTS
294     // or REQUEST_NOT_SUPPORTED returned as error.
295     for (int i = 0; i < (int)cardStatus.applications.size(); i++) {
296         radio->requestIccSimAuthentication(serial, 0, hidl_string("test"),
297                                            cardStatus.applications[i].aidPtr);
298         EXPECT_EQ(std::cv_status::no_timeout, wait());
299         EXPECT_EQ(serial, radioRsp->rspInfo.serial);
300         EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
301         ASSERT_TRUE(CheckAnyOfErrors(radioRsp->rspInfo.error, {RadioError::INVALID_ARGUMENTS,
302                                                                RadioError::REQUEST_NOT_SUPPORTED}));
303     }
304 }
305 
306 /*
307  * Test IRadio.supplyNetworkDepersonalization() for the response returned.
308  */
TEST_F(RadioHidlTest,supplyNetworkDepersonalization)309 TEST_F(RadioHidlTest, supplyNetworkDepersonalization) {
310     serial = GetRandomSerialNumber();
311 
312     radio->supplyNetworkDepersonalization(serial, hidl_string("test"));
313     EXPECT_EQ(std::cv_status::no_timeout, wait());
314     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp->rspInfo.type);
315     EXPECT_EQ(serial, radioRsp->rspInfo.serial);
316 
317     if (cardStatus.cardState == CardState::ABSENT) {
318         ASSERT_TRUE(CheckAnyOfErrors(
319             radioRsp->rspInfo.error,
320             {RadioError::NONE, RadioError::INVALID_ARGUMENTS, RadioError::INTERNAL_ERR,
321              RadioError::INVALID_SIM_STATE, RadioError::MODEM_ERR, RadioError::NO_MEMORY,
322              RadioError::PASSWORD_INCORRECT, RadioError::SIM_ABSENT, RadioError::SYSTEM_ERR}));
323     }
324 }
325