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 #include <cutils/properties.h>
     19 
     20 #include <VtsHalHidlTargetTestBase.h>
     21 
     22 #include <android/hardware/wifi/hostapd/1.0/IHostapd.h>
     23 
     24 #include "hostapd_hidl_call_util.h"
     25 #include "hostapd_hidl_test_utils.h"
     26 
     27 using ::android::sp;
     28 using ::android::hardware::hidl_vec;
     29 using ::android::hardware::wifi::hostapd::V1_0::IHostapd;
     30 using ::android::hardware::wifi::hostapd::V1_0::HostapdStatus;
     31 using ::android::hardware::wifi::hostapd::V1_0::HostapdStatusCode;
     32 
     33 namespace {
     34 constexpr unsigned char kNwSsid[] = {'t', 'e', 's', 't', '1',
     35                                      '2', '3', '4', '5'};
     36 constexpr char kNwPassphrase[] = "test12345";
     37 constexpr int kIfaceChannel = 6;
     38 constexpr int kIfaceInvalidChannel = 567;
     39 }  // namespace
     40 
     41 class HostapdHidlTest : public ::testing::VtsHalHidlTargetTestBase {
     42    public:
     43     virtual void SetUp() override {
     44         startHostapdAndWaitForHidlService();
     45         hostapd_ = getHostapd();
     46         ASSERT_NE(hostapd_.get(), nullptr);
     47     }
     48 
     49     virtual void TearDown() override { stopHostapd(); }
     50 
     51    protected:
     52     std::string getPrimaryWlanIfaceName() {
     53         std::array<char, PROPERTY_VALUE_MAX> buffer;
     54         property_get("wifi.interface", buffer.data(), "wlan0");
     55         return buffer.data();
     56     }
     57 
     58     IHostapd::IfaceParams getIfaceParamsWithAcs() {
     59         IHostapd::IfaceParams iface_params;
     60         iface_params.ifaceName = getPrimaryWlanIfaceName();
     61         iface_params.hwModeParams.enable80211N = true;
     62         iface_params.hwModeParams.enable80211AC = false;
     63         iface_params.channelParams.enableAcs = true;
     64         iface_params.channelParams.acsShouldExcludeDfs = true;
     65         iface_params.channelParams.channel = 0;
     66         iface_params.channelParams.band = IHostapd::Band::BAND_ANY;
     67         return iface_params;
     68     }
     69 
     70     IHostapd::IfaceParams getIfaceParamsWithoutAcs() {
     71         IHostapd::IfaceParams iface_params;
     72         iface_params.ifaceName = getPrimaryWlanIfaceName();
     73         iface_params.hwModeParams.enable80211N = true;
     74         iface_params.hwModeParams.enable80211AC = false;
     75         iface_params.channelParams.enableAcs = false;
     76         iface_params.channelParams.acsShouldExcludeDfs = false;
     77         iface_params.channelParams.channel = kIfaceChannel;
     78         iface_params.channelParams.band = IHostapd::Band::BAND_2_4_GHZ;
     79         return iface_params;
     80     }
     81 
     82     IHostapd::IfaceParams getIfaceParamsWithInvalidChannel() {
     83         IHostapd::IfaceParams iface_params;
     84         iface_params.ifaceName = getPrimaryWlanIfaceName();
     85         iface_params.hwModeParams.enable80211N = true;
     86         iface_params.hwModeParams.enable80211AC = false;
     87         iface_params.channelParams.enableAcs = false;
     88         iface_params.channelParams.acsShouldExcludeDfs = false;
     89         iface_params.channelParams.channel = kIfaceInvalidChannel;
     90         iface_params.channelParams.band = IHostapd::Band::BAND_2_4_GHZ;
     91         return iface_params;
     92     }
     93 
     94     IHostapd::NetworkParams getPskNwParams() {
     95         IHostapd::NetworkParams nw_params;
     96         nw_params.ssid =
     97             std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
     98         nw_params.isHidden = false;
     99         nw_params.encryptionType = IHostapd::EncryptionType::WPA2;
    100         nw_params.pskPassphrase = kNwPassphrase;
    101         return nw_params;
    102     }
    103 
    104     IHostapd::NetworkParams getInvalidPskNwParams() {
    105         IHostapd::NetworkParams nw_params;
    106         nw_params.ssid =
    107             std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
    108         nw_params.isHidden = false;
    109         nw_params.encryptionType = IHostapd::EncryptionType::WPA2;
    110         return nw_params;
    111     }
    112 
    113     IHostapd::NetworkParams getOpenNwParams() {
    114         IHostapd::NetworkParams nw_params;
    115         nw_params.ssid =
    116             std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
    117         nw_params.isHidden = false;
    118         nw_params.encryptionType = IHostapd::EncryptionType::NONE;
    119         return nw_params;
    120     }
    121     // IHostapd object used for all tests in this fixture.
    122     sp<IHostapd> hostapd_;
    123 };
    124 
    125 /*
    126  * Create:
    127  * Ensures that an instance of the IHostapd proxy object is
    128  * successfully created.
    129  */
    130 TEST(HostapdHidlTestNoFixture, Create) {
    131     startHostapdAndWaitForHidlService();
    132     EXPECT_NE(nullptr, getHostapd().get());
    133     stopHostapd();
    134 }
    135 
    136 /**
    137  * Adds an access point with PSK network config & ACS enabled.
    138  * Access point creation should pass.
    139  */
    140 TEST_F(HostapdHidlTest, AddPskAccessPointWithAcs) {
    141     auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
    142                               getPskNwParams());
    143     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    144 }
    145 
    146 /**
    147  * Adds an access point with Open network config & ACS enabled.
    148  * Access point creation should pass.
    149  */
    150 TEST_F(HostapdHidlTest, AddOpenAccessPointWithAcs) {
    151     auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
    152                               getOpenNwParams());
    153     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    154 }
    155 
    156 /**
    157  * Adds an access point with PSK network config & ACS disabled.
    158  * Access point creation should pass.
    159  */
    160 TEST_F(HostapdHidlTest, AddPskAccessPointWithoutAcs) {
    161     auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
    162                               getIfaceParamsWithoutAcs(), getPskNwParams());
    163     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    164 }
    165 
    166 /**
    167  * Adds an access point with Open network config & ACS disabled.
    168  * Access point creation should pass.
    169  */
    170 TEST_F(HostapdHidlTest, AddOpenAccessPointWithoutAcs) {
    171     auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
    172                               getIfaceParamsWithoutAcs(), getOpenNwParams());
    173     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    174 }
    175 
    176 /**
    177  * Adds & then removes an access point with PSK network config & ACS enabled.
    178  * Access point creation & removal should pass.
    179  */
    180 TEST_F(HostapdHidlTest, RemoveAccessPointWithAcs) {
    181     auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
    182                               getPskNwParams());
    183     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    184     status =
    185         HIDL_INVOKE(hostapd_, removeAccessPoint, getPrimaryWlanIfaceName());
    186     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    187 }
    188 
    189 /**
    190  * Adds & then removes an access point with PSK network config & ACS disabled.
    191  * Access point creation & removal should pass.
    192  */
    193 TEST_F(HostapdHidlTest, RemoveAccessPointWithoutAcs) {
    194     auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
    195                               getIfaceParamsWithoutAcs(), getPskNwParams());
    196     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    197     status =
    198         HIDL_INVOKE(hostapd_, removeAccessPoint, getPrimaryWlanIfaceName());
    199     EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
    200 }
    201 
    202 /**
    203  * Adds an access point with invalid channel.
    204  * Access point creation should fail.
    205  */
    206 TEST_F(HostapdHidlTest, AddPskAccessPointWithInvalidChannel) {
    207     auto status =
    208         HIDL_INVOKE(hostapd_, addAccessPoint,
    209                     getIfaceParamsWithInvalidChannel(), getPskNwParams());
    210     EXPECT_NE(HostapdStatusCode::SUCCESS, status.code);
    211 }
    212 
    213 /**
    214  * Adds an access point with invalid PSK network config.
    215  * Access point creation should fail.
    216  */
    217 TEST_F(HostapdHidlTest, AddInvalidPskAccessPointWithoutAcs) {
    218     auto status =
    219         HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithoutAcs(),
    220                     getInvalidPskNwParams());
    221     EXPECT_NE(HostapdStatusCode::SUCCESS, status.code);
    222 }
    223 
    224 /*
    225  * Terminate
    226  * This terminates the service.
    227  */
    228 TEST_F(HostapdHidlTest, Terminate) {
    229     hostapd_->terminate();
    230 }
    231