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 #define LOG_TAG "wifi_offload_hidl_hal_test"
     18 
     19 #include <android-base/logging.h>
     20 #include <android/hardware/wifi/offload/1.0/IOffload.h>
     21 #include <android/hardware/wifi/offload/1.0/IOffloadCallback.h>
     22 #include <android/hardware/wifi/offload/1.0/types.h>
     23 
     24 #include <VtsHalHidlTargetCallbackBase.h>
     25 #include <VtsHalHidlTargetTestBase.h>
     26 #include <VtsHalHidlTargetTestEnvBase.h>
     27 
     28 #include <vector>
     29 
     30 #include "hidl_call_util.h"
     31 
     32 using ::android::hardware::wifi::offload::V1_0::IOffload;
     33 using ::android::hardware::wifi::offload::V1_0::IOffloadCallback;
     34 using ::android::hardware::wifi::offload::V1_0::ScanResult;
     35 using ::android::hardware::wifi::offload::V1_0::ScanParam;
     36 using ::android::hardware::wifi::offload::V1_0::Ssid;
     37 using ::android::hardware::wifi::offload::V1_0::NetworkInfo;
     38 using ::android::hardware::wifi::offload::V1_0::ScanFilter;
     39 using ::android::hardware::wifi::offload::V1_0::ScanStats;
     40 using ::android::hardware::wifi::offload::V1_0::OffloadStatus;
     41 using ::android::hardware::wifi::offload::V1_0::OffloadStatusCode;
     42 using ::android::hardware::Return;
     43 using ::android::hardware::Void;
     44 using ::android::hardware::hidl_vec;
     45 using ::android::sp;
     46 
     47 constexpr char kOffloadCallbackSendScanResult[] = "onScanResult";
     48 constexpr char kOffloadCallbackSendError[] = "onError";
     49 
     50 namespace {
     51 const uint8_t kSsid1[] = {'G', 'o', 'o', 'g', 'l', 'e'};
     52 const uint8_t kSsid2[] = {'X', 'f', 'i', 'n', 'i', 't', 'y'};
     53 const uint8_t kBssid[6] = {0x12, 0xef, 0xa1, 0x2c, 0x97, 0x8b};
     54 const int16_t kRssi = -60;
     55 const uint32_t kFrequency = 2412;
     56 const uint8_t kBssidSize = 6;
     57 const uint64_t kTsf = 0;
     58 const uint16_t kCapability = 0;
     59 const uint8_t kNetworkFlags = 0;
     60 const uint32_t kFrequency1 = 2412;
     61 const uint32_t kFrequency2 = 2437;
     62 const uint32_t kDisconnectedModeScanIntervalMs = 5000;
     63 const int16_t kRssiThreshold = -76;
     64 }
     65 
     66 class OffloadCallbackArgs {
     67    public:
     68     hidl_vec<ScanResult> scan_results_;
     69     OffloadStatus error_code_;
     70 };
     71 
     72 // Test environment for Weaver HIDL HAL.
     73 class WifiOffloadHidlEnvironment
     74     : public ::testing::VtsHalHidlTargetTestEnvBase {
     75    public:
     76     // get the test environment singleton
     77     static WifiOffloadHidlEnvironment* Instance() {
     78         static WifiOffloadHidlEnvironment* instance =
     79             new WifiOffloadHidlEnvironment;
     80         return instance;
     81     }
     82 
     83     virtual void registerTestServices() override {
     84         registerTestService<IOffload>();
     85     }
     86 
     87    private:
     88     WifiOffloadHidlEnvironment() {}
     89 };
     90 
     91 // The main test class for WifiOffload HIDL HAL.
     92 class WifiOffloadHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     93    public:
     94     virtual void SetUp() override {
     95         wifi_offload_ =
     96             ::testing::VtsHalHidlTargetTestBase::getService<IOffload>(
     97                 WifiOffloadHidlEnvironment::Instance()
     98                     ->getServiceName<IOffload>());
     99         ASSERT_NE(wifi_offload_, nullptr);
    100 
    101         wifi_offload_cb_ = new OffloadCallback();
    102         ASSERT_NE(wifi_offload_cb_, nullptr);
    103     }
    104 
    105     virtual void TearDown() override {}
    106 
    107     /* Callback class for Offload HAL. */
    108     class OffloadCallback
    109         : public ::testing::VtsHalHidlTargetCallbackBase<OffloadCallbackArgs>,
    110           public IOffloadCallback {
    111        public:
    112         OffloadCallback(){};
    113 
    114         virtual ~OffloadCallback() = default;
    115 
    116         Return<void> onScanResult(
    117             const hidl_vec<ScanResult>& scan_result) override {
    118             OffloadCallbackArgs args;
    119             args.scan_results_ = scan_result;
    120             NotifyFromCallback(kOffloadCallbackSendScanResult, args);
    121             return Void();
    122         };
    123 
    124         Return<void> onError(const OffloadStatus& status) override {
    125             OffloadCallbackArgs args;
    126             args.error_code_ = status;
    127             NotifyFromCallback(kOffloadCallbackSendError, args);
    128             return Void();
    129         }
    130     };
    131 
    132     sp<IOffload> wifi_offload_;
    133     sp<OffloadCallback> wifi_offload_cb_;
    134 };
    135 
    136 /*
    137  * Verify that setEventCallback method returns without errors
    138  */
    139 TEST_F(WifiOffloadHidlTest, setEventCallback) {
    140     auto returnObject = wifi_offload_->setEventCallback(wifi_offload_cb_);
    141     ASSERT_EQ(true, returnObject.isOk());
    142 }
    143 
    144 /*
    145  * Verify that subscribeScanResults method returns without errors
    146  */
    147 TEST_F(WifiOffloadHidlTest, subscribeScanResults) {
    148     const auto& result = HIDL_INVOKE(wifi_offload_, subscribeScanResults, 0);
    149     ASSERT_EQ(OffloadStatusCode::OK, result.code);
    150 }
    151 
    152 /*
    153  * Verify that unsubscribeScanResults method returns without errors
    154  */
    155 TEST_F(WifiOffloadHidlTest, unsubscribeScanResults) {
    156     auto returnObject = wifi_offload_->unsubscribeScanResults();
    157     ASSERT_EQ(true, returnObject.isOk());
    158 }
    159 
    160 /*
    161  * Verify that configureScans method returns without errors
    162  */
    163 TEST_F(WifiOffloadHidlTest, configureScans) {
    164     ScanParam* pScanParam = new ScanParam();
    165     std::vector<uint32_t> frequencyList = {kFrequency1, kFrequency2};
    166     pScanParam->disconnectedModeScanIntervalMs =
    167         kDisconnectedModeScanIntervalMs;
    168     pScanParam->frequencyList = frequencyList;
    169     std::vector<Ssid> ssidList;
    170     std::vector<std::vector<uint8_t>> ssids{kSsid1, kSsid2};
    171     for (const auto& ssid : ssids) {
    172         Ssid tmp = ssid;
    173         ssidList.push_back(tmp);
    174     }
    175     pScanParam->ssidList = ssidList;
    176     ScanFilter* pScanFilter = new ScanFilter();
    177     pScanFilter->rssiThreshold = kRssiThreshold;
    178     std::vector<std::vector<uint8_t>> match_ssids{kSsid1, kSsid2};
    179     std::vector<uint8_t> security_flags{kNetworkFlags, kNetworkFlags};
    180     std::vector<NetworkInfo> preferredNetworksList;
    181     for (size_t i = 0; i < security_flags.size(); i++) {
    182         NetworkInfo nwInfo;
    183         nwInfo.ssid = match_ssids[i];
    184         nwInfo.flags = security_flags[i];
    185         preferredNetworksList.push_back(nwInfo);
    186     }
    187     const auto& result =
    188         HIDL_INVOKE(wifi_offload_, configureScans, *pScanParam, *pScanFilter);
    189     ASSERT_EQ(OffloadStatusCode::OK, result.code);
    190 }
    191 
    192 /*
    193  * Verify that getScanStats returns without any errors
    194  */
    195 TEST_F(WifiOffloadHidlTest, getScanStats) {
    196     const auto& result = HIDL_INVOKE(wifi_offload_, getScanStats);
    197     OffloadStatus status = result.first;
    198     ASSERT_EQ(OffloadStatusCode::OK, status.code);
    199 }
    200 
    201 /*
    202  * Verify that onScanResult callback is invoked
    203  */
    204 TEST_F(WifiOffloadHidlTest, getScanResults) {
    205     wifi_offload_->setEventCallback(wifi_offload_cb_);
    206     std::vector<ScanResult> scan_results;
    207     std::vector<uint8_t> ssid(kSsid1, kSsid1 + sizeof(kSsid1));
    208     ScanResult scan_result;
    209     scan_result.tsf = kTsf;
    210     scan_result.rssi = kRssi;
    211     scan_result.frequency = kFrequency;
    212     scan_result.capability = kCapability;
    213     memcpy(&scan_result.bssid[0], &kBssid[0], kBssidSize);
    214     scan_result.networkInfo.ssid = ssid;
    215     scan_result.networkInfo.flags = kNetworkFlags;
    216     scan_results.push_back(scan_result);
    217     wifi_offload_cb_->onScanResult(scan_results);
    218     auto res =
    219         wifi_offload_cb_->WaitForCallback(kOffloadCallbackSendScanResult);
    220     ASSERT_EQ(true, res.no_timeout);
    221 }
    222 
    223 /*
    224  * Verify that onError callback is invoked
    225  */
    226 TEST_F(WifiOffloadHidlTest, getError) {
    227     wifi_offload_->setEventCallback(wifi_offload_cb_);
    228     OffloadStatus status = {OffloadStatusCode::ERROR, ""};
    229     wifi_offload_cb_->onError(status);
    230     auto res = wifi_offload_cb_->WaitForCallback(kOffloadCallbackSendError);
    231     ASSERT_EQ(true, res.no_timeout);
    232 }
    233 
    234 int main(int argc, char** argv) {
    235     ::testing::AddGlobalTestEnvironment(WifiOffloadHidlEnvironment::Instance());
    236     ::testing::InitGoogleTest(&argc, argv);
    237     WifiOffloadHidlEnvironment::Instance()->init(&argc, argv);
    238     int status = RUN_ALL_TESTS();
    239     LOG(INFO) << "Test result = " << status;
    240 
    241     return status;
    242 }
    243