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