1 /*
2  * Copyright (C) 2019 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 <android-base/properties.h>
18 #include <radio_hidl_hal_utils_v1_5.h>
19 
20 #define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
21 
22 /*
23  * Test IRadio.setSignalStrengthReportingCriteria_1_5() with invalid hysteresisDb
24  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_invalidHysteresisDb)25 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_invalidHysteresisDb) {
26     serial = GetRandomSerialNumber();
27 
28     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
29     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSI;
30     signalThresholdInfo.hysteresisMs = 5000;
31     signalThresholdInfo.hysteresisDb = 10;  // hysteresisDb too large given threshold list deltas
32     signalThresholdInfo.thresholds = {-109, -103, -97, -89};
33     signalThresholdInfo.isEnabled = true;
34 
35     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
36             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
37     ASSERT_OK(res);
38     EXPECT_EQ(std::cv_status::no_timeout, wait());
39     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
40     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
41 
42     ALOGI("setSignalStrengthReportingCriteria_1_5_invalidHysteresisDb, rspInfo.error = %s\n",
43           toString(radioRsp_v1_5->rspInfo.error).c_str());
44     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::INVALID_ARGUMENTS}));
45 }
46 
47 /*
48  * Test IRadio.setSignalStrengthReportingCriteria_1_5() with empty thresholds
49  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_EmptyThresholds)50 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_EmptyThresholds) {
51     serial = GetRandomSerialNumber();
52 
53     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
54     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSI;
55     signalThresholdInfo.hysteresisMs = 0;
56     signalThresholdInfo.hysteresisDb = 0;
57     signalThresholdInfo.isEnabled = true;
58 
59     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
60             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
61     ASSERT_OK(res);
62     EXPECT_EQ(std::cv_status::no_timeout, wait());
63     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
64     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
65 
66     ALOGI("setSignalStrengthReportingCriteria_1_5_EmptyParams, rspInfo.error = %s\n",
67           toString(radioRsp_v1_5->rspInfo.error).c_str());
68     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
69 }
70 
71 /*
72  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for GERAN
73  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Geran)74 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Geran) {
75     serial = GetRandomSerialNumber();
76 
77     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
78     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSI;
79     signalThresholdInfo.hysteresisMs = 5000;
80     signalThresholdInfo.hysteresisDb = 2;
81     signalThresholdInfo.thresholds = {-109, -103, -97, -89};
82     signalThresholdInfo.isEnabled = true;
83 
84     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
85             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
86     ASSERT_OK(res);
87     EXPECT_EQ(std::cv_status::no_timeout, wait());
88     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
89     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
90 
91     ALOGI("setSignalStrengthReportingCriteria_1_5_Geran, rspInfo.error = %s\n",
92           toString(radioRsp_v1_5->rspInfo.error).c_str());
93     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
94 }
95 
96 /*
97  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for UTRAN
98  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Utran)99 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Utran) {
100     serial = GetRandomSerialNumber();
101 
102     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
103     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSCP;
104     signalThresholdInfo.hysteresisMs = 5000;
105     signalThresholdInfo.hysteresisDb = 2;
106     signalThresholdInfo.thresholds = {-110, -97, -73, -49, -25};
107     signalThresholdInfo.isEnabled = true;
108 
109     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
110             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::UTRAN);
111     ASSERT_OK(res);
112     EXPECT_EQ(std::cv_status::no_timeout, wait());
113     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
114     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
115 
116     ALOGI("setSignalStrengthReportingCriteria_1_5_Utran, rspInfo.error = %s\n",
117           toString(radioRsp_v1_5->rspInfo.error).c_str());
118     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
119 }
120 
121 /*
122  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for EUTRAN
123  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Eutran_RSRP)124 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Eutran_RSRP) {
125     serial = GetRandomSerialNumber();
126 
127     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
128     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSRP;
129     signalThresholdInfo.hysteresisMs = 5000;
130     signalThresholdInfo.hysteresisDb = 2;
131     signalThresholdInfo.thresholds = {-128, -108, -88, -68};
132     signalThresholdInfo.isEnabled = true;
133 
134     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
135             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN);
136     ASSERT_OK(res);
137     EXPECT_EQ(std::cv_status::no_timeout, wait());
138     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
139     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
140 
141     ALOGI("setSignalStrengthReportingCriteria_1_5_Eutran, rspInfo.error = %s\n",
142           toString(radioRsp_v1_5->rspInfo.error).c_str());
143     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
144 }
145 
146 /*
147  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for EUTRAN
148  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Eutran_RSRQ)149 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Eutran_RSRQ) {
150     serial = GetRandomSerialNumber();
151 
152     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
153     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSRQ;
154     signalThresholdInfo.hysteresisMs = 5000;
155     signalThresholdInfo.hysteresisDb = 2;
156     signalThresholdInfo.thresholds = {-27, -20, -13, -6};
157     signalThresholdInfo.isEnabled = true;
158 
159     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
160             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN);
161     ASSERT_OK(res);
162     EXPECT_EQ(std::cv_status::no_timeout, wait());
163     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
164     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
165 
166     ALOGI("setSignalStrengthReportingCriteria_1_5_Eutran, rspInfo.error = %s\n",
167           toString(radioRsp_v1_5->rspInfo.error).c_str());
168     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
169 }
170 
171 /*
172  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for EUTRAN
173  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Eutran_RSSNR)174 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Eutran_RSSNR) {
175     serial = GetRandomSerialNumber();
176 
177     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
178     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSNR;
179     signalThresholdInfo.hysteresisMs = 5000;
180     signalThresholdInfo.hysteresisDb = 2;
181     signalThresholdInfo.thresholds = {-10, 0, 10, 20};
182     signalThresholdInfo.isEnabled = true;
183 
184     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
185             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN);
186     ASSERT_OK(res);
187     EXPECT_EQ(std::cv_status::no_timeout, wait());
188     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
189     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
190 }
191 
192 /*
193  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for CDMA2000
194  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Cdma2000)195 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Cdma2000) {
196     serial = GetRandomSerialNumber();
197 
198     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
199     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSI;
200     signalThresholdInfo.hysteresisMs = 5000;
201     signalThresholdInfo.hysteresisDb = 2;
202     signalThresholdInfo.thresholds = {-105, -90, -75, -65};
203     signalThresholdInfo.isEnabled = true;
204 
205     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
206             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::CDMA2000);
207     ASSERT_OK(res);
208     EXPECT_EQ(std::cv_status::no_timeout, wait());
209     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
210     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
211 
212     ALOGI("setSignalStrengthReportingCriteria_1_5_Cdma2000, rspInfo.error = %s\n",
213           toString(radioRsp_v1_5->rspInfo.error).c_str());
214     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::NONE}));
215 }
216 
217 /*
218  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for NGRAN_SSRSRP
219  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRP)220 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRP) {
221     serial = GetRandomSerialNumber();
222 
223     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
224     signalThresholdInfo.signalMeasurement = SignalMeasurementType::SSRSRP;
225     signalThresholdInfo.hysteresisMs = 5000;
226     signalThresholdInfo.hysteresisDb = 0;
227     signalThresholdInfo.thresholds = {-105, -90, -75, -65};
228     signalThresholdInfo.isEnabled = true;
229 
230     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
231             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::NGRAN);
232     ASSERT_OK(res);
233     EXPECT_EQ(std::cv_status::no_timeout, wait());
234     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
235     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
236 
237     ALOGI("setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRP, rspInfo.error = %s\n",
238           toString(radioRsp_v1_5->rspInfo.error).c_str());
239 
240     // Allow REQUEST_NOT_SUPPORTED because some non-5G device may not support NGRAN for
241     // setSignalStrengthReportingCriteria_1_5()
242     ASSERT_TRUE(
243             CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
244                              {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
245 }
246 
247 /*
248  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for NGRAN_SSRSRQ
249  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRQ)250 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRQ) {
251     serial = GetRandomSerialNumber();
252 
253     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
254     signalThresholdInfo.signalMeasurement = SignalMeasurementType::SSRSRQ;
255     signalThresholdInfo.hysteresisMs = 5000;
256     signalThresholdInfo.hysteresisDb = 0;
257     signalThresholdInfo.thresholds = {-43, -20, 0, 20};
258     signalThresholdInfo.isEnabled = true;
259 
260     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
261             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::NGRAN);
262     ASSERT_OK(res);
263     EXPECT_EQ(std::cv_status::no_timeout, wait());
264     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
265     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
266 
267     ALOGI("setSignalStrengthReportingCriteria_1_5_NGRAN_SSRSRQ, rspInfo.error = %s\n",
268           toString(radioRsp_v1_5->rspInfo.error).c_str());
269 
270     // Allow REQUEST_NOT_SUPPORTED because some non-5G device may not support NGRAN for
271     // setSignalStrengthReportingCriteria_1_5()
272     ASSERT_TRUE(
273             CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
274                              {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
275 }
276 
277 /*
278  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for EUTRAN
279  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_Disable_RSSNR)280 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_Disable_RSSNR) {
281     serial = GetRandomSerialNumber();
282 
283     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
284     signalThresholdInfo.signalMeasurement = SignalMeasurementType::RSSNR;
285     signalThresholdInfo.hysteresisMs = 5000;
286     signalThresholdInfo.hysteresisDb = 2;
287     signalThresholdInfo.thresholds = {-10, 0, 10, 20};
288     signalThresholdInfo.isEnabled = false;
289 
290     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
291             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN);
292     ASSERT_OK(res);
293     EXPECT_EQ(std::cv_status::no_timeout, wait());
294     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
295     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
296 }
297 
298 /*
299  * Test IRadio.setSignalStrengthReportingCriteria_1_5() for NGRAN_SSSINR
300  */
TEST_P(RadioHidlTest_v1_5,setSignalStrengthReportingCriteria_1_5_NGRAN_SSSINR)301 TEST_P(RadioHidlTest_v1_5, setSignalStrengthReportingCriteria_1_5_NGRAN_SSSINR) {
302     serial = GetRandomSerialNumber();
303 
304     ::android::hardware::radio::V1_5::SignalThresholdInfo signalThresholdInfo;
305     signalThresholdInfo.signalMeasurement = SignalMeasurementType::SSSINR;
306     signalThresholdInfo.hysteresisMs = 5000;
307     signalThresholdInfo.hysteresisDb = 0;
308     signalThresholdInfo.thresholds = {-10, 3, 16, 18};
309     signalThresholdInfo.isEnabled = true;
310 
311     Return<void> res = radio_v1_5->setSignalStrengthReportingCriteria_1_5(
312             serial, signalThresholdInfo, ::android::hardware::radio::V1_5::AccessNetwork::NGRAN);
313     ASSERT_OK(res);
314     EXPECT_EQ(std::cv_status::no_timeout, wait());
315     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
316     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
317 
318     ALOGI("setSignalStrengthReportingCriteria_1_5_NGRAN_SSSINR, rspInfo.error = %s\n",
319           toString(radioRsp_v1_5->rspInfo.error).c_str());
320 
321     // Allow REQUEST_NOT_SUPPORTED because some non-5G device may not support NGRAN for
322     // setSignalStrengthReportingCriteria_1_5()
323     ASSERT_TRUE(
324             CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
325                              {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
326 }
327 
328 /*
329  * Test IRadio.setLinkCapacityReportingCriteria_1_5() invalid hysteresisDlKbps
330  */
TEST_P(RadioHidlTest_v1_5,setLinkCapacityReportingCriteria_1_5_invalidHysteresisDlKbps)331 TEST_P(RadioHidlTest_v1_5, setLinkCapacityReportingCriteria_1_5_invalidHysteresisDlKbps) {
332     serial = GetRandomSerialNumber();
333 
334     Return<void> res = radio_v1_5->setLinkCapacityReportingCriteria_1_5(
335             serial, 5000,
336             5000,  // hysteresisDlKbps too big for thresholds delta
337             100, {1000, 5000, 10000, 20000}, {500, 1000, 5000, 10000},
338             ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
339     ASSERT_OK(res);
340     EXPECT_EQ(std::cv_status::no_timeout, wait());
341     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
342     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
343 
344     ALOGI("setLinkCapacityReportingCriteria_1_5_invalidHysteresisDlKbps, rspInfo.error = %s\n",
345           toString(radioRsp_v1_5->rspInfo.error).c_str());
346     // Allow REQUEST_NOT_SUPPORTED as setLinkCapacityReportingCriteria_1_5() may not be supported
347     // for GERAN
348     ASSERT_TRUE(
349             CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
350                              {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
351 }
352 
353 /*
354  * Test IRadio.setLinkCapacityReportingCriteria_1_5() invalid hysteresisUlKbps
355  */
TEST_P(RadioHidlTest_v1_5,setLinkCapacityReportingCriteria_1_5_invalidHysteresisUlKbps)356 TEST_P(RadioHidlTest_v1_5, setLinkCapacityReportingCriteria_1_5_invalidHysteresisUlKbps) {
357     serial = GetRandomSerialNumber();
358 
359     Return<void> res = radio_v1_5->setLinkCapacityReportingCriteria_1_5(
360             serial, 5000, 500,
361             1000,  // hysteresisUlKbps too big for thresholds delta
362             {1000, 5000, 10000, 20000}, {500, 1000, 5000, 10000},
363             ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
364     ASSERT_OK(res);
365     EXPECT_EQ(std::cv_status::no_timeout, wait());
366     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
367     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
368 
369     ALOGI("setLinkCapacityReportingCriteria_1_5_invalidHysteresisUlKbps, rspInfo.error = %s\n",
370           toString(radioRsp_v1_5->rspInfo.error).c_str());
371     // Allow REQUEST_NOT_SUPPORTED as setLinkCapacityReportingCriteria_1_5() may not be supported
372     // for GERAN
373     ASSERT_TRUE(
374             CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
375                              {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
376 }
377 
378 /*
379  * Test IRadio.setLinkCapacityReportingCriteria_1_5() empty params
380  */
TEST_P(RadioHidlTest_v1_5,setLinkCapacityReportingCriteria_1_5_emptyParams)381 TEST_P(RadioHidlTest_v1_5, setLinkCapacityReportingCriteria_1_5_emptyParams) {
382     serial = GetRandomSerialNumber();
383 
384     Return<void> res = radio_v1_5->setLinkCapacityReportingCriteria_1_5(
385             serial, 0, 0, 0, {}, {}, ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
386     ASSERT_OK(res);
387     EXPECT_EQ(std::cv_status::no_timeout, wait());
388     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
389     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
390 
391     ALOGI("setLinkCapacityReportingCriteria_1_5_emptyParams, rspInfo.error = %s\n",
392           toString(radioRsp_v1_5->rspInfo.error).c_str());
393     // Allow REQUEST_NOT_SUPPORTED as setLinkCapacityReportingCriteria_1_5() may not be supported
394     // for GERAN
395     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
396                                  {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
397 }
398 
399 /*
400  * Test IRadio.setLinkCapacityReportingCriteria_1_5() for GERAN
401  */
TEST_P(RadioHidlTest_v1_5,setLinkCapacityReportingCriteria_1_5_Geran)402 TEST_P(RadioHidlTest_v1_5, setLinkCapacityReportingCriteria_1_5_Geran) {
403     serial = GetRandomSerialNumber();
404 
405     Return<void> res = radio_v1_5->setLinkCapacityReportingCriteria_1_5(
406             serial, 5000, 500, 100, {1000, 5000, 10000, 20000}, {500, 1000, 5000, 10000},
407             ::android::hardware::radio::V1_5::AccessNetwork::GERAN);
408     ASSERT_OK(res);
409     EXPECT_EQ(std::cv_status::no_timeout, wait());
410     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
411     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
412 
413     ALOGI("setLinkCapacityReportingCriteria_1_5_Geran, rspInfo.error = %s\n",
414           toString(radioRsp_v1_5->rspInfo.error).c_str());
415     // Allow REQUEST_NOT_SUPPORTED as setLinkCapacityReportingCriteria_1_5() may not be supported
416     // for GERAN
417     ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
418                                  {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
419 }
420 
421 /*
422  * Test IRadio.enableUiccApplications() for the response returned.
423  * For SIM ABSENT case.
424  */
TEST_P(RadioHidlTest_v1_5,togglingUiccApplicationsSimAbsent)425 TEST_P(RadioHidlTest_v1_5, togglingUiccApplicationsSimAbsent) {
426     // This test case only test SIM ABSENT case.
427     if (cardStatus.base.base.base.cardState != CardState::ABSENT) return;
428 
429     // Disable Uicc applications.
430     serial = GetRandomSerialNumber();
431     radio_v1_5->enableUiccApplications(serial, false);
432     EXPECT_EQ(std::cv_status::no_timeout, wait());
433     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
434     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
435     // As SIM is absent, RadioError::SIM_ABSENT should be thrown.
436     EXPECT_EQ(RadioError::SIM_ABSENT, radioRsp_v1_5->rspInfo.error);
437 
438     // Query Uicc application enablement.
439     serial = GetRandomSerialNumber();
440     radio_v1_5->areUiccApplicationsEnabled(serial);
441     EXPECT_EQ(std::cv_status::no_timeout, wait());
442     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
443     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
444     // As SIM is absent, RadioError::SIM_ABSENT should be thrown.
445     EXPECT_EQ(RadioError::SIM_ABSENT, radioRsp_v1_5->rspInfo.error);
446 }
447 
448 /*
449  * Test IRadio.enableUiccApplications() for the response returned.
450  * For SIM PRESENT case.
451  */
TEST_P(RadioHidlTest_v1_5,togglingUiccApplicationsSimPresent)452 TEST_P(RadioHidlTest_v1_5, togglingUiccApplicationsSimPresent) {
453     // This test case only test SIM ABSENT case.
454     if (cardStatus.base.base.base.cardState != CardState::PRESENT) return;
455     if (cardStatus.applications.size() == 0) return;
456 
457     // Disable Uicc applications.
458     serial = GetRandomSerialNumber();
459     radio_v1_5->enableUiccApplications(serial, false);
460     EXPECT_EQ(std::cv_status::no_timeout, wait());
461     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
462     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
463     // As SIM is present, there shouldn't be error.
464     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
465 
466     // Query Uicc application enablement.
467     serial = GetRandomSerialNumber();
468     radio_v1_5->areUiccApplicationsEnabled(serial);
469     EXPECT_EQ(std::cv_status::no_timeout, wait());
470     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
471     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
472     // As SIM is present, there shouldn't be error.
473     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
474     ASSERT_FALSE(radioRsp_v1_5->areUiccApplicationsEnabled);
475 
476     // Enable Uicc applications.
477     serial = GetRandomSerialNumber();
478     radio_v1_5->enableUiccApplications(serial, true);
479     EXPECT_EQ(std::cv_status::no_timeout, wait());
480     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
481     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
482     // As SIM is present, there shouldn't be error.
483     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
484 
485     // Query Uicc application enablement.
486     serial = GetRandomSerialNumber();
487     radio_v1_5->areUiccApplicationsEnabled(serial);
488     EXPECT_EQ(std::cv_status::no_timeout, wait());
489     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
490     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
491     // As SIM is present, there shouldn't be error.
492     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
493     ASSERT_TRUE(radioRsp_v1_5->areUiccApplicationsEnabled);
494 }
495 
496 /*
497  * Test IRadio.areUiccApplicationsEnabled() for the response returned.
498  */
TEST_P(RadioHidlTest_v1_5,areUiccApplicationsEnabled)499 TEST_P(RadioHidlTest_v1_5, areUiccApplicationsEnabled) {
500     // Disable Uicc applications.
501     serial = GetRandomSerialNumber();
502     radio_v1_5->areUiccApplicationsEnabled(serial);
503     EXPECT_EQ(std::cv_status::no_timeout, wait());
504     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
505     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
506 
507     // If SIM is absent, RadioError::SIM_ABSENT should be thrown. Otherwise there shouldn't be any
508     // error.
509     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
510         EXPECT_EQ(RadioError::SIM_ABSENT, radioRsp_v1_5->rspInfo.error);
511     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
512         EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
513     }
514 }
515 
516 /*
517  * Test IRadio.setSystemSelectionChannels_1_5() for the response returned.
518  */
TEST_P(RadioHidlTest_v1_5,setSystemSelectionChannels_1_5)519 TEST_P(RadioHidlTest_v1_5, setSystemSelectionChannels_1_5) {
520     serial = GetRandomSerialNumber();
521 
522     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
523     bandP900.geranBands() = {GeranBands::BAND_P900};
524     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
525     band850.geranBands() = {GeranBands::BAND_850};
526     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
527             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
528             .bands = bandP900,
529             .channels = {1, 2}};
530     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
531             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
532             .bands = band850,
533             .channels = {128, 129}};
534 
535     Return<void> res =
536             radio_v1_5->setSystemSelectionChannels_1_5(serial, true, {specifierP900, specifier850});
537     ASSERT_OK(res);
538     EXPECT_EQ(std::cv_status::no_timeout, wait());
539     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
540     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
541     ALOGI("setSystemSelectionChannels, rspInfo.error = %s\n",
542           toString(radioRsp_v1_5->rspInfo.error).c_str());
543     ASSERT_TRUE(CheckAnyOfErrors(
544             radioRsp_v1_5->rspInfo.error,
545             {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE, RadioError::INTERNAL_ERR}));
546 
547     if (radioRsp_v1_5->rspInfo.error == RadioError::NONE) {
548         serial = GetRandomSerialNumber();
549         Return<void> res = radio_v1_5->setSystemSelectionChannels_1_5(
550                 serial, false, {specifierP900, specifier850});
551         ASSERT_OK(res);
552         EXPECT_EQ(std::cv_status::no_timeout, wait());
553         EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
554         EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
555         ALOGI("setSystemSelectionChannels, rspInfo.error = %s\n",
556               toString(radioRsp_v1_5->rspInfo.error).c_str());
557         EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
558     }
559 }
560 
561 /*
562  * Test IRadio.startNetworkScan_1_5() for the response returned.
563  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan)564 TEST_P(RadioHidlTest_v1_5, startNetworkScan) {
565     serial = GetRandomSerialNumber();
566 
567     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
568     bandP900.geranBands() = {GeranBands::BAND_P900};
569     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
570     band850.geranBands() = {GeranBands::BAND_850};
571     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
572             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
573             .bands = bandP900,
574             .channels = {1, 2}};
575     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
576             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
577             .bands = band850,
578             .channels = {128, 129}};
579 
580     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
581             .type = ScanType::ONE_SHOT,
582             .interval = 60,
583             .specifiers = {specifierP900, specifier850},
584             .maxSearchTime = 60,
585             .incrementalResults = false,
586             .incrementalResultsPeriodicity = 1};
587 
588     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
589     ASSERT_OK(res);
590     EXPECT_EQ(std::cv_status::no_timeout, wait());
591     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
592     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
593     ALOGI("startNetworkScan, rspInfo.error = %s\n", toString(radioRsp_v1_5->rspInfo.error).c_str());
594 
595     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
596         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error, {RadioError::SIM_ABSENT}));
597     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
598         // OPERATION_NOT_ALLOWED should not be allowed; however, some vendors do
599         // not support the required manual GSM search functionality. This is
600         // tracked in b/112206766. Modems have "GSM" rat scan need to
601         // support scanning requests combined with some parameters.
602         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
603                                      {RadioError::NONE, RadioError::OPERATION_NOT_ALLOWED}));
604     }
605 
606     if (radioRsp_v1_5->rspInfo.error == RadioError::NONE) {
607         ALOGI("Stop Network Scan");
608         stopNetworkScan();
609     }
610 }
611 
612 /*
613  * Test IRadio.startNetworkScan_1_5() with invalid specifier.
614  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidArgument)615 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidArgument) {
616     serial = GetRandomSerialNumber();
617 
618     ::android::hardware::radio::V1_5::NetworkScanRequest request = {.type = ScanType::ONE_SHOT,
619                                                                     .interval = 60};
620 
621     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
622     ASSERT_OK(res);
623     EXPECT_EQ(std::cv_status::no_timeout, wait());
624     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
625     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
626     ALOGI("startNetworkScan_InvalidArgument, rspInfo.error = %s\n",
627           toString(radioRsp_v1_5->rspInfo.error).c_str());
628 
629     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
630         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
631                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
632     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
633         ASSERT_TRUE(CheckAnyOfErrors(
634                 radioRsp_v1_5->rspInfo.error,
635                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
636     }
637 }
638 
639 /*
640  * Test IRadio.startNetworkScan_1_5() with invalid interval (lower boundary).
641  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidInterval1)642 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidInterval1) {
643     serial = GetRandomSerialNumber();
644 
645     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
646     bandP900.geranBands() = {GeranBands::BAND_P900};
647     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
648     band850.geranBands() = {GeranBands::BAND_850};
649     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
650             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
651             .bands = bandP900,
652             .channels = {1, 2}};
653     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
654             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
655             .bands = band850,
656             .channels = {128, 129}};
657 
658     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
659             .type = ScanType::ONE_SHOT,
660             .interval = 4,
661             .specifiers = {specifierP900, specifier850},
662             .maxSearchTime = 60,
663             .incrementalResults = false,
664             .incrementalResultsPeriodicity = 1};
665 
666     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
667     ASSERT_OK(res);
668     EXPECT_EQ(std::cv_status::no_timeout, wait());
669     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
670     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
671     ALOGI("startNetworkScan_InvalidInterval1, rspInfo.error = %s\n",
672           toString(radioRsp_v1_5->rspInfo.error).c_str());
673     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
674         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
675                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
676     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
677         ASSERT_TRUE(CheckAnyOfErrors(
678                 radioRsp_v1_5->rspInfo.error,
679                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
680     }
681 }
682 
683 /*
684  * Test IRadio.startNetworkScan_1_5() with invalid interval (upper boundary).
685  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidInterval2)686 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidInterval2) {
687     serial = GetRandomSerialNumber();
688 
689     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
690     bandP900.geranBands() = {GeranBands::BAND_P900};
691     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
692     band850.geranBands() = {GeranBands::BAND_850};
693     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
694             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
695             .bands = bandP900,
696             .channels = {1, 2}};
697     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
698             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
699             .bands = band850,
700             .channels = {128, 129}};
701 
702     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
703             .type = ScanType::ONE_SHOT,
704             .interval = 301,
705             .specifiers = {specifierP900, specifier850},
706             .maxSearchTime = 60,
707             .incrementalResults = false,
708             .incrementalResultsPeriodicity = 1};
709 
710     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
711     ASSERT_OK(res);
712     EXPECT_EQ(std::cv_status::no_timeout, wait());
713     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
714     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
715     ALOGI("startNetworkScan_InvalidInterval2, rspInfo.error = %s\n",
716           toString(radioRsp_v1_5->rspInfo.error).c_str());
717     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
718         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
719                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
720     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
721         ASSERT_TRUE(CheckAnyOfErrors(
722                 radioRsp_v1_5->rspInfo.error,
723                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
724     }
725 }
726 
727 /*
728  * Test IRadio.startNetworkScan_1_5() with invalid max search time (lower boundary).
729  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidMaxSearchTime1)730 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidMaxSearchTime1) {
731     serial = GetRandomSerialNumber();
732 
733     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
734     bandP900.geranBands() = {GeranBands::BAND_P900};
735     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
736     band850.geranBands() = {GeranBands::BAND_850};
737     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
738             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
739             .bands = bandP900,
740             .channels = {1, 2}};
741     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
742             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
743             .bands = band850,
744             .channels = {128, 129}};
745 
746     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
747             .type = ScanType::ONE_SHOT,
748             .interval = 60,
749             .specifiers = {specifierP900, specifier850},
750             .maxSearchTime = 59,
751             .incrementalResults = false,
752             .incrementalResultsPeriodicity = 1};
753 
754     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
755     ASSERT_OK(res);
756     EXPECT_EQ(std::cv_status::no_timeout, wait());
757     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
758     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
759     ALOGI("startNetworkScan_InvalidMaxSearchTime1, rspInfo.error = %s\n",
760           toString(radioRsp_v1_5->rspInfo.error).c_str());
761     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
762         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
763                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
764     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
765         ASSERT_TRUE(CheckAnyOfErrors(
766                 radioRsp_v1_5->rspInfo.error,
767                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
768     }
769 }
770 
771 /*
772  * Test IRadio.startNetworkScan_1_5() with invalid max search time (upper boundary).
773  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidMaxSearchTime2)774 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidMaxSearchTime2) {
775     serial = GetRandomSerialNumber();
776 
777     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
778     bandP900.geranBands() = {GeranBands::BAND_P900};
779     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
780     band850.geranBands() = {GeranBands::BAND_850};
781     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
782             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
783             .bands = bandP900,
784             .channels = {1, 2}};
785     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
786             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
787             .bands = band850,
788             .channels = {128, 129}};
789 
790     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
791             .type = ScanType::ONE_SHOT,
792             .interval = 60,
793             .specifiers = {specifierP900, specifier850},
794             .maxSearchTime = 3601,
795             .incrementalResults = false,
796             .incrementalResultsPeriodicity = 1};
797 
798     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
799     ASSERT_OK(res);
800     EXPECT_EQ(std::cv_status::no_timeout, wait());
801     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
802     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
803     ALOGI("startNetworkScan_InvalidMaxSearchTime2, rspInfo.error = %s\n",
804           toString(radioRsp_v1_5->rspInfo.error).c_str());
805     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
806         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
807                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
808     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
809         ASSERT_TRUE(CheckAnyOfErrors(
810                 radioRsp_v1_5->rspInfo.error,
811                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
812     }
813 }
814 
815 /*
816  * Test IRadio.startNetworkScan_1_5() with invalid periodicity (lower boundary).
817  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidPeriodicity1)818 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidPeriodicity1) {
819     serial = GetRandomSerialNumber();
820 
821     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
822     bandP900.geranBands() = {GeranBands::BAND_P900};
823     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
824     band850.geranBands() = {GeranBands::BAND_850};
825     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
826             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
827             .bands = bandP900,
828             .channels = {1, 2}};
829     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
830             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
831             .bands = band850,
832             .channels = {128, 129}};
833 
834     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
835             .type = ScanType::ONE_SHOT,
836             .interval = 60,
837             .specifiers = {specifierP900, specifier850},
838             .maxSearchTime = 600,
839             .incrementalResults = true,
840             .incrementalResultsPeriodicity = 0};
841 
842     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
843     ASSERT_OK(res);
844     EXPECT_EQ(std::cv_status::no_timeout, wait());
845     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
846     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
847     ALOGI("startNetworkScan_InvalidPeriodicity1, rspInfo.error = %s\n",
848           toString(radioRsp_v1_5->rspInfo.error).c_str());
849     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
850         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
851                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
852     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
853         ASSERT_TRUE(CheckAnyOfErrors(
854                 radioRsp_v1_5->rspInfo.error,
855                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
856     }
857 }
858 
859 /*
860  * Test IRadio.startNetworkScan_1_5() with invalid periodicity (upper boundary).
861  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_InvalidPeriodicity2)862 TEST_P(RadioHidlTest_v1_5, startNetworkScan_InvalidPeriodicity2) {
863     serial = GetRandomSerialNumber();
864 
865     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
866     bandP900.geranBands() = {GeranBands::BAND_P900};
867     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
868     band850.geranBands() = {GeranBands::BAND_850};
869     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
870             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
871             .bands = bandP900,
872             .channels = {1, 2}};
873     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
874             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
875             .bands = band850,
876             .channels = {128, 129}};
877 
878     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
879             .type = ScanType::ONE_SHOT,
880             .interval = 60,
881             .specifiers = {specifierP900, specifier850},
882             .maxSearchTime = 600,
883             .incrementalResults = true,
884             .incrementalResultsPeriodicity = 11};
885 
886     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
887     ASSERT_OK(res);
888     EXPECT_EQ(std::cv_status::no_timeout, wait());
889     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
890     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
891     ALOGI("startNetworkScan_InvalidPeriodicity2, rspInfo.error = %s\n",
892           toString(radioRsp_v1_5->rspInfo.error).c_str());
893     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
894         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
895                                      {RadioError::SIM_ABSENT, RadioError::INVALID_ARGUMENTS}));
896     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
897         ASSERT_TRUE(CheckAnyOfErrors(
898                 radioRsp_v1_5->rspInfo.error,
899                 {RadioError::INVALID_ARGUMENTS, RadioError::REQUEST_NOT_SUPPORTED}));
900     }
901 }
902 
903 /*
904  * Test IRadio.startNetworkScan_1_5() with valid periodicity
905  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_GoodRequest1)906 TEST_P(RadioHidlTest_v1_5, startNetworkScan_GoodRequest1) {
907     serial = GetRandomSerialNumber();
908 
909     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
910     bandP900.geranBands() = {GeranBands::BAND_P900};
911     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
912     band850.geranBands() = {GeranBands::BAND_850};
913     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
914             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
915             .bands = bandP900,
916             .channels = {1, 2}};
917     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
918             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
919             .bands = band850,
920             .channels = {128, 129}};
921 
922     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
923             .type = ScanType::ONE_SHOT,
924             .interval = 60,
925             .specifiers = {specifierP900, specifier850},
926             .maxSearchTime = 360,
927             .incrementalResults = false,
928             .incrementalResultsPeriodicity = 10};
929 
930     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
931     ASSERT_OK(res);
932     EXPECT_EQ(std::cv_status::no_timeout, wait());
933     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
934     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
935     ALOGI("startNetworkScan_GoodRequest1, rspInfo.error = %s\n",
936           toString(radioRsp_v1_5->rspInfo.error).c_str());
937     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
938         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
939                                      {RadioError::NONE, RadioError::SIM_ABSENT}));
940     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
941         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
942                                      {RadioError::NONE, RadioError::INVALID_ARGUMENTS,
943                                       RadioError::REQUEST_NOT_SUPPORTED}));
944     }
945 
946     if (radioRsp_v1_5->rspInfo.error == RadioError::NONE) {
947         ALOGI("Stop Network Scan");
948         stopNetworkScan();
949     }
950 }
951 
952 /*
953  * Test IRadio.startNetworkScan_1_5() with valid periodicity and plmns
954  */
TEST_P(RadioHidlTest_v1_5,startNetworkScan_GoodRequest2)955 TEST_P(RadioHidlTest_v1_5, startNetworkScan_GoodRequest2) {
956     serial = GetRandomSerialNumber();
957 
958     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands bandP900;
959     bandP900.geranBands() = {GeranBands::BAND_P900};
960     ::android::hardware::radio::V1_5::RadioAccessSpecifier::Bands band850;
961     band850.geranBands() = {GeranBands::BAND_850};
962     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifierP900 = {
963             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
964             .bands = bandP900,
965             .channels = {1, 2}};
966     ::android::hardware::radio::V1_5::RadioAccessSpecifier specifier850 = {
967             .radioAccessNetwork = ::android::hardware::radio::V1_5::RadioAccessNetworks::GERAN,
968             .bands = band850,
969             .channels = {128, 129}};
970 
971     ::android::hardware::radio::V1_5::NetworkScanRequest request = {
972             .type = ScanType::ONE_SHOT,
973             .interval = 60,
974             .specifiers = {specifierP900, specifier850},
975             .maxSearchTime = 360,
976             .incrementalResults = false,
977             .incrementalResultsPeriodicity = 10,
978             .mccMncs = {"310410"}};
979 
980     Return<void> res = radio_v1_5->startNetworkScan_1_5(serial, request);
981     ASSERT_OK(res);
982     EXPECT_EQ(std::cv_status::no_timeout, wait());
983     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
984     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
985     ALOGI("startNetworkScan_GoodRequest2, rspInfo.error = %s\n",
986           toString(radioRsp_v1_5->rspInfo.error).c_str());
987     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
988         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
989                                      {RadioError::NONE, RadioError::SIM_ABSENT}));
990     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
991         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
992                                      {RadioError::NONE, RadioError::INVALID_ARGUMENTS,
993                                       RadioError::REQUEST_NOT_SUPPORTED}));
994     }
995 
996     if (radioRsp_v1_5->rspInfo.error == RadioError::NONE) {
997         ALOGI("Stop Network Scan");
998         stopNetworkScan();
999     }
1000 }
1001 
1002 /*
1003  * Test IRadio.setupDataCall_1_5() for the response returned.
1004  */
TEST_P(RadioHidlTest_v1_5,setupDataCall_1_5)1005 TEST_P(RadioHidlTest_v1_5, setupDataCall_1_5) {
1006     serial = GetRandomSerialNumber();
1007 
1008     ::android::hardware::radio::V1_5::AccessNetwork accessNetwork =
1009             ::android::hardware::radio::V1_5::AccessNetwork::EUTRAN;
1010 
1011     android::hardware::radio::V1_5::DataProfileInfo dataProfileInfo;
1012     memset(&dataProfileInfo, 0, sizeof(dataProfileInfo));
1013     dataProfileInfo.profileId = DataProfileId::DEFAULT;
1014     dataProfileInfo.apn = hidl_string("internet");
1015     dataProfileInfo.protocol = PdpProtocolType::IP;
1016     dataProfileInfo.roamingProtocol = PdpProtocolType::IP;
1017     dataProfileInfo.authType = ApnAuthType::NO_PAP_NO_CHAP;
1018     dataProfileInfo.user = hidl_string("username");
1019     dataProfileInfo.password = hidl_string("password");
1020     dataProfileInfo.type = DataProfileInfoType::THREE_GPP;
1021     dataProfileInfo.maxConnsTime = 300;
1022     dataProfileInfo.maxConns = 20;
1023     dataProfileInfo.waitTime = 0;
1024     dataProfileInfo.enabled = true;
1025     dataProfileInfo.supportedApnTypesBitmap = 320;
1026     dataProfileInfo.bearerBitmap = 161543;
1027     dataProfileInfo.mtuV4 = 0;
1028     dataProfileInfo.mtuV6 = 0;
1029     dataProfileInfo.preferred = true;
1030     dataProfileInfo.persistent = false;
1031 
1032     bool roamingAllowed = false;
1033 
1034     std::vector<::android::hardware::radio::V1_5::LinkAddress> addresses = {};
1035     std::vector<hidl_string> dnses = {};
1036 
1037     ::android::hardware::radio::V1_2::DataRequestReason reason =
1038             ::android::hardware::radio::V1_2::DataRequestReason::NORMAL;
1039 
1040     Return<void> res = radio_v1_5->setupDataCall_1_5(serial, accessNetwork, dataProfileInfo,
1041                                                      roamingAllowed, reason, addresses, dnses);
1042     ASSERT_OK(res);
1043 
1044     EXPECT_EQ(std::cv_status::no_timeout, wait());
1045     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1046     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1047 
1048     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
1049         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1050                                      {RadioError::SIM_ABSENT, RadioError::RADIO_NOT_AVAILABLE,
1051                                       RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW}));
1052     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
1053         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1054                                      {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
1055                                       RadioError::OP_NOT_ALLOWED_BEFORE_REG_TO_NW}));
1056     }
1057 }
1058 
1059 /*
1060  * Test IRadio.setInitialAttachApn_1_5() for the response returned.
1061  */
TEST_P(RadioHidlTest_v1_5,setInitialAttachApn_1_5)1062 TEST_P(RadioHidlTest_v1_5, setInitialAttachApn_1_5) {
1063     serial = GetRandomSerialNumber();
1064 
1065     // Create a dataProfileInfo
1066     android::hardware::radio::V1_5::DataProfileInfo dataProfileInfo;
1067     memset(&dataProfileInfo, 0, sizeof(dataProfileInfo));
1068     dataProfileInfo.profileId = DataProfileId::DEFAULT;
1069     dataProfileInfo.apn = hidl_string("internet");
1070     dataProfileInfo.protocol = PdpProtocolType::IPV4V6;
1071     dataProfileInfo.roamingProtocol = PdpProtocolType::IPV4V6;
1072     dataProfileInfo.authType = ApnAuthType::NO_PAP_NO_CHAP;
1073     dataProfileInfo.user = hidl_string("username");
1074     dataProfileInfo.password = hidl_string("password");
1075     dataProfileInfo.type = DataProfileInfoType::THREE_GPP;
1076     dataProfileInfo.maxConnsTime = 300;
1077     dataProfileInfo.maxConns = 20;
1078     dataProfileInfo.waitTime = 0;
1079     dataProfileInfo.enabled = true;
1080     dataProfileInfo.supportedApnTypesBitmap = 320;
1081     dataProfileInfo.bearerBitmap = 161543;
1082     dataProfileInfo.mtuV4 = 0;
1083     dataProfileInfo.mtuV6 = 0;
1084     dataProfileInfo.preferred = true;
1085     dataProfileInfo.persistent = false;
1086 
1087     radio_v1_5->setInitialAttachApn_1_5(serial, dataProfileInfo);
1088 
1089     EXPECT_EQ(std::cv_status::no_timeout, wait());
1090     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1091     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1092 
1093     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
1094         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1095                                      {RadioError::SIM_ABSENT, RadioError::RADIO_NOT_AVAILABLE}));
1096     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
1097         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1098                                      {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE}));
1099     }
1100 }
1101 
1102 /*
1103  * Test IRadio.setDataProfile_1_5() for the response returned.
1104  */
TEST_P(RadioHidlTest_v1_5,setDataProfile_1_5)1105 TEST_P(RadioHidlTest_v1_5, setDataProfile_1_5) {
1106     serial = GetRandomSerialNumber();
1107 
1108     // Create a dataProfileInfo
1109     android::hardware::radio::V1_5::DataProfileInfo dataProfileInfo;
1110     memset(&dataProfileInfo, 0, sizeof(dataProfileInfo));
1111     dataProfileInfo.profileId = DataProfileId::DEFAULT;
1112     dataProfileInfo.apn = hidl_string("internet");
1113     dataProfileInfo.protocol = PdpProtocolType::IPV4V6;
1114     dataProfileInfo.roamingProtocol = PdpProtocolType::IPV4V6;
1115     dataProfileInfo.authType = ApnAuthType::NO_PAP_NO_CHAP;
1116     dataProfileInfo.user = hidl_string("username");
1117     dataProfileInfo.password = hidl_string("password");
1118     dataProfileInfo.type = DataProfileInfoType::THREE_GPP;
1119     dataProfileInfo.maxConnsTime = 300;
1120     dataProfileInfo.maxConns = 20;
1121     dataProfileInfo.waitTime = 0;
1122     dataProfileInfo.enabled = true;
1123     dataProfileInfo.supportedApnTypesBitmap = 320;
1124     dataProfileInfo.bearerBitmap = 161543;
1125     dataProfileInfo.mtuV4 = 0;
1126     dataProfileInfo.mtuV6 = 0;
1127     dataProfileInfo.preferred = true;
1128     dataProfileInfo.persistent = true;
1129 
1130     // Create a dataProfileInfoList
1131     android::hardware::hidl_vec<android::hardware::radio::V1_5::DataProfileInfo>
1132             dataProfileInfoList = {dataProfileInfo};
1133 
1134     radio_v1_5->setDataProfile_1_5(serial, dataProfileInfoList);
1135 
1136     EXPECT_EQ(std::cv_status::no_timeout, wait());
1137     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1138     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1139 
1140     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
1141         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1142                                      {RadioError::SIM_ABSENT, RadioError::RADIO_NOT_AVAILABLE}));
1143     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
1144         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1145                                      {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE}));
1146     }
1147 }
1148 
1149 /*
1150  * Test IRadio.setRadioPower_1_5() for the response returned.
1151  */
TEST_P(RadioHidlTest_v1_5,setRadioPower_1_5_emergencyCall_cancelled)1152 TEST_P(RadioHidlTest_v1_5, setRadioPower_1_5_emergencyCall_cancelled) {
1153     // Set radio power to off.
1154     serial = GetRandomSerialNumber();
1155     radio_v1_5->setRadioPower_1_5(serial, false, false, false);
1156     EXPECT_EQ(std::cv_status::no_timeout, wait());
1157     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1158     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1159     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
1160 
1161     // Set radio power to on with forEmergencyCall being true. This should put modem to only scan
1162     // emergency call bands.
1163     serial = GetRandomSerialNumber();
1164     radio_v1_5->setRadioPower_1_5(serial, true, true, true);
1165     EXPECT_EQ(std::cv_status::no_timeout, wait());
1166     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1167     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1168     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
1169 
1170     // Set radio power to on with forEmergencyCall being false. This should put modem in regular
1171     // operation modem.
1172     serial = GetRandomSerialNumber();
1173     radio_v1_5->setRadioPower_1_5(serial, true, false, false);
1174     EXPECT_EQ(std::cv_status::no_timeout, wait());
1175     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1176     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1177     EXPECT_EQ(RadioError::NONE, radioRsp_v1_5->rspInfo.error);
1178 }
1179 
1180 /*
1181  * Test IRadio.setNetworkSelectionModeManual_1_5() for the response returned.
1182  */
TEST_P(RadioHidlTest_v1_5,setNetworkSelectionModeManual_1_5)1183 TEST_P(RadioHidlTest_v1_5, setNetworkSelectionModeManual_1_5) {
1184     serial = GetRandomSerialNumber();
1185 
1186     // can't camp on nonexistent MCCMNC, so we expect this to fail.
1187     Return<void> res = radio_v1_5->setNetworkSelectionModeManual_1_5(
1188             serial, "123456", android::hardware::radio::V1_5::RadioAccessNetworks::GERAN);
1189     EXPECT_EQ(std::cv_status::no_timeout, wait());
1190     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1191     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1192 
1193     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
1194         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1195                                      {RadioError::NONE, RadioError::ILLEGAL_SIM_OR_ME,
1196                                       RadioError::INVALID_ARGUMENTS, RadioError::INVALID_STATE},
1197                                      CHECK_GENERAL_ERROR));
1198     } else if (cardStatus.base.base.base.cardState == CardState::PRESENT) {
1199         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1200                                      {RadioError::NONE, RadioError::RADIO_NOT_AVAILABLE,
1201                                       RadioError::INVALID_ARGUMENTS, RadioError::INVALID_STATE},
1202                                      CHECK_GENERAL_ERROR));
1203     }
1204 }
1205 
1206 /*
1207  * Test IRadio.sendCdmaSmsExpectMore() for the response returned.
1208  */
TEST_P(RadioHidlTest_v1_5,sendCdmaSmsExpectMore)1209 TEST_P(RadioHidlTest_v1_5, sendCdmaSmsExpectMore) {
1210     serial = GetRandomSerialNumber();
1211 
1212     // Create a CdmaSmsAddress
1213     CdmaSmsAddress cdmaSmsAddress;
1214     cdmaSmsAddress.digitMode = CdmaSmsDigitMode::FOUR_BIT;
1215     cdmaSmsAddress.numberMode = CdmaSmsNumberMode::NOT_DATA_NETWORK;
1216     cdmaSmsAddress.numberType = CdmaSmsNumberType::UNKNOWN;
1217     cdmaSmsAddress.numberPlan = CdmaSmsNumberPlan::UNKNOWN;
1218     cdmaSmsAddress.digits = (std::vector<uint8_t>){11, 1, 6, 5, 10, 7, 7, 2, 10, 3, 10, 3};
1219 
1220     // Create a CdmaSmsSubAddress
1221     CdmaSmsSubaddress cdmaSmsSubaddress;
1222     cdmaSmsSubaddress.subaddressType = CdmaSmsSubaddressType::NSAP;
1223     cdmaSmsSubaddress.odd = false;
1224     cdmaSmsSubaddress.digits = (std::vector<uint8_t>){};
1225 
1226     // Create a CdmaSmsMessage
1227     android::hardware::radio::V1_0::CdmaSmsMessage cdmaSmsMessage;
1228     cdmaSmsMessage.teleserviceId = 4098;
1229     cdmaSmsMessage.isServicePresent = false;
1230     cdmaSmsMessage.serviceCategory = 0;
1231     cdmaSmsMessage.address = cdmaSmsAddress;
1232     cdmaSmsMessage.subAddress = cdmaSmsSubaddress;
1233     cdmaSmsMessage.bearerData =
1234             (std::vector<uint8_t>){15, 0, 3, 32, 3, 16, 1, 8, 16, 53, 76, 68, 6, 51, 106, 0};
1235 
1236     radio_v1_5->sendCdmaSmsExpectMore(serial, cdmaSmsMessage);
1237 
1238     EXPECT_EQ(std::cv_status::no_timeout, wait());
1239     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1240     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1241 
1242     if (cardStatus.base.base.base.cardState == CardState::ABSENT) {
1243         ASSERT_TRUE(CheckAnyOfErrors(
1244                 radioRsp_v1_5->rspInfo.error,
1245                 {RadioError::INVALID_ARGUMENTS, RadioError::INVALID_STATE, RadioError::SIM_ABSENT},
1246                 CHECK_GENERAL_ERROR));
1247     }
1248 }
1249 
1250 /*
1251  * Test IRadio.getBarringInfo() for the response returned.
1252  */
TEST_P(RadioHidlTest_v1_5,getBarringInfo)1253 TEST_P(RadioHidlTest_v1_5, getBarringInfo) {
1254     // If the previous setRadioPower_1_5_emergencyCall_cancelled test has just finished.
1255     // Due to radio restarting, modem may need a little more time to acquire network service
1256     // and barring infos. If voice status is in-service, waiting 3s to get barring infos ready.
1257     // Or waiting 10s if voice status is not in-service.
1258     serial = GetRandomSerialNumber();
1259     radio_v1_5->getVoiceRegistrationState_1_5(serial);
1260     EXPECT_EQ(std::cv_status::no_timeout, wait());
1261     if (isVoiceInService(radioRsp_v1_5->voiceRegResp.regState)) {
1262         sleep(BARRING_INFO_MAX_WAIT_TIME_SECONDS);
1263     } else {
1264         sleep(VOICE_SERVICE_MAX_WAIT_TIME_SECONDS);
1265     }
1266 
1267     serial = GetRandomSerialNumber();
1268     Return<void> res = radio_v1_5->getBarringInfo(serial);
1269     EXPECT_EQ(std::cv_status::no_timeout, wait());
1270     EXPECT_EQ(RadioResponseType::SOLICITED, radioRsp_v1_5->rspInfo.type);
1271     EXPECT_EQ(serial, radioRsp_v1_5->rspInfo.serial);
1272 
1273     int32_t firstApiLevel = android::base::GetIntProperty<int32_t>("ro.product.first_api_level", 0);
1274     // Allow devices shipping with Radio::1_5 and Android 11 to not support barring info.
1275     if (firstApiLevel > 0 && firstApiLevel <= 30) {
1276         ASSERT_TRUE(CheckAnyOfErrors(radioRsp_v1_5->rspInfo.error,
1277                                      {RadioError::NONE, RadioError::REQUEST_NOT_SUPPORTED}));
1278         // Early exit for devices that don't support barring info.
1279         if (radioRsp_v1_5->rspInfo.error != RadioError::NONE) {
1280             return;
1281         }
1282     }
1283 
1284     ASSERT_TRUE(radioRsp_v1_5->barringInfos.size() > 0);
1285 
1286     std::set<BarringInfo::ServiceType> reportedServices;
1287 
1288     // validate that the service types are in range
1289     for (const auto& info : radioRsp_v1_5->barringInfos) {
1290         ASSERT_TRUE((info.serviceType >= BarringInfo::ServiceType::CS_SERVICE &&
1291                      info.serviceType <= BarringInfo::ServiceType::SMS) ||
1292                     (info.serviceType >= BarringInfo::ServiceType::OPERATOR_1 &&
1293                      info.serviceType <= BarringInfo::ServiceType::OPERATOR_32));
1294         reportedServices.insert(info.serviceType);
1295 
1296         // Any type that is "conditional" must have valid values for conditional barring
1297         // factor and time.
1298         switch (info.barringType) {
1299             case BarringInfo::BarringType::NONE:  // fall through
1300             case BarringInfo::BarringType::UNCONDITIONAL:
1301                 break;
1302             case BarringInfo::BarringType::CONDITIONAL: {
1303                 const int32_t barringFactor = info.barringTypeSpecificInfo.conditional().factor;
1304                 ASSERT_TRUE(barringFactor >= 0 && barringFactor <= 100);
1305                 ASSERT_TRUE(info.barringTypeSpecificInfo.conditional().timeSeconds > 0);
1306                 break;
1307             }
1308             default:
1309                 FAIL();
1310         }
1311     }
1312 
1313     // Certain types of barring are relevant for certain RANs. Ensure that only the right
1314     // types are reported. Note that no types are required, simply that for a given technology
1315     // only certain types are valid. This is one way to check that implementations are
1316     // not providing information that they don't have.
1317     static const std::set<BarringInfo::ServiceType> UTRA_SERVICES{
1318             BarringInfo::ServiceType::CS_SERVICE, BarringInfo::ServiceType::PS_SERVICE,
1319             BarringInfo::ServiceType::CS_VOICE,   BarringInfo::ServiceType::EMERGENCY,
1320             BarringInfo::ServiceType::SMS,
1321     };
1322 
1323     static const std::set<BarringInfo::ServiceType> EUTRA_SERVICES{
1324             BarringInfo::ServiceType::MO_SIGNALLING, BarringInfo::ServiceType::MO_DATA,
1325             BarringInfo::ServiceType::CS_FALLBACK,   BarringInfo::ServiceType::MMTEL_VOICE,
1326             BarringInfo::ServiceType::MMTEL_VIDEO,   BarringInfo::ServiceType::EMERGENCY,
1327             BarringInfo::ServiceType::SMS,
1328     };
1329 
1330     static const std::set<BarringInfo::ServiceType> NGRA_SERVICES = {
1331             BarringInfo::ServiceType::MO_SIGNALLING, BarringInfo::ServiceType::MO_DATA,
1332             BarringInfo::ServiceType::CS_FALLBACK,   BarringInfo::ServiceType::MMTEL_VOICE,
1333             BarringInfo::ServiceType::MMTEL_VIDEO,   BarringInfo::ServiceType::EMERGENCY,
1334             BarringInfo::ServiceType::SMS,           BarringInfo::ServiceType::OPERATOR_1,
1335             BarringInfo::ServiceType::OPERATOR_2,    BarringInfo::ServiceType::OPERATOR_3,
1336             BarringInfo::ServiceType::OPERATOR_4,    BarringInfo::ServiceType::OPERATOR_5,
1337             BarringInfo::ServiceType::OPERATOR_6,    BarringInfo::ServiceType::OPERATOR_7,
1338             BarringInfo::ServiceType::OPERATOR_8,    BarringInfo::ServiceType::OPERATOR_9,
1339             BarringInfo::ServiceType::OPERATOR_10,   BarringInfo::ServiceType::OPERATOR_11,
1340             BarringInfo::ServiceType::OPERATOR_12,   BarringInfo::ServiceType::OPERATOR_13,
1341             BarringInfo::ServiceType::OPERATOR_14,   BarringInfo::ServiceType::OPERATOR_15,
1342             BarringInfo::ServiceType::OPERATOR_16,   BarringInfo::ServiceType::OPERATOR_17,
1343             BarringInfo::ServiceType::OPERATOR_18,   BarringInfo::ServiceType::OPERATOR_19,
1344             BarringInfo::ServiceType::OPERATOR_20,   BarringInfo::ServiceType::OPERATOR_21,
1345             BarringInfo::ServiceType::OPERATOR_22,   BarringInfo::ServiceType::OPERATOR_23,
1346             BarringInfo::ServiceType::OPERATOR_24,   BarringInfo::ServiceType::OPERATOR_25,
1347             BarringInfo::ServiceType::OPERATOR_26,   BarringInfo::ServiceType::OPERATOR_27,
1348             BarringInfo::ServiceType::OPERATOR_28,   BarringInfo::ServiceType::OPERATOR_29,
1349             BarringInfo::ServiceType::OPERATOR_30,   BarringInfo::ServiceType::OPERATOR_31,
1350     };
1351 
1352     const std::set<BarringInfo::ServiceType>* compareTo = nullptr;
1353 
1354     switch (radioRsp_v1_5->barringCellIdentity.getDiscriminator()) {
1355         case android::hardware::radio::V1_5::CellIdentity::hidl_discriminator::wcdma:
1356             // fall through
1357         case android::hardware::radio::V1_5::CellIdentity::hidl_discriminator::tdscdma:
1358             compareTo = &UTRA_SERVICES;
1359             break;
1360         case android::hardware::radio::V1_5::CellIdentity::hidl_discriminator::lte:
1361             compareTo = &EUTRA_SERVICES;
1362             break;
1363         case android::hardware::radio::V1_5::CellIdentity::hidl_discriminator::nr:
1364             compareTo = &NGRA_SERVICES;
1365             break;
1366 
1367         case android::hardware::radio::V1_5::CellIdentity::hidl_discriminator::cdma:
1368             // fall through
1369         default:
1370             FAIL();
1371             break;
1372     }
1373 
1374     std::set<BarringInfo::ServiceType> diff;
1375 
1376     std::set_difference(reportedServices.begin(), reportedServices.end(), compareTo->begin(),
1377                         compareTo->end(), std::inserter(diff, diff.begin()));
1378 }
1379