Home | History | Annotate | Download | only in functional
      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/IWifiChip.h>
     20 
     21 #include <VtsHalHidlTargetTestBase.h>
     22 
     23 #include "wifi_hidl_call_util.h"
     24 #include "wifi_hidl_test_utils.h"
     25 
     26 using ::android::sp;
     27 using ::android::hardware::hidl_string;
     28 using ::android::hardware::hidl_vec;
     29 using ::android::hardware::wifi::V1_0::IfaceType;
     30 using ::android::hardware::wifi::V1_0::ChipId;
     31 using ::android::hardware::wifi::V1_0::ChipModeId;
     32 using ::android::hardware::wifi::V1_0::WifiDebugRingBufferStatus;
     33 using ::android::hardware::wifi::V1_0::WifiDebugRingBufferVerboseLevel;
     34 using ::android::hardware::wifi::V1_0::WifiDebugHostWakeReasonStats;
     35 using ::android::hardware::wifi::V1_0::WifiStatus;
     36 using ::android::hardware::wifi::V1_0::WifiStatusCode;
     37 using ::android::hardware::wifi::V1_0::IWifiChip;
     38 using ::android::hardware::wifi::V1_0::IWifiApIface;
     39 using ::android::hardware::wifi::V1_0::IWifiIface;
     40 using ::android::hardware::wifi::V1_0::IWifiNanIface;
     41 using ::android::hardware::wifi::V1_0::IWifiP2pIface;
     42 using ::android::hardware::wifi::V1_0::IWifiRttController;
     43 using ::android::hardware::wifi::V1_0::IWifiStaIface;
     44 
     45 namespace {
     46 constexpr WifiDebugRingBufferVerboseLevel kDebugRingBufferVerboseLvl =
     47     WifiDebugRingBufferVerboseLevel::VERBOSE;
     48 constexpr uint32_t kDebugRingBufferMaxInterval = 5;
     49 constexpr uint32_t kDebugRingBufferMaxDataSize = 1024;
     50 
     51 /**
     52  * Check if any of the ring buffer capabilities are set.
     53  */
     54 bool hasAnyRingBufferCapabilities(uint32_t caps) {
     55     return (caps &
     56             (IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_CONNECT_EVENT |
     57              IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_POWER_EVENT |
     58              IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_WAKELOCK_EVENT |
     59              IWifiChip::ChipCapabilityMask::DEBUG_RING_BUFFER_VENDOR_DATA));
     60 }
     61 }  // namespace
     62 
     63 /**
     64  * Fixture to use for all Wifi chip HIDL interface tests.
     65  */
     66 class WifiChipHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     67    public:
     68     virtual void SetUp() override {
     69         wifi_chip_ = getWifiChip();
     70         ASSERT_NE(nullptr, wifi_chip_.get());
     71     }
     72 
     73     virtual void TearDown() override { stopWifi(); }
     74 
     75    protected:
     76     // Helper function to configure the Chip in one of the supported modes.
     77     // Most of the non-mode-configuration-related methods require chip
     78     // to be first configured.
     79     ChipModeId configureChipForIfaceType(IfaceType type, bool expectSuccess) {
     80         ChipModeId mode_id;
     81         EXPECT_EQ(expectSuccess, configureChipToSupportIfaceType(wifi_chip_, type, &mode_id));
     82         return mode_id;
     83     }
     84 
     85     uint32_t configureChipForStaIfaceAndGetCapabilities() {
     86         configureChipForIfaceType(IfaceType::STA, true);
     87         const auto& status_and_caps = HIDL_INVOKE(wifi_chip_, getCapabilities);
     88         EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
     89         return status_and_caps.second;
     90     }
     91 
     92     std::string getIfaceName(const sp<IWifiIface>& iface) {
     93         const auto& status_and_name = HIDL_INVOKE(iface, getName);
     94         EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_name.first.code);
     95         return status_and_name.second;
     96     }
     97 
     98     WifiStatusCode createApIface(sp<IWifiApIface>* ap_iface) {
     99         const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createApIface);
    100         *ap_iface = status_and_iface.second;
    101         return status_and_iface.first.code;
    102     }
    103 
    104     WifiStatusCode removeApIface(const std::string& name) {
    105         return HIDL_INVOKE(wifi_chip_, removeApIface, name).code;
    106     }
    107 
    108     WifiStatusCode createNanIface(sp<IWifiNanIface>* nan_iface) {
    109         const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createNanIface);
    110         *nan_iface = status_and_iface.second;
    111         return status_and_iface.first.code;
    112     }
    113 
    114     WifiStatusCode removeNanIface(const std::string& name) {
    115         return HIDL_INVOKE(wifi_chip_, removeNanIface, name).code;
    116     }
    117 
    118     WifiStatusCode createP2pIface(sp<IWifiP2pIface>* p2p_iface) {
    119         const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createP2pIface);
    120         *p2p_iface = status_and_iface.second;
    121         return status_and_iface.first.code;
    122     }
    123 
    124     WifiStatusCode removeP2pIface(const std::string& name) {
    125         return HIDL_INVOKE(wifi_chip_, removeP2pIface, name).code;
    126     }
    127 
    128     WifiStatusCode createStaIface(sp<IWifiStaIface>* sta_iface) {
    129         const auto& status_and_iface = HIDL_INVOKE(wifi_chip_, createStaIface);
    130         *sta_iface = status_and_iface.second;
    131         return status_and_iface.first.code;
    132     }
    133 
    134     WifiStatusCode removeStaIface(const std::string& name) {
    135         return HIDL_INVOKE(wifi_chip_, removeStaIface, name).code;
    136     }
    137 
    138     sp<IWifiChip> wifi_chip_;
    139 };
    140 
    141 /*
    142  * Create:
    143  * Ensures that an instance of the IWifiChip proxy object is
    144  * successfully created.
    145  */
    146 TEST(WifiChipHidlTestNoFixture, Create) {
    147     EXPECT_NE(nullptr, getWifiChip().get());
    148     stopWifi();
    149 }
    150 
    151 /*
    152  * GetId:
    153  */
    154 TEST_F(WifiChipHidlTest, GetId) {
    155     EXPECT_EQ(WifiStatusCode::SUCCESS,
    156               HIDL_INVOKE(wifi_chip_, getId).first.code);
    157 }
    158 
    159 /*
    160  * GetAvailableMode:
    161  */
    162 TEST_F(WifiChipHidlTest, GetAvailableModes) {
    163     const auto& status_and_modes = HIDL_INVOKE(wifi_chip_, getAvailableModes);
    164     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_modes.first.code);
    165     EXPECT_LT(0u, status_and_modes.second.size());
    166 }
    167 
    168 /*
    169  * ConfigureChip:
    170  */
    171 TEST_F(WifiChipHidlTest, ConfigureChip) {
    172     const auto& status_and_modes = HIDL_INVOKE(wifi_chip_, getAvailableModes);
    173     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_modes.first.code);
    174     EXPECT_LT(0u, status_and_modes.second.size());
    175     for (const auto& mode : status_and_modes.second) {
    176         // configureChip() requires to be called with a fresh IWifiChip object.
    177         wifi_chip_ = getWifiChip();
    178         ASSERT_NE(nullptr, wifi_chip_.get());
    179         EXPECT_EQ(WifiStatusCode::SUCCESS,
    180                   HIDL_INVOKE(wifi_chip_, configureChip, mode.id).code);
    181         stopWifi();
    182     }
    183 }
    184 
    185 /*
    186  * GetCapabilities:
    187  */
    188 TEST_F(WifiChipHidlTest, GetCapabilities) {
    189     configureChipForIfaceType(IfaceType::STA, true);
    190     const auto& status_and_caps = HIDL_INVOKE(wifi_chip_, getCapabilities);
    191     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
    192     EXPECT_NE(0u, status_and_caps.second);
    193 }
    194 
    195 /*
    196  * GetMode:
    197  */
    198 TEST_F(WifiChipHidlTest, GetMode) {
    199     ChipModeId chip_mode_id = configureChipForIfaceType(IfaceType::STA, true);
    200     const auto& status_and_mode = HIDL_INVOKE(wifi_chip_, getMode);
    201     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_mode.first.code);
    202     EXPECT_EQ(chip_mode_id, status_and_mode.second);
    203 }
    204 
    205 /*
    206  * RequestChipDebugInfo:
    207  */
    208 TEST_F(WifiChipHidlTest, RequestChipDebugInfo) {
    209     configureChipForIfaceType(IfaceType::STA, true);
    210     const auto& status_and_chip_info =
    211         HIDL_INVOKE(wifi_chip_, requestChipDebugInfo);
    212     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_chip_info.first.code);
    213     EXPECT_LT(0u, status_and_chip_info.second.driverDescription.size());
    214     EXPECT_LT(0u, status_and_chip_info.second.firmwareDescription.size());
    215 }
    216 
    217 /*
    218  * RequestFirmwareDebugDump
    219  */
    220 TEST_F(WifiChipHidlTest, RequestFirmwareDebugDump) {
    221     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    222     const auto& status_and_firmware_dump =
    223         HIDL_INVOKE(wifi_chip_, requestFirmwareDebugDump);
    224     if (caps & IWifiChip::ChipCapabilityMask::DEBUG_MEMORY_FIRMWARE_DUMP) {
    225         EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_firmware_dump.first.code);
    226     } else {
    227         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    228                   status_and_firmware_dump.first.code);
    229     }
    230 }
    231 
    232 /*
    233  * RequestDriverDebugDump
    234  */
    235 TEST_F(WifiChipHidlTest, RequestDriverDebugDump) {
    236     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    237     const auto& status_and_driver_dump =
    238         HIDL_INVOKE(wifi_chip_, requestDriverDebugDump);
    239     if (caps & IWifiChip::ChipCapabilityMask::DEBUG_MEMORY_DRIVER_DUMP) {
    240         EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_driver_dump.first.code);
    241     } else {
    242       // API semantics (today) are such that function cannot be called if not capable!
    243       //
    244       //  EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    245       //            status_and_driver_dump.first.code);
    246     }
    247 }
    248 
    249 /*
    250  * GetDebugRingBuffersStatus
    251  */
    252 TEST_F(WifiChipHidlTest, GetDebugRingBuffersStatus) {
    253     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    254     const auto& status_and_ring_buffer_status =
    255         HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
    256     if (hasAnyRingBufferCapabilities(caps)) {
    257         EXPECT_EQ(WifiStatusCode::SUCCESS,
    258                   status_and_ring_buffer_status.first.code);
    259         for (const auto& ring_buffer : status_and_ring_buffer_status.second) {
    260             EXPECT_LT(0u, ring_buffer.ringName.size());
    261         }
    262     } else {
    263         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    264                   status_and_ring_buffer_status.first.code);
    265     }
    266 }
    267 
    268 /*
    269  * StartLoggingToDebugRingBuffer
    270  */
    271 TEST_F(WifiChipHidlTest, StartLoggingToDebugRingBuffer) {
    272     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    273     std::string ring_name;
    274     const auto& status_and_ring_buffer_status =
    275         HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
    276     if (hasAnyRingBufferCapabilities(caps)) {
    277         EXPECT_EQ(WifiStatusCode::SUCCESS,
    278                   status_and_ring_buffer_status.first.code);
    279         ASSERT_LT(0u, status_and_ring_buffer_status.second.size());
    280         ring_name = status_and_ring_buffer_status.second[0].ringName.c_str();
    281     } else {
    282         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    283                   status_and_ring_buffer_status.first.code);
    284     }
    285     const auto& status =
    286         HIDL_INVOKE(wifi_chip_, startLoggingToDebugRingBuffer, ring_name,
    287                     kDebugRingBufferVerboseLvl, kDebugRingBufferMaxInterval,
    288                     kDebugRingBufferMaxDataSize);
    289     if (hasAnyRingBufferCapabilities(caps)) {
    290         EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
    291     } else {
    292         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status.code);
    293     }
    294 }
    295 
    296 /*
    297  * ForceDumpToDebugRingBuffer
    298  */
    299 TEST_F(WifiChipHidlTest, ForceDumpToDebugRingBuffer) {
    300     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    301     std::string ring_name;
    302     const auto& status_and_ring_buffer_status =
    303         HIDL_INVOKE(wifi_chip_, getDebugRingBuffersStatus);
    304     if (hasAnyRingBufferCapabilities(caps)) {
    305         EXPECT_EQ(WifiStatusCode::SUCCESS,
    306                   status_and_ring_buffer_status.first.code);
    307         ASSERT_LT(0u, status_and_ring_buffer_status.second.size());
    308         ring_name = status_and_ring_buffer_status.second[0].ringName.c_str();
    309     } else {
    310         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    311                   status_and_ring_buffer_status.first.code);
    312     }
    313     const auto& status =
    314         HIDL_INVOKE(wifi_chip_, forceDumpToDebugRingBuffer, ring_name);
    315     if (hasAnyRingBufferCapabilities(caps)) {
    316         EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
    317     } else {
    318         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status.code);
    319     }
    320 }
    321 
    322 /*
    323  * GetDebugHostWakeReasonStats
    324  */
    325 TEST_F(WifiChipHidlTest, GetDebugHostWakeReasonStats) {
    326     uint32_t caps = configureChipForStaIfaceAndGetCapabilities();
    327     const auto& status_and_debug_wake_reason =
    328         HIDL_INVOKE(wifi_chip_, getDebugHostWakeReasonStats);
    329     if (caps & IWifiChip::ChipCapabilityMask::DEBUG_HOST_WAKE_REASON_STATS) {
    330         EXPECT_EQ(WifiStatusCode::SUCCESS,
    331                   status_and_debug_wake_reason.first.code);
    332     } else {
    333         EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED,
    334                   status_and_debug_wake_reason.first.code);
    335     }
    336 }
    337 
    338 /*
    339  * CreateApIface
    340  * Configures the chip in AP mode and ensures that only 1 iface creation
    341  * succeeds. The 2nd iface creation should be rejected.
    342  */
    343 TEST_F(WifiChipHidlTest, CreateApIface) {
    344     configureChipForIfaceType(IfaceType::AP, true);
    345 
    346     sp<IWifiApIface> iface;
    347     EXPECT_EQ(WifiStatusCode::SUCCESS, createApIface(&iface));
    348     EXPECT_NE(nullptr, iface.get());
    349 
    350     EXPECT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createApIface(&iface));
    351 }
    352 
    353 /*
    354  * GetApIfaceNames
    355  * Configures the chip in AP mode and ensures that the iface list is empty
    356  * before creating the iface. Then, create the iface and ensure that
    357  * iface name is returned via the list.
    358  */
    359 TEST_F(WifiChipHidlTest, GetApIfaceNames) {
    360     configureChipForIfaceType(IfaceType::AP, true);
    361 
    362     const auto& status_and_iface_names1 =
    363         HIDL_INVOKE(wifi_chip_, getApIfaceNames);
    364     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
    365     EXPECT_EQ(0u, status_and_iface_names1.second.size());
    366 
    367     sp<IWifiApIface> iface;
    368     EXPECT_EQ(WifiStatusCode::SUCCESS, createApIface(&iface));
    369     EXPECT_NE(nullptr, iface.get());
    370 
    371     std::string iface_name = getIfaceName(iface);
    372     const auto& status_and_iface_names2 =
    373         HIDL_INVOKE(wifi_chip_, getApIfaceNames);
    374     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names2.first.code);
    375     EXPECT_EQ(1u, status_and_iface_names2.second.size());
    376     EXPECT_EQ(iface_name, status_and_iface_names2.second[0]);
    377 
    378     EXPECT_EQ(WifiStatusCode::SUCCESS, removeApIface(iface_name));
    379     const auto& status_and_iface_names3 =
    380         HIDL_INVOKE(wifi_chip_, getApIfaceNames);
    381     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names3.first.code);
    382     EXPECT_EQ(0u, status_and_iface_names3.second.size());
    383 }
    384 
    385 /*
    386  * GetApIface
    387  * Configures the chip in AP mode and create an iface. Then, retrieve
    388  * the iface object using the correct name and ensure any other name
    389  * doesn't retrieve an iface object.
    390  */
    391 TEST_F(WifiChipHidlTest, GetApIface) {
    392     configureChipForIfaceType(IfaceType::AP, true);
    393 
    394     sp<IWifiApIface> ap_iface;
    395     EXPECT_EQ(WifiStatusCode::SUCCESS, createApIface(&ap_iface));
    396     EXPECT_NE(nullptr, ap_iface.get());
    397 
    398     std::string iface_name = getIfaceName(ap_iface);
    399     const auto& status_and_iface1 =
    400         HIDL_INVOKE(wifi_chip_, getApIface, iface_name);
    401     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface1.first.code);
    402     EXPECT_NE(nullptr, status_and_iface1.second.get());
    403 
    404     std::string invalid_name = iface_name + "0";
    405     const auto& status_and_iface2 =
    406         HIDL_INVOKE(wifi_chip_, getApIface, invalid_name);
    407     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, status_and_iface2.first.code);
    408     EXPECT_EQ(nullptr, status_and_iface2.second.get());
    409 }
    410 
    411 /*
    412  * RemoveApIface
    413  * Configures the chip in AP mode and create an iface. Then, remove
    414  * the iface object using the correct name and ensure any other name
    415  * doesn't remove the iface.
    416  */
    417 TEST_F(WifiChipHidlTest, RemoveApIface) {
    418     configureChipForIfaceType(IfaceType::AP, true);
    419 
    420     sp<IWifiApIface> ap_iface;
    421     EXPECT_EQ(WifiStatusCode::SUCCESS, createApIface(&ap_iface));
    422     EXPECT_NE(nullptr, ap_iface.get());
    423 
    424     std::string iface_name = getIfaceName(ap_iface);
    425     std::string invalid_name = iface_name + "0";
    426     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeApIface(invalid_name));
    427     EXPECT_EQ(WifiStatusCode::SUCCESS, removeApIface(iface_name));
    428 
    429     // No such iface exists now. So, this should return failure.
    430     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeApIface(iface_name));
    431 }
    432 
    433 /*
    434  * CreateNanIface
    435  * Configures the chip in NAN mode and ensures that only 1 iface creation
    436  * succeeds. The 2nd iface creation should be rejected.
    437  */
    438 TEST_F(WifiChipHidlTest, CreateNanIface) {
    439     configureChipForIfaceType(IfaceType::NAN, false);
    440 
    441     sp<IWifiNanIface> iface;
    442     ASSERT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createNanIface(&iface));
    443 }
    444 
    445 /*
    446  * GetNanIfaceNames
    447  * Configures the chip in NAN mode and ensures that the iface list is empty
    448  * before creating the iface. Then, create the iface and ensure that
    449  * iface name is returned via the list.
    450  */
    451 TEST_F(WifiChipHidlTest, GetNanIfaceNames) {
    452     configureChipForIfaceType(IfaceType::NAN, false);
    453 
    454     const auto& status_and_iface_names1 =
    455         HIDL_INVOKE(wifi_chip_, getNanIfaceNames);
    456     ASSERT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
    457     EXPECT_EQ(0u, status_and_iface_names1.second.size());
    458 }
    459 
    460 /*
    461  * GetNanIface
    462  * Configures the chip in NAN mode and create an iface. Then, retrieve
    463  * the iface object using the correct name and ensure any other name
    464  * doesn't retrieve an iface object.
    465  */
    466 TEST_F(WifiChipHidlTest, GetNanIface) {
    467     configureChipForIfaceType(IfaceType::NAN, false);
    468 
    469     sp<IWifiNanIface> nan_iface;
    470     ASSERT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createNanIface(&nan_iface));
    471 }
    472 
    473 /*
    474  * RemoveNanIface
    475  * Configures the chip in NAN mode and create an iface. Then, remove
    476  * the iface object using the correct name and ensure any other name
    477  * doesn't remove the iface.
    478  */
    479 TEST_F(WifiChipHidlTest, RemoveNanIface) {
    480     configureChipForIfaceType(IfaceType::NAN, false);
    481 
    482     sp<IWifiNanIface> nan_iface;
    483     ASSERT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createNanIface(&nan_iface));
    484 }
    485 
    486 /*
    487  * CreateP2pIface
    488  * Configures the chip in P2P mode and ensures that only 1 iface creation
    489  * succeeds. The 2nd iface creation should be rejected.
    490  */
    491 TEST_F(WifiChipHidlTest, CreateP2pIface) {
    492     configureChipForIfaceType(IfaceType::P2P, true);
    493 
    494     sp<IWifiP2pIface> iface;
    495     EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&iface));
    496     EXPECT_NE(nullptr, iface.get());
    497 
    498     EXPECT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createP2pIface(&iface));
    499 }
    500 
    501 /*
    502  * GetP2pIfaceNames
    503  * Configures the chip in P2P mode and ensures that the iface list is empty
    504  * before creating the iface. Then, create the iface and ensure that
    505  * iface name is returned via the list.
    506  */
    507 TEST_F(WifiChipHidlTest, GetP2pIfaceNames) {
    508     configureChipForIfaceType(IfaceType::P2P, true);
    509 
    510     const auto& status_and_iface_names1 =
    511         HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
    512     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
    513     EXPECT_EQ(0u, status_and_iface_names1.second.size());
    514 
    515     sp<IWifiP2pIface> iface;
    516     EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&iface));
    517     EXPECT_NE(nullptr, iface.get());
    518 
    519     std::string iface_name = getIfaceName(iface);
    520     const auto& status_and_iface_names2 =
    521         HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
    522     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names2.first.code);
    523     EXPECT_EQ(1u, status_and_iface_names2.second.size());
    524     EXPECT_EQ(iface_name, status_and_iface_names2.second[0]);
    525 
    526     EXPECT_EQ(WifiStatusCode::SUCCESS, removeP2pIface(iface_name));
    527     const auto& status_and_iface_names3 =
    528         HIDL_INVOKE(wifi_chip_, getP2pIfaceNames);
    529     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names3.first.code);
    530     EXPECT_EQ(0u, status_and_iface_names3.second.size());
    531 }
    532 
    533 /*
    534  * GetP2pIface
    535  * Configures the chip in P2P mode and create an iface. Then, retrieve
    536  * the iface object using the correct name and ensure any other name
    537  * doesn't retrieve an iface object.
    538  */
    539 TEST_F(WifiChipHidlTest, GetP2pIface) {
    540     configureChipForIfaceType(IfaceType::P2P, true);
    541 
    542     sp<IWifiP2pIface> p2p_iface;
    543     EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&p2p_iface));
    544     EXPECT_NE(nullptr, p2p_iface.get());
    545 
    546     std::string iface_name = getIfaceName(p2p_iface);
    547     const auto& status_and_iface1 =
    548         HIDL_INVOKE(wifi_chip_, getP2pIface, iface_name);
    549     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface1.first.code);
    550     EXPECT_NE(nullptr, status_and_iface1.second.get());
    551 
    552     std::string invalid_name = iface_name + "0";
    553     const auto& status_and_iface2 =
    554         HIDL_INVOKE(wifi_chip_, getP2pIface, invalid_name);
    555     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, status_and_iface2.first.code);
    556     EXPECT_EQ(nullptr, status_and_iface2.second.get());
    557 }
    558 
    559 /*
    560  * RemoveP2pIface
    561  * Configures the chip in P2P mode and create an iface. Then, remove
    562  * the iface object using the correct name and ensure any other name
    563  * doesn't remove the iface.
    564  */
    565 TEST_F(WifiChipHidlTest, RemoveP2pIface) {
    566     configureChipForIfaceType(IfaceType::P2P, true);
    567 
    568     sp<IWifiP2pIface> p2p_iface;
    569     EXPECT_EQ(WifiStatusCode::SUCCESS, createP2pIface(&p2p_iface));
    570     EXPECT_NE(nullptr, p2p_iface.get());
    571 
    572     std::string iface_name = getIfaceName(p2p_iface);
    573     std::string invalid_name = iface_name + "0";
    574     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeP2pIface(invalid_name));
    575     EXPECT_EQ(WifiStatusCode::SUCCESS, removeP2pIface(iface_name));
    576 
    577     // No such iface exists now. So, this should return failure.
    578     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeP2pIface(iface_name));
    579 }
    580 
    581 /*
    582  * CreateStaIface
    583  * Configures the chip in STA mode and ensures that only 1 iface creation
    584  * succeeds. The 2nd iface creation should be rejected.
    585  */
    586 TEST_F(WifiChipHidlTest, CreateStaIface) {
    587     configureChipForIfaceType(IfaceType::STA, true);
    588 
    589     sp<IWifiStaIface> iface;
    590     EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&iface));
    591     EXPECT_NE(nullptr, iface.get());
    592 
    593     EXPECT_EQ(WifiStatusCode::ERROR_NOT_AVAILABLE, createStaIface(&iface));
    594 }
    595 
    596 /*
    597  * GetStaIfaceNames
    598  * Configures the chip in STA mode and ensures that the iface list is empty
    599  * before creating the iface. Then, create the iface and ensure that
    600  * iface name is returned via the list.
    601  */
    602 TEST_F(WifiChipHidlTest, GetStaIfaceNames) {
    603     configureChipForIfaceType(IfaceType::STA, true);
    604 
    605     const auto& status_and_iface_names1 =
    606         HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
    607     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names1.first.code);
    608     EXPECT_EQ(0u, status_and_iface_names1.second.size());
    609 
    610     sp<IWifiStaIface> iface;
    611     EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&iface));
    612     EXPECT_NE(nullptr, iface.get());
    613 
    614     std::string iface_name = getIfaceName(iface);
    615     const auto& status_and_iface_names2 =
    616         HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
    617     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names2.first.code);
    618     EXPECT_EQ(1u, status_and_iface_names2.second.size());
    619     EXPECT_EQ(iface_name, status_and_iface_names2.second[0]);
    620 
    621     EXPECT_EQ(WifiStatusCode::SUCCESS, removeStaIface(iface_name));
    622     const auto& status_and_iface_names3 =
    623         HIDL_INVOKE(wifi_chip_, getStaIfaceNames);
    624     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface_names3.first.code);
    625     EXPECT_EQ(0u, status_and_iface_names3.second.size());
    626 }
    627 
    628 /*
    629  * GetStaIface
    630  * Configures the chip in STA mode and create an iface. Then, retrieve
    631  * the iface object using the correct name and ensure any other name
    632  * doesn't retrieve an iface object.
    633  */
    634 TEST_F(WifiChipHidlTest, GetStaIface) {
    635     configureChipForIfaceType(IfaceType::STA, true);
    636 
    637     sp<IWifiStaIface> sta_iface;
    638     EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&sta_iface));
    639     EXPECT_NE(nullptr, sta_iface.get());
    640 
    641     std::string iface_name = getIfaceName(sta_iface);
    642     const auto& status_and_iface1 =
    643         HIDL_INVOKE(wifi_chip_, getStaIface, iface_name);
    644     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_iface1.first.code);
    645     EXPECT_NE(nullptr, status_and_iface1.second.get());
    646 
    647     std::string invalid_name = iface_name + "0";
    648     const auto& status_and_iface2 =
    649         HIDL_INVOKE(wifi_chip_, getStaIface, invalid_name);
    650     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, status_and_iface2.first.code);
    651     EXPECT_EQ(nullptr, status_and_iface2.second.get());
    652 }
    653 
    654 /*
    655  * RemoveStaIface
    656  * Configures the chip in STA mode and create an iface. Then, remove
    657  * the iface object using the correct name and ensure any other name
    658  * doesn't remove the iface.
    659  */
    660 TEST_F(WifiChipHidlTest, RemoveStaIface) {
    661     configureChipForIfaceType(IfaceType::STA, true);
    662 
    663     sp<IWifiStaIface> sta_iface;
    664     EXPECT_EQ(WifiStatusCode::SUCCESS, createStaIface(&sta_iface));
    665     EXPECT_NE(nullptr, sta_iface.get());
    666 
    667     std::string iface_name = getIfaceName(sta_iface);
    668     std::string invalid_name = iface_name + "0";
    669     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeStaIface(invalid_name));
    670     EXPECT_EQ(WifiStatusCode::SUCCESS, removeStaIface(iface_name));
    671 
    672     // No such iface exists now. So, this should return failure.
    673     EXPECT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, removeStaIface(iface_name));
    674 }
    675 
    676 /*
    677  * CreateRttController
    678  */
    679 TEST_F(WifiChipHidlTest, CreateRttController) {
    680     configureChipForIfaceType(IfaceType::AP, true);
    681 
    682     sp<IWifiApIface> iface;
    683     EXPECT_EQ(WifiStatusCode::SUCCESS, createApIface(&iface));
    684     EXPECT_NE(nullptr, iface.get());
    685 
    686     const auto& status_and_rtt_controller =
    687         HIDL_INVOKE(wifi_chip_, createRttController, iface);
    688     EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_rtt_controller.first.code);
    689     EXPECT_NE(nullptr, status_and_rtt_controller.second.get());
    690 }
    691