1 /*
2 * Copyright (C) 2016 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/logging.h>
18
19 #include <android/hardware/wifi/1.0/IWifi.h>
20 #include <android/hardware/wifi/1.0/IWifiChip.h>
21 #include <android/hardware/wifi/1.3/IWifiChip.h>
22 #include <gtest/gtest.h>
23 #include <hidl/GtestPrinter.h>
24 #include <hidl/ServiceManagement.h>
25
26 #include "wifi_hidl_call_util.h"
27 #include "wifi_hidl_test_utils.h"
28
29 using ::android::sp;
30 using ::android::hardware::hidl_string;
31 using ::android::hardware::hidl_vec;
32 using ::android::hardware::wifi::V1_0::ChipId;
33 using ::android::hardware::wifi::V1_0::ChipModeId;
34 using ::android::hardware::wifi::V1_0::IfaceType;
35 using ::android::hardware::wifi::V1_0::IWifi;
36 using ::android::hardware::wifi::V1_0::IWifiChip;
37 using ::android::hardware::wifi::V1_0::IWifiIface;
38 using ::android::hardware::wifi::V1_0::IWifiP2pIface;
39 using ::android::hardware::wifi::V1_0::IWifiRttController;
40 using ::android::hardware::wifi::V1_0::IWifiStaIface;
41 using ::android::hardware::wifi::V1_0::WifiDebugHostWakeReasonStats;
42 using ::android::hardware::wifi::V1_0::WifiDebugRingBufferStatus;
43 using ::android::hardware::wifi::V1_0::WifiDebugRingBufferVerboseLevel;
44 using ::android::hardware::wifi::V1_0::WifiStatus;
45 using ::android::hardware::wifi::V1_0::WifiStatusCode;
46
47 namespace {
48 constexpr WifiDebugRingBufferVerboseLevel kDebugRingBufferVerboseLvl =
49 WifiDebugRingBufferVerboseLevel::VERBOSE;
50 constexpr uint32_t kDebugRingBufferMaxInterval = 5;
51 constexpr uint32_t kDebugRingBufferMaxDataSize = 1024;
52
53 /**
54 * Check if any of the ring buffer capabilities are set.
55 */
hasAnyRingBufferCapabilities(uint32_t caps)56 bool hasAnyRingBufferCapabilities(uint32_t caps) {
57 return (caps &
58 (IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_CONNECT_EVENT |
59 IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_POWER_EVENT |
60 IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_WAKELOCK_EVENT |
61 IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_VENDOR_DATA));
62 }
63 } // namespace
64
65 /**
66 * Fixture for IWifiChip tests.
67 *
68 * Tests that require SoftAP or NAN support should go into WifiChipHidlApTest or
69 * WifiChipHidlNanTest respectively.
70 */
71 class WifiChipHidlTest : public ::testing::TestWithParam<std::string> {
72 public:
SetUp()73 virtual void SetUp() override {
74 // Make sure test starts with a clean state
75 stopWifi(GetInstanceName());
76
77 wifi_chip_ = getWifiChip(GetInstanceName());
78 ASSERT_NE(nullptr, wifi_chip_.get());
79 }
80
TearDown()81 virtual void TearDown() override { stopWifi(GetInstanceName()); }
82
83 protected:
84 // Helper function to configure the Chip in one of the supported modes.
85 // Most of the non-mode-configuration-related methods require chip
86 // to be first configured.
configureChipForIfaceType(IfaceType type,bool expectSuccess)87 ChipModeId configureChipForIfaceType(IfaceType type, bool expectSuccess) {
88 ChipModeId mode_id;
89 EXPECT_EQ(expectSuccess,
90 configureChipToSupportIfaceType(wifi_chip_, type, &mode_id));
91 return mode_id;
92 }
93
configureChipForStaIfaceAndGetCapabilities()94 uint32_t configureChipForStaIfaceAndGetCapabilities() {
95 configureChipForIfaceType(IfaceType::STA, true);
96
97 sp<::android::hardware::wifi::V1_3::IWifiChip> chip_converted =
98 ::android::hardware::wifi::V1_3::IWifiChip::castFrom(wifi_chip_);
99
100 std::pair<WifiStatus, uint32_t> status_and_caps;
101
102 if (chip_converted != nullptr) {
103 // Call the newer HAL version
104 status_and_caps = HIDL_INVOKE(chip_converted, getCapabilities_1_3);
105 } else {
106 status_and_caps = HIDL_INVOKE(wifi_chip_, getCapabilities);
107 }
108
109 if (status_and_caps.first.code != WifiStatusCode::SUCCESS) {
110 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status_and_caps.first.code);
111 return 0;
112 }
113 return status_and_caps.second;
114 }
115
getIfaceName(const sp<IWifiIface> & iface)116 std::string getIfaceName(const sp<IWifiIface>& iface) {
117 const auto& status_and_name = HIDL_INVOKE(iface, getName);
118 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_name.first.code);
119 return status_and_name.second;
120 }
121
createP2pIface(sp<IWifiP2pIface> * p2p_iface)122 WifiStatusCode createP2pIface(sp<IWifiP2pIface>* p2p_iface) {
123 const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createP2pIface);
124 *p2p_iface = status_and_iface.second;
125 return status_and_iface.first.code;
126 }
127
removeP2pIface(const std::string & name)128 WifiStatusCode removeP2pIface(const std::string& name) {
129 return HIDL_INVOKE(wifi_chip_, removeP2pIface, name).code;
130 }
131
createStaIface(sp<IWifiStaIface> * sta_iface)132 WifiStatusCode createStaIface(sp<IWifiStaIface>* sta_iface) {
133 const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createStaIface);
134 *sta_iface = status_and_iface.second;
135 return status_and_iface.first.code;
136 }
137
removeStaIface(const std::string & name)138 WifiStatusCode removeStaIface(const std::string& name) {
139 return HIDL_INVOKE(wifi_chip_, removeStaIface, name).code;
140 }
141
142 sp<IWifiChip> wifi_chip_;
143
144 protected:
GetInstanceName()145 std::string GetInstanceName() { return GetParam(); }
146 };
147
148 /*
149 * Create:
150 * Ensures that an instance of the IWifiChip proxy object is
151 * successfully created.
152 */
TEST_P(WifiChipHidlTest,Create)153 TEST_P(WifiChipHidlTest, Create) {
154 // The creation of a proxy object is tested as part of SetUp method.
155 }
156
157 /*
158 * GetId:
159 */
TEST_P(WifiChipHidlTest,GetId)160 TEST_P(WifiChipHidlTest, GetId) {
161 EXPECT_EQ(WifiStatusCode::SUCCESS,
162 HIDL_INVOKE(wifi_chip_, getId).first.code);
163 }
164
165 /*
166 * GetAvailableMode:
167 */
TEST_P(WifiChipHidlTest,GetAvailableModes)168 TEST_P(WifiChipHidlTest, GetAvailableModes) {
169 const auto& status_and_modes = HIDL_INVOKE(wifi_chip_, getAvailableModes);
170 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_modes.first.code);
171 EXPECT_LT(0u, status_and_modes.second.size());
172 }
173
174 /*
175 * ConfigureChip:
176 */
TEST_P(WifiChipHidlTest,ConfigureChip)177 TEST_P(WifiChipHidlTest, ConfigureChip) {
178 const auto& status_and_modes = HIDL_INVOKE(wifi_chip_, getAvailableModes);
179 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_modes.first.code);
180 EXPECT_LT(0u, status_and_modes.second.size());
181 for (const auto& mode : status_and_modes.second) {
182 // configureChip() requires to be called with a fresh IWifiChip object.
183 wifi_chip_ = getWifiChip(GetInstanceName());
184 ASSERT_NE(nullptr, wifi_chip_.get());
185 EXPECT_EQ(WifiStatusCode::SUCCESS,
186 HIDL_INVOKE(wifi_chip_, configureChip, mode.id).code);
187 stopWifi(GetInstanceName());
188 // Sleep for 5 milliseconds between each wifi state toggle.
189 usleep(5000);
190 }
191 }
192
193 /*
194 * GetCapabilities:
195 */
TEST_P(WifiChipHidlTest,GetCapabilities)196 TEST_P(WifiChipHidlTest, GetCapabilities) {
197 configureChipForIfaceType(IfaceType::STA, true);
198 const auto& status_and_caps = HIDL_INVOKE(wifi_chip_, getCapabilities);
199 if (status_and_caps.first.code != WifiStatusCode::SUCCESS) {
200 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status_and_caps.first.code);
201 return;
202 }
203 EXPECT_NE(0u, status_and_caps.second);
204 }
205
206 /*
207 * GetMode:
208 */
TEST_P(WifiChipHidlTest,GetMode)209 TEST_P(WifiChipHidlTest, GetMode) {
210 ChipModeId chip_mode_id = configureChipForIfaceType(IfaceType::STA, true);
211 const auto& status_and_mode = HIDL_INVOKE(wifi_chip_, getMode);
212 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_mode.first.code);
213 EXPECT_EQ(chip_mode_id, status_and_mode.second);
214 }
215
216 /*
217 * RequestChipDebugInfo:
218 */
TEST_P(WifiChipHidlTest,RequestChipDebugInfo)219 TEST_P(WifiChipHidlTest, RequestChipDebugInfo) {
220 configureChipForIfaceType(IfaceType::STA, true);
221 const auto& status_and_chip_info =
222 HIDL_INVOKE(wifi_chip_, requestChipDebugInfo);
223 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_chip_info.first.code);
224 EXPECT_LT(0u, status_and_chip_info.second.driverDescription.size());
225 EXPECT_LT(0u, status_and_chip_info.second.firmwareDescription.size());
226 }
227
228 /*
229 * RequestFirmwareDebugDump
230 */
TEST_P(WifiChipHidlTest,RequestFirmwareDebugDump)231 TEST_P(WifiChipHidlTest, RequestFirmwareDebugDump) {
232 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
233 const auto& status_and_firmware_dump =
234 HIDL_INVOKE(wifi_chip_, requestFirmwareDebugDump);
235 if (caps & IWifiChip::ChipCapabilityMask::DEBUG_MEMORY_FIRMWARE_DUMP) {
236 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_firmware_dump.first.code);
237 } else {
238 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
239 status_and_firmware_dump.first.code);
240 }
241 }
242
243 /*
244 * RequestDriverDebugDump
245 */
TEST_P(WifiChipHidlTest,RequestDriverDebugDump)246 TEST_P(WifiChipHidlTest, RequestDriverDebugDump) {
247 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
248 const auto& status_and_driver_dump =
249 HIDL_INVOKE(wifi_chip_, requestDriverDebugDump);
250 if (caps & IWifiChip::ChipCapabilityMask::DEBUG_MEMORY_DRIVER_DUMP) {
251 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_driver_dump.first.code);
252 } else {
253 // API semantics (today) are such that function cannot be called if not capable!
254 //
255 // EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
256 // status_and_driver_dump.first.code);
257 }
258 }
259
260 /*
261 * GetDebugRingBuffersStatus
262 */
TEST_P(WifiChipHidlTest,GetDebugRingBuffersStatus)263 TEST_P(WifiChipHidlTest, GetDebugRingBuffersStatus) {
264 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
265 const auto& status_and_ring_buffer_status =
266 HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
267 if (hasAnyRingBufferCapabilities(caps)) {
268 EXPECT_EQ(WifiStatusCode::SUCCESS,
269 status_and_ring_buffer_status.first.code);
270 for (const auto& ring_buffer : status_and_ring_buffer_status.second) {
271 EXPECT_LT(0u, ring_buffer.ringName.size());
272 }
273 } else {
274 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
275 status_and_ring_buffer_status.first.code);
276 }
277 }
278
279 /*
280 * StartLoggingToDebugRingBuffer
281 */
TEST_P(WifiChipHidlTest,StartLoggingToDebugRingBuffer)282 TEST_P(WifiChipHidlTest, StartLoggingToDebugRingBuffer) {
283 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
284 std::string ring_name;
285 const auto& status_and_ring_buffer_status =
286 HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
287 if (hasAnyRingBufferCapabilities(caps)) {
288 EXPECT_EQ(WifiStatusCode::SUCCESS,
289 status_and_ring_buffer_status.first.code);
290 ASSERT_LT(0u, status_and_ring_buffer_status.second.size());
291 ring_name = status_and_ring_buffer_status.second[0].ringName.c_str();
292 } else {
293 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
294 status_and_ring_buffer_status.first.code);
295 }
296 const auto& status =
297 HIDL_INVOKE(wifi_chip_, startLoggingToDebugRingBuffer, ring_name,
298 kDebugRingBufferVerboseLvl, kDebugRingBufferMaxInterval,
299 kDebugRingBufferMaxDataSize);
300 if (hasAnyRingBufferCapabilities(caps)) {
301 EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
302 } else {
303 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status.code);
304 }
305 }
306
307 /*
308 * ForceDumpToDebugRingBuffer
309 */
TEST_P(WifiChipHidlTest,ForceDumpToDebugRingBuffer)310 TEST_P(WifiChipHidlTest, ForceDumpToDebugRingBuffer) {
311 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
312 std::string ring_name;
313 const auto& status_and_ring_buffer_status =
314 HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
315 if (hasAnyRingBufferCapabilities(caps)) {
316 EXPECT_EQ(WifiStatusCode::SUCCESS,
317 status_and_ring_buffer_status.first.code);
318 ASSERT_LT(0u, status_and_ring_buffer_status.second.size());
319 ring_name = status_and_ring_buffer_status.second[0].ringName.c_str();
320 } else {
321 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
322 status_and_ring_buffer_status.first.code);
323 }
324 const auto& status =
325 HIDL_INVOKE(wifi_chip_, forceDumpToDebugRingBuffer, ring_name);
326 if (hasAnyRingBufferCapabilities(caps)) {
327 EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
328 } else {
329 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status.code);
330 }
331 }
332
333 /*
334 * GetDebugHostWakeReasonStats
335 */
TEST_P(WifiChipHidlTest,GetDebugHostWakeReasonStats)336 TEST_P(WifiChipHidlTest, GetDebugHostWakeReasonStats) {
337 uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
338 const auto& status_and_debug_wake_reason =
339 HIDL_INVOKE(wifi_chip_, getDebugHostWakeReasonStats);
340 if (caps & IWifiChip::ChipCapabilityMask::DEBUG_HOST_WAKE_REASON_STATS) {
341 EXPECT_EQ(WifiStatusCode::SUCCESS,
342 status_and_debug_wake_reason.first.code);
343 } else {
344 EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
345 status_and_debug_wake_reason.first.code);
346 }
347 }
348
349 /*
350 * CreateP2pIface
351 * Configures the chip in P2P mode and ensures that at least 1 iface creation
352 * succeeds.
353 */
TEST_P(WifiChipHidlTest,CreateP2pIface)354 TEST_P(WifiChipHidlTest, CreateP2pIface) {
355 configureChipForIfaceType(IfaceType::P2P, true);
356
357 sp<IWifiP2pIface> iface;
358 EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&iface));
359 EXPECT_NE(nullptr, iface.get());
360 }
361
362 /*
363 * GetP2pIfaceNames
364 * Configures the chip in P2P mode and ensures that the iface list is empty
365 * before creating the iface. Then, create the iface and ensure that
366 * iface name is returned via the list.
367 */
TEST_P(WifiChipHidlTest,GetP2pIfaceNames)368 TEST_P(WifiChipHidlTest, GetP2pIfaceNames) {
369 configureChipForIfaceType(IfaceType::P2P, true);
370
371 const auto& status_and_iface_names1 =
372 HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
373 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
374 EXPECT_EQ(0u, status_and_iface_names1.second.size());
375
376 sp<IWifiP2pIface> iface;
377 EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&iface));
378 ASSERT_NE(nullptr, iface.get());
379
380 std::string iface_name = getIfaceName(iface);
381 const auto& status_and_iface_names2 =
382 HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
383 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names2.first.code);
384 EXPECT_EQ(1u, status_and_iface_names2.second.size());
385 EXPECT_EQ(iface_name, status_and_iface_names2.second[0]);
386
387 EXPECT_EQ(WifiStatusCode::SUCCESS, removeP2pIface(iface_name));
388 const auto& status_and_iface_names3 =
389 HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
390 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names3.first.code);
391 EXPECT_EQ(0u, status_and_iface_names3.second.size());
392 }
393
394 /*
395 * GetP2pIface
396 * Configures the chip in P2P mode and create an iface. Then, retrieve
397 * the iface object using the correct name and ensure any other name
398 * doesn't retrieve an iface object.
399 */
TEST_P(WifiChipHidlTest,GetP2pIface)400 TEST_P(WifiChipHidlTest, GetP2pIface) {
401 configureChipForIfaceType(IfaceType::P2P, true);
402
403 sp<IWifiP2pIface> p2p_iface;
404 EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&p2p_iface));
405 ASSERT_NE(nullptr, p2p_iface.get());
406
407 std::string iface_name = getIfaceName(p2p_iface);
408 const auto& status_and_iface1 =
409 HIDL_INVOKE(wifi_chip_, getP2pIface, iface_name);
410 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface1.first.code);
411 EXPECT_NE(nullptr, status_and_iface1.second.get());
412
413 std::string invalid_name = iface_name + "0";
414 const auto& status_and_iface2 =
415 HIDL_INVOKE(wifi_chip_, getP2pIface, invalid_name);
416 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, status_and_iface2.first.code);
417 EXPECT_EQ(nullptr, status_and_iface2.second.get());
418 }
419
420 /*
421 * RemoveP2pIface
422 * Configures the chip in P2P mode and create an iface. Then, remove
423 * the iface object using the correct name and ensure any other name
424 * doesn't remove the iface.
425 */
TEST_P(WifiChipHidlTest,RemoveP2pIface)426 TEST_P(WifiChipHidlTest, RemoveP2pIface) {
427 configureChipForIfaceType(IfaceType::P2P, true);
428
429 sp<IWifiP2pIface> p2p_iface;
430 EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&p2p_iface));
431 ASSERT_NE(nullptr, p2p_iface.get());
432
433 std::string iface_name = getIfaceName(p2p_iface);
434 std::string invalid_name = iface_name + "0";
435 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeP2pIface(invalid_name));
436 EXPECT_EQ(WifiStatusCode::SUCCESS, removeP2pIface(iface_name));
437
438 // No such iface exists now. So, this should return failure.
439 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeP2pIface(iface_name));
440 }
441
442 /*
443 * CreateStaIface
444 * Configures the chip in STA mode and ensures that at least 1 iface creation
445 * succeeds.
446 */
TEST_P(WifiChipHidlTest,CreateStaIface)447 TEST_P(WifiChipHidlTest, CreateStaIface) {
448 configureChipForIfaceType(IfaceType::STA, true);
449
450 sp<IWifiStaIface> iface;
451 EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&iface));
452 EXPECT_NE(nullptr, iface.get());
453 }
454
455 /*
456 * GetStaIfaceNames
457 * Configures the chip in STA mode and ensures that the iface list is empty
458 * before creating the iface. Then, create the iface and ensure that
459 * iface name is returned via the list.
460 */
TEST_P(WifiChipHidlTest,GetStaIfaceNames)461 TEST_P(WifiChipHidlTest, GetStaIfaceNames) {
462 configureChipForIfaceType(IfaceType::STA, true);
463
464 const auto& status_and_iface_names1 =
465 HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
466 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
467 EXPECT_EQ(0u, status_and_iface_names1.second.size());
468
469 sp<IWifiStaIface> iface;
470 EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&iface));
471 ASSERT_NE(nullptr, iface.get());
472
473 std::string iface_name = getIfaceName(iface);
474 const auto& status_and_iface_names2 =
475 HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
476 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names2.first.code);
477 EXPECT_EQ(1u, status_and_iface_names2.second.size());
478 EXPECT_EQ(iface_name, status_and_iface_names2.second[0]);
479
480 EXPECT_EQ(WifiStatusCode::SUCCESS, removeStaIface(iface_name));
481 const auto& status_and_iface_names3 =
482 HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
483 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names3.first.code);
484 EXPECT_EQ(0u, status_and_iface_names3.second.size());
485 }
486
487 /*
488 * GetStaIface
489 * Configures the chip in STA mode and create an iface. Then, retrieve
490 * the iface object using the correct name and ensure any other name
491 * doesn't retrieve an iface object.
492 */
TEST_P(WifiChipHidlTest,GetStaIface)493 TEST_P(WifiChipHidlTest, GetStaIface) {
494 configureChipForIfaceType(IfaceType::STA, true);
495
496 sp<IWifiStaIface> sta_iface;
497 EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&sta_iface));
498 ASSERT_NE(nullptr, sta_iface.get());
499
500 std::string iface_name = getIfaceName(sta_iface);
501 const auto& status_and_iface1 =
502 HIDL_INVOKE(wifi_chip_, getStaIface, iface_name);
503 EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface1.first.code);
504 EXPECT_NE(nullptr, status_and_iface1.second.get());
505
506 std::string invalid_name = iface_name + "0";
507 const auto& status_and_iface2 =
508 HIDL_INVOKE(wifi_chip_, getStaIface, invalid_name);
509 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, status_and_iface2.first.code);
510 EXPECT_EQ(nullptr, status_and_iface2.second.get());
511 }
512
513 /*
514 * RemoveStaIface
515 * Configures the chip in STA mode and create an iface. Then, remove
516 * the iface object using the correct name and ensure any other name
517 * doesn't remove the iface.
518 */
TEST_P(WifiChipHidlTest,RemoveStaIface)519 TEST_P(WifiChipHidlTest, RemoveStaIface) {
520 configureChipForIfaceType(IfaceType::STA, true);
521
522 sp<IWifiStaIface> sta_iface;
523 EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&sta_iface));
524 ASSERT_NE(nullptr, sta_iface.get());
525
526 std::string iface_name = getIfaceName(sta_iface);
527 std::string invalid_name = iface_name + "0";
528 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeStaIface(invalid_name));
529 EXPECT_EQ(WifiStatusCode::SUCCESS, removeStaIface(iface_name));
530
531 // No such iface exists now. So, this should return failure.
532 EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeStaIface(iface_name));
533 }
534
535 /*
536 * CreateRttController
537 */
TEST_P(WifiChipHidlTest,CreateRttController)538 TEST_P(WifiChipHidlTest, CreateRttController) {
539 configureChipForIfaceType(IfaceType::STA, true);
540
541 sp<IWifiStaIface> iface;
542 EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&iface));
543 ASSERT_NE(nullptr, iface.get());
544
545 const auto& status_and_rtt_controller =
546 HIDL_INVOKE(wifi_chip_, createRttController, iface);
547 if (status_and_rtt_controller.first.code !=
548 WifiStatusCode::ERROR_NOT_SUPPORTED) {
549 EXPECT_EQ(WifiStatusCode::SUCCESS,
550 status_and_rtt_controller.first.code);
551 EXPECT_NE(nullptr, status_and_rtt_controller.second.get());
552 }
553 }
554
555 INSTANTIATE_TEST_SUITE_P(
556 PerInstance, WifiChipHidlTest,
557 testing::ValuesIn(
558 android::hardware::getAllHalInstanceNames(IWifi::descriptor)),
559 android::hardware::PrintInstanceNameToString);
560