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