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