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