blob: 65ffa7b59ef4d1ca1df95ac48b23f50c5eaa09b9 [file] [log] [blame]
Chris Yed13f7b52021-06-24 12:52:55 -07001/*
2 * Copyright (C) 2021 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 */
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000016#include <aidl/android/hardware/wifi/IWifi.h>
Chris Ye02c7bb32022-01-13 12:13:48 -080017
Chris Yed13f7b52021-06-24 12:52:55 -070018#include <VtsCoreUtil.h>
Chris Yed13f7b52021-06-24 12:52:55 -070019#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
Gabriel Birenb3eb5042021-11-03 19:40:44 +000021#include <aidl/android/hardware/wifi/hostapd/BnHostapd.h>
22#include <aidl/android/hardware/wifi/hostapd/BnHostapdCallback.h>
23#include <android/binder_manager.h>
Chris Yed13f7b52021-06-24 12:52:55 -070024#include <binder/IServiceManager.h>
25#include <binder/ProcessState.h>
26
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000027#include "wifi_aidl_test_utils.h"
28
29using aidl::android::hardware::wifi::IWifi;
30using aidl::android::hardware::wifi::IWifiApIface;
Gabriel Birenb3eb5042021-11-03 19:40:44 +000031using aidl::android::hardware::wifi::hostapd::BandMask;
32using aidl::android::hardware::wifi::hostapd::BnHostapdCallback;
Chris Yec04af1c2022-03-28 18:42:23 -070033using aidl::android::hardware::wifi::hostapd::ChannelBandwidth;
Gabriel Birenb3eb5042021-11-03 19:40:44 +000034using aidl::android::hardware::wifi::hostapd::ChannelParams;
35using aidl::android::hardware::wifi::hostapd::DebugLevel;
36using aidl::android::hardware::wifi::hostapd::EncryptionType;
37using aidl::android::hardware::wifi::hostapd::FrequencyRange;
38using aidl::android::hardware::wifi::hostapd::Ieee80211ReasonCode;
39using aidl::android::hardware::wifi::hostapd::IfaceParams;
40using aidl::android::hardware::wifi::hostapd::IHostapd;
41using aidl::android::hardware::wifi::hostapd::NetworkParams;
Chris Yed13f7b52021-06-24 12:52:55 -070042using android::ProcessState;
Chris Yed13f7b52021-06-24 12:52:55 -070043
44namespace {
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000045const std::string kWifiInstanceNameStr = std::string() + IWifi::descriptor + "/default";
46const char* kWifiInstanceName = kWifiInstanceNameStr.c_str();
Chris Yed13f7b52021-06-24 12:52:55 -070047const unsigned char kNwSsid[] = {'t', 'e', 's', 't', '1', '2', '3', '4', '5'};
Gabriel Birenb3eb5042021-11-03 19:40:44 +000048const std::string kPassphrase = "test12345";
49const std::string kInvalidMinPassphrase = "test";
50const std::string kInvalidMaxPassphrase =
51 "0123456789012345678901234567890123456789012345678901234567890123456789";
Chris Yed13f7b52021-06-24 12:52:55 -070052const int kIfaceChannel = 6;
53const int kIfaceInvalidChannel = 567;
54const std::vector<uint8_t> kTestZeroMacAddr(6, 0x0);
55const Ieee80211ReasonCode kTestDisconnectReasonCode =
56 Ieee80211ReasonCode::WLAN_REASON_UNSPECIFIED;
57
58inline BandMask operator|(BandMask a, BandMask b) {
59 return static_cast<BandMask>(static_cast<int32_t>(a) |
60 static_cast<int32_t>(b));
61}
62} // namespace
63
64class HostapdAidl : public testing::TestWithParam<std::string> {
65 public:
66 virtual void SetUp() override {
Gabriel Birenb3eb5042021-11-03 19:40:44 +000067 hostapd = IHostapd::fromBinder(ndk::SpAIBinder(
68 AServiceManager_waitForService(GetParam().c_str())));
Chris Yed13f7b52021-06-24 12:52:55 -070069 ASSERT_NE(hostapd, nullptr);
70 EXPECT_TRUE(hostapd->setDebugParams(DebugLevel::EXCESSIVE).isOk());
71 isAcsSupport = testing::checkSubstringInCommandOutput(
72 "/system/bin/cmd wifi get-softap-supported-features",
73 "wifi_softap_acs_supported");
74 isWpa3SaeSupport = testing::checkSubstringInCommandOutput(
75 "/system/bin/cmd wifi get-softap-supported-features",
76 "wifi_softap_wpa3_sae_supported");
77 isBridgedSupport = testing::checkSubstringInCommandOutput(
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000078 "/system/bin/cmd wifi get-softap-supported-features",
79 "wifi_softap_bridged_ap_supported");
Chris Yed13f7b52021-06-24 12:52:55 -070080 }
81
82 virtual void TearDown() override {
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000083 if (getWifi(kWifiInstanceName) != nullptr) {
84 stopWifiService(kWifiInstanceName);
Chris Ye02c7bb32022-01-13 12:13:48 -080085 }
Chris Yed13f7b52021-06-24 12:52:55 -070086 hostapd->terminate();
87 // Wait 3 seconds to allow terminate to complete
88 sleep(3);
89 }
90
Gabriel Birenb3eb5042021-11-03 19:40:44 +000091 std::shared_ptr<IHostapd> hostapd;
Chris Yed13f7b52021-06-24 12:52:55 -070092 bool isAcsSupport;
93 bool isWpa3SaeSupport;
94 bool isBridgedSupport;
95
Chris Ye02c7bb32022-01-13 12:13:48 -080096 std::string setupApIfaceAndGetName(bool isBridged) {
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000097 std::shared_ptr<IWifiApIface> wifi_ap_iface;
Chris Ye02c7bb32022-01-13 12:13:48 -080098 if (isBridged) {
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +000099 wifi_ap_iface = getBridgedWifiApIface(kWifiInstanceName);
Chris Ye02c7bb32022-01-13 12:13:48 -0800100 } else {
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +0000101 wifi_ap_iface = getWifiApIface(kWifiInstanceName);
Chris Ye02c7bb32022-01-13 12:13:48 -0800102 }
103 EXPECT_NE(nullptr, wifi_ap_iface.get());
104
Gabriel Birenfc6bd8c2022-11-04 21:45:53 +0000105 std::string ap_iface_name;
106 auto status = wifi_ap_iface->getName(&ap_iface_name);
107 EXPECT_TRUE(status.isOk());
108 return ap_iface_name;
Chris Ye02c7bb32022-01-13 12:13:48 -0800109 }
110
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000111 IfaceParams getIfaceParamsWithoutAcs(std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700112 IfaceParams iface_params;
113 ChannelParams channelParams;
114 std::vector<ChannelParams> vec_channelParams;
115
116 iface_params.name = iface_name;
117 iface_params.hwModeParams.enable80211N = true;
118 iface_params.hwModeParams.enable80211AC = false;
119 iface_params.hwModeParams.enable80211AX = false;
120 iface_params.hwModeParams.enable6GhzBand = false;
Chris Yec04af1c2022-03-28 18:42:23 -0700121 iface_params.hwModeParams.maximumChannelBandwidth = ChannelBandwidth::BANDWIDTH_20;
Chris Yed13f7b52021-06-24 12:52:55 -0700122
123 channelParams.enableAcs = false;
124 channelParams.acsShouldExcludeDfs = false;
125 channelParams.channel = kIfaceChannel;
126 channelParams.bandMask = BandMask::BAND_2_GHZ;
127
128 vec_channelParams.push_back(channelParams);
129 iface_params.channelParams = vec_channelParams;
130 return iface_params;
131 }
132
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000133 IfaceParams getIfaceParamsWithBridgedModeACS(std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700134 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
135 iface_params.channelParams[0].enableAcs = true;
136 iface_params.channelParams[0].acsShouldExcludeDfs = true;
137
138 std::vector<ChannelParams> vec_channelParams;
139 vec_channelParams.push_back(iface_params.channelParams[0]);
140
141 ChannelParams second_channelParams;
142 second_channelParams.channel = 0;
143 second_channelParams.enableAcs = true;
144 second_channelParams.bandMask = BandMask::BAND_5_GHZ;
145 vec_channelParams.push_back(second_channelParams);
146
147 iface_params.channelParams = vec_channelParams;
148 return iface_params;
149 }
150
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000151 IfaceParams getIfaceParamsWithAcs(std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700152 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
153 iface_params.channelParams[0].enableAcs = true;
154 iface_params.channelParams[0].acsShouldExcludeDfs = true;
155 iface_params.channelParams[0].channel = 0;
156 iface_params.channelParams[0].bandMask =
157 iface_params.channelParams[0].bandMask | BandMask::BAND_5_GHZ;
158 return iface_params;
159 }
160
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000161 IfaceParams getIfaceParamsWithAcsAndFreqRange(std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700162 IfaceParams iface_params = getIfaceParamsWithAcs(iface_name);
163 FrequencyRange freqRange;
164 freqRange.startMhz = 2412;
165 freqRange.endMhz = 2462;
166 std::vector<FrequencyRange> vec_FrequencyRange;
167 vec_FrequencyRange.push_back(freqRange);
168 iface_params.channelParams[0].acsChannelFreqRangesMhz =
169 vec_FrequencyRange;
170 return iface_params;
171 }
172
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000173 IfaceParams getIfaceParamsWithAcsAndInvalidFreqRange(
174 std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700175 IfaceParams iface_params =
176 getIfaceParamsWithAcsAndFreqRange(iface_name);
177 iface_params.channelParams[0].acsChannelFreqRangesMhz[0].startMhz =
178 222;
179 iface_params.channelParams[0].acsChannelFreqRangesMhz[0].endMhz =
180 999;
181 return iface_params;
182 }
183
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000184 IfaceParams getIfaceParamsWithInvalidChannel(std::string iface_name) {
Chris Yed13f7b52021-06-24 12:52:55 -0700185 IfaceParams iface_params = getIfaceParamsWithoutAcs(iface_name);
186 iface_params.channelParams[0].channel = kIfaceInvalidChannel;
187 return iface_params;
188 }
189
190 NetworkParams getOpenNwParams() {
191 NetworkParams nw_params;
192 nw_params.ssid =
193 std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
194 nw_params.isHidden = false;
195 nw_params.encryptionType = EncryptionType::NONE;
196 nw_params.isMetered = true;
197 return nw_params;
198 }
199
200 NetworkParams getPskNwParamsWithNonMetered() {
201 NetworkParams nw_params = getOpenNwParams();
202 nw_params.encryptionType = EncryptionType::WPA2;
203 nw_params.passphrase = kPassphrase;
204 nw_params.isMetered = false;
205 return nw_params;
206 }
207
208 NetworkParams getPskNwParams() {
209 NetworkParams nw_params = getOpenNwParams();
210 nw_params.encryptionType = EncryptionType::WPA2;
211 nw_params.passphrase = kPassphrase;
212 return nw_params;
213 }
214
215 NetworkParams getInvalidPskNwParams() {
216 NetworkParams nw_params = getOpenNwParams();
217 nw_params.encryptionType = EncryptionType::WPA2;
218 nw_params.passphrase = kInvalidMaxPassphrase;
219 return nw_params;
220 }
221
222 NetworkParams getSaeTransitionNwParams() {
223 NetworkParams nw_params = getOpenNwParams();
224 nw_params.encryptionType = EncryptionType::WPA3_SAE_TRANSITION;
225 nw_params.passphrase = kPassphrase;
226 return nw_params;
227 }
228
229 NetworkParams getInvalidSaeTransitionNwParams() {
230 NetworkParams nw_params = getOpenNwParams();
231 nw_params.encryptionType = EncryptionType::WPA2;
232 nw_params.passphrase = kInvalidMinPassphrase;
233 return nw_params;
234 }
235
236 NetworkParams getSaeNwParams() {
237 NetworkParams nw_params = getOpenNwParams();
238 nw_params.encryptionType = EncryptionType::WPA3_SAE;
239 nw_params.passphrase = kPassphrase;
240 return nw_params;
241 }
242
243 NetworkParams getInvalidSaeNwParams() {
244 NetworkParams nw_params = getOpenNwParams();
245 nw_params.encryptionType = EncryptionType::WPA3_SAE;
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000246 nw_params.passphrase = "";
Chris Yed13f7b52021-06-24 12:52:55 -0700247 return nw_params;
248 }
249};
250
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000251class HostapdCallback : public BnHostapdCallback {
252 public:
253 HostapdCallback() = default;
254 ::ndk::ScopedAStatus onApInstanceInfoChanged(
255 const ::aidl::android::hardware::wifi::hostapd::ApInfo &) override {
256 return ndk::ScopedAStatus::ok();
257 }
258 ::ndk::ScopedAStatus onConnectedClientsChanged(
259 const ::aidl::android::hardware::wifi::hostapd::ClientInfo &) override {
260 return ndk::ScopedAStatus::ok();
261 }
Les Lee6645e9e2021-10-29 16:04:23 +0800262 ::ndk::ScopedAStatus onFailure(const std::string&, const std::string&) override {
Gabriel Birenb3eb5042021-11-03 19:40:44 +0000263 return ndk::ScopedAStatus::ok();
264 }
265};
266
267/**
268 * Register callback
269 */
270TEST_P(HostapdAidl, RegisterCallback) {
271 std::shared_ptr<HostapdCallback> callback =
272 ndk::SharedRefBase::make<HostapdCallback>();
273 ASSERT_NE(callback, nullptr);
274 EXPECT_TRUE(hostapd->registerCallback(callback).isOk());
275}
276
Chris Yed13f7b52021-06-24 12:52:55 -0700277/**
278 * Adds an access point with PSK network config & ACS enabled.
279 * Access point creation should pass.
280 */
281TEST_P(HostapdAidl, AddPskAccessPointWithAcs) {
282 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
Chris Yec04af1c2022-03-28 18:42:23 -0700283 std::string ifname = setupApIfaceAndGetName(false);
284 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700285 EXPECT_TRUE(status.isOk());
286}
287
288/**
289 * Adds an access point with PSK network config, ACS enabled & frequency Range.
290 * Access point creation should pass.
291 */
292TEST_P(HostapdAidl, AddPskAccessPointWithAcsAndFreqRange) {
293 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
Chris Yec04af1c2022-03-28 18:42:23 -0700294 std::string ifname = setupApIfaceAndGetName(false);
295 auto status =
296 hostapd->addAccessPoint(getIfaceParamsWithAcsAndFreqRange(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700297 EXPECT_TRUE(status.isOk());
298}
299
300/**
301 * Adds an access point with invalid channel range.
302 * Access point creation should fail.
303 */
304TEST_P(HostapdAidl, AddPskAccessPointWithAcsAndInvalidFreqRange) {
305 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
Chris Yec04af1c2022-03-28 18:42:23 -0700306 std::string ifname = setupApIfaceAndGetName(false);
307 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcsAndInvalidFreqRange(ifname),
308 getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700309 EXPECT_FALSE(status.isOk());
310}
311
312/**
313 * Adds an access point with Open network config & ACS enabled.
314 * Access point creation should pass.
315 */
316TEST_P(HostapdAidl, AddOpenAccessPointWithAcs) {
317 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
Chris Yec04af1c2022-03-28 18:42:23 -0700318 std::string ifname = setupApIfaceAndGetName(false);
319 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(ifname), getOpenNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700320 EXPECT_TRUE(status.isOk());
321}
322
323/**
324 * Adds an access point with PSK network config & ACS disabled.
325 * Access point creation should pass.
326 */
327TEST_P(HostapdAidl, AddPskAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700328 std::string ifname = setupApIfaceAndGetName(false);
329 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700330 EXPECT_TRUE(status.isOk());
331}
332
333/**
334 * Adds an access point with PSK network config, ACS disabled & Non metered.
335 * Access point creation should pass.
336 */
337TEST_P(HostapdAidl, AddPskAccessPointWithoutAcsAndNonMetered) {
Chris Yec04af1c2022-03-28 18:42:23 -0700338 std::string ifname = setupApIfaceAndGetName(false);
339 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname),
Chris Yed13f7b52021-06-24 12:52:55 -0700340 getPskNwParamsWithNonMetered());
341 EXPECT_TRUE(status.isOk());
342}
343
344/**
345 * Adds an access point with Open network config & ACS disabled.
346 * Access point creation should pass.
347 */
348TEST_P(HostapdAidl, AddOpenAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700349 std::string ifname = setupApIfaceAndGetName(false);
350 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getOpenNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700351 EXPECT_TRUE(status.isOk());
352}
353
354/**
355 * Adds an access point with SAE Transition network config & ACS disabled.
356 * Access point creation should pass.
357 */
358TEST_P(HostapdAidl, AddSaeTransitionAccessPointWithoutAcs) {
359 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
Chris Yec04af1c2022-03-28 18:42:23 -0700360 std::string ifname = setupApIfaceAndGetName(false);
361 auto status =
362 hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getSaeTransitionNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700363 EXPECT_TRUE(status.isOk());
364}
365
366/**
367 * Adds an access point with SAE network config & ACS disabled.
368 * Access point creation should pass.
369 */
370TEST_P(HostapdAidl, AddSAEAccessPointWithoutAcs) {
371 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
Chris Yec04af1c2022-03-28 18:42:23 -0700372 std::string ifname = setupApIfaceAndGetName(false);
373 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getSaeNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700374 EXPECT_TRUE(status.isOk());
375}
376
377/**
378 * Adds & then removes an access point with PSK network config & ACS enabled.
379 * Access point creation & removal should pass.
380 */
381TEST_P(HostapdAidl, RemoveAccessPointWithAcs) {
382 if (!isAcsSupport) GTEST_SKIP() << "Missing ACS support";
Chris Yec04af1c2022-03-28 18:42:23 -0700383 std::string ifname = setupApIfaceAndGetName(false);
384 auto status = hostapd->addAccessPoint(getIfaceParamsWithAcs(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700385 EXPECT_TRUE(status.isOk());
Chris Yec04af1c2022-03-28 18:42:23 -0700386 EXPECT_TRUE(hostapd->removeAccessPoint(ifname).isOk());
Chris Yed13f7b52021-06-24 12:52:55 -0700387}
388
389/**
390 * Adds & then removes an access point with PSK network config & ACS disabled.
391 * Access point creation & removal should pass.
392 */
393TEST_P(HostapdAidl, RemoveAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700394 std::string ifname = setupApIfaceAndGetName(false);
395 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700396 EXPECT_TRUE(status.isOk());
Chris Yec04af1c2022-03-28 18:42:23 -0700397 EXPECT_TRUE(hostapd->removeAccessPoint(ifname).isOk());
Chris Yed13f7b52021-06-24 12:52:55 -0700398}
399
400/**
401 * Adds an access point with invalid channel.
402 * Access point creation should fail.
403 */
404TEST_P(HostapdAidl, AddPskAccessPointWithInvalidChannel) {
Chris Yec04af1c2022-03-28 18:42:23 -0700405 std::string ifname = setupApIfaceAndGetName(false);
406 auto status =
407 hostapd->addAccessPoint(getIfaceParamsWithInvalidChannel(ifname), getPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700408 EXPECT_FALSE(status.isOk());
409}
410
411/**
412 * Adds an access point with invalid PSK network config.
413 * Access point creation should fail.
414 */
415TEST_P(HostapdAidl, AddInvalidPskAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700416 std::string ifname = setupApIfaceAndGetName(false);
417 auto status =
418 hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getInvalidPskNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700419 EXPECT_FALSE(status.isOk());
420}
421
422/**
423 * Adds an access point with invalid SAE transition network config.
424 * Access point creation should fail.
425 */
426TEST_P(HostapdAidl, AddInvalidSaeTransitionAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700427 std::string ifname = setupApIfaceAndGetName(false);
Chris Yed13f7b52021-06-24 12:52:55 -0700428 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
Chris Yec04af1c2022-03-28 18:42:23 -0700429 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname),
Chris Yed13f7b52021-06-24 12:52:55 -0700430 getInvalidSaeTransitionNwParams());
431 EXPECT_FALSE(status.isOk());
432}
433
434/**
435 * Adds an access point with invalid SAE network config.
436 * Access point creation should fail.
437 */
438TEST_P(HostapdAidl, AddInvalidSaeAccessPointWithoutAcs) {
Chris Yec04af1c2022-03-28 18:42:23 -0700439 std::string ifname = setupApIfaceAndGetName(false);
Chris Yed13f7b52021-06-24 12:52:55 -0700440 if (!isWpa3SaeSupport) GTEST_SKIP() << "Missing SAE support";
Chris Yec04af1c2022-03-28 18:42:23 -0700441 auto status =
442 hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getInvalidSaeNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700443 EXPECT_FALSE(status.isOk());
444}
445
446/**
447 * forceClientDisconnect should fail when hotspot interface available.
448 */
449TEST_P(HostapdAidl, DisconnectClientWhenIfacAvailable) {
Chris Yec04af1c2022-03-28 18:42:23 -0700450 std::string ifname = setupApIfaceAndGetName(false);
451 auto status = hostapd->addAccessPoint(getIfaceParamsWithoutAcs(ifname), getOpenNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700452 EXPECT_TRUE(status.isOk());
453
Chris Yec04af1c2022-03-28 18:42:23 -0700454 status = hostapd->forceClientDisconnect(ifname, kTestZeroMacAddr, kTestDisconnectReasonCode);
Chris Yed13f7b52021-06-24 12:52:55 -0700455 EXPECT_FALSE(status.isOk());
456}
457
458/**
459 * AddAccessPointWithDualBandConfig should pass
460 */
461TEST_P(HostapdAidl, AddAccessPointWithDualBandConfig) {
462 if (!isBridgedSupport) GTEST_SKIP() << "Missing Bridged AP support";
Chris Ye02c7bb32022-01-13 12:13:48 -0800463 std::string ifname = setupApIfaceAndGetName(true);
464 auto status =
465 hostapd->addAccessPoint(getIfaceParamsWithBridgedModeACS(ifname), getOpenNwParams());
Chris Yed13f7b52021-06-24 12:52:55 -0700466 EXPECT_TRUE(status.isOk());
467}
468
Gabriel Biren962d5df2022-01-12 23:15:17 +0000469GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(HostapdAidl);
Chris Yed13f7b52021-06-24 12:52:55 -0700470INSTANTIATE_TEST_SUITE_P(
471 Hostapd, HostapdAidl,
472 testing::ValuesIn(android::getAidlHalInstanceNames(IHostapd::descriptor)),
473 android::PrintInstanceNameToString);
474
475int main(int argc, char **argv) {
476 ::testing::InitGoogleTest(&argc, argv);
477 ProcessState::self()->setThreadPoolMaxThreadCount(1);
478 ProcessState::self()->startThreadPool();
479 return RUN_ALL_TESTS();
480}