1 /*
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 */
16
17 #include <VtsCoreUtil.h>
18 #include <aidl/Gtest.h>
19 #include <aidl/Vintf.h>
20 #include <aidl/android/hardware/wifi/supplicant/BnSupplicant.h>
21 #include <aidl/android/hardware/wifi/supplicant/BnSupplicantStaIfaceCallback.h>
22 #include <android/binder_manager.h>
23 #include <android/binder_status.h>
24 #include <binder/IServiceManager.h>
25 #include <binder/ProcessState.h>
26 #include <cutils/properties.h>
27
28 #include "supplicant_test_utils.h"
29
30 using aidl::android::hardware::wifi::supplicant::AnqpInfoId;
31 using aidl::android::hardware::wifi::supplicant::BnSupplicantStaIfaceCallback;
32 using aidl::android::hardware::wifi::supplicant::BtCoexistenceMode;
33 using aidl::android::hardware::wifi::supplicant::ConnectionCapabilities;
34 using aidl::android::hardware::wifi::supplicant::DebugLevel;
35 using aidl::android::hardware::wifi::supplicant::DppAkm;
36 using aidl::android::hardware::wifi::supplicant::DppConnectionKeys;
37 using aidl::android::hardware::wifi::supplicant::DppCurve;
38 using aidl::android::hardware::wifi::supplicant::DppNetRole;
39 using aidl::android::hardware::wifi::supplicant::DppResponderBootstrapInfo;
40 using aidl::android::hardware::wifi::supplicant::Hs20AnqpSubtypes;
41 using aidl::android::hardware::wifi::supplicant::IfaceType;
42 using aidl::android::hardware::wifi::supplicant::ISupplicant;
43 using aidl::android::hardware::wifi::supplicant::ISupplicantStaIface;
44 using aidl::android::hardware::wifi::supplicant::ISupplicantStaNetwork;
45 using aidl::android::hardware::wifi::supplicant::KeyMgmtMask;
46 using aidl::android::hardware::wifi::supplicant::MloLinksInfo;
47 using aidl::android::hardware::wifi::supplicant::MscsParams;
48 using aidl::android::hardware::wifi::supplicant::QosCharacteristics;
49 using aidl::android::hardware::wifi::supplicant::QosPolicyScsData;
50 using aidl::android::hardware::wifi::supplicant::QosPolicyScsRequestStatus;
51 using aidl::android::hardware::wifi::supplicant::SignalPollResult;
52 using aidl::android::hardware::wifi::supplicant::UsdBaseConfig;
53 using aidl::android::hardware::wifi::supplicant::UsdCapabilities;
54 using aidl::android::hardware::wifi::supplicant::UsdMessageInfo;
55 using aidl::android::hardware::wifi::supplicant::UsdPublishConfig;
56 using aidl::android::hardware::wifi::supplicant::UsdServiceDiscoveryInfo;
57 using aidl::android::hardware::wifi::supplicant::UsdSubscribeConfig;
58 using aidl::android::hardware::wifi::supplicant::UsdTerminateReasonCode;
59 using aidl::android::hardware::wifi::supplicant::WpaDriverCapabilitiesMask;
60 using aidl::android::hardware::wifi::supplicant::WpsConfigMethods;
61 using android::ProcessState;
62
63 static constexpr int TIMEOUT_PERIOD = 60;
64 class IfaceDppCallback;
65
66 namespace {
67 const std::vector<uint8_t> kTestMacAddr = {0x56, 0x67, 0x67, 0xf4, 0x56, 0x92};
68 const std::string kTestUri =
69 "DPP:C:81/1,117/"
70 "40;M:48d6d5bd1de1;I:G1197843;K:MDkwEwYHKoZIzj0CAQYIKoZIzj"
71 "0DAQcDIgAD0edY4X3N//HhMFYsZfMbQJTiNFtNIWF/cIwMB/gzqOM=;;";
72 } // namespace
73
74 class SupplicantStaIfaceCallback : public BnSupplicantStaIfaceCallback {
75 public:
76 SupplicantStaIfaceCallback() = default;
77
onAnqpQueryDone(const std::vector<uint8_t> &,const::aidl::android::hardware::wifi::supplicant::AnqpData &,const::aidl::android::hardware::wifi::supplicant::Hs20AnqpData &)78 ::ndk::ScopedAStatus onAnqpQueryDone(
79 const std::vector<uint8_t>& /* bssid */,
80 const ::aidl::android::hardware::wifi::supplicant::AnqpData& /* data */,
81 const ::aidl::android::hardware::wifi::supplicant::
82 Hs20AnqpData& /* hs20Data */) override {
83 return ndk::ScopedAStatus::ok();
84 }
onAssociationRejected(const::aidl::android::hardware::wifi::supplicant::AssociationRejectionData &)85 ::ndk::ScopedAStatus onAssociationRejected(
86 const ::aidl::android::hardware::wifi::supplicant::
87 AssociationRejectionData& /* assocRejectData */) override {
88 return ndk::ScopedAStatus::ok();
89 }
onAuthenticationTimeout(const std::vector<uint8_t> &)90 ::ndk::ScopedAStatus onAuthenticationTimeout(
91 const std::vector<uint8_t>& /* bssid */) override {
92 return ndk::ScopedAStatus::ok();
93 }
onAuxiliarySupplicantEvent(::aidl::android::hardware::wifi::supplicant::AuxiliarySupplicantEventCode,const std::vector<uint8_t> &,const std::string &)94 ::ndk::ScopedAStatus onAuxiliarySupplicantEvent(
95 ::aidl::android::hardware::wifi::supplicant ::
96 AuxiliarySupplicantEventCode /* eventCode */,
97 const std::vector<uint8_t>& /* bssid */,
98 const std::string& /* reasonString */) override {
99 return ndk::ScopedAStatus::ok();
100 }
onBssTmHandlingDone(const::aidl::android::hardware::wifi::supplicant::BssTmData &)101 ::ndk::ScopedAStatus onBssTmHandlingDone(
102 const ::aidl::android::hardware::wifi::supplicant::
103 BssTmData& /* tmData */) override {
104 return ndk::ScopedAStatus::ok();
105 }
onBssidChanged(::aidl::android::hardware::wifi::supplicant::BssidChangeReason,const std::vector<uint8_t> &)106 ::ndk::ScopedAStatus onBssidChanged(
107 ::aidl::android::hardware::wifi::supplicant::
108 BssidChangeReason /* reason */,
109 const std::vector<uint8_t>& /* bssid */) override {
110 return ndk::ScopedAStatus::ok();
111 }
onDisconnected(const std::vector<uint8_t> &,bool,::aidl::android::hardware::wifi::supplicant::StaIfaceReasonCode)112 ::ndk::ScopedAStatus onDisconnected(
113 const std::vector<uint8_t>& /* bssid */, bool /* locallyGenerated */,
114 ::aidl::android::hardware::wifi::supplicant::
115 StaIfaceReasonCode /* reasonCode */) override {
116 return ndk::ScopedAStatus::ok();
117 }
onDppFailure(::aidl::android::hardware::wifi::supplicant::DppFailureCode,const std::string &,const std::string &,const std::vector<char16_t> &)118 ::ndk::ScopedAStatus onDppFailure(
119 ::aidl::android::hardware::wifi::supplicant::DppFailureCode /* code */,
120 const std::string& /* ssid */, const std::string& /* channelList */,
121 const std::vector<char16_t>& /* bandList */) override {
122 return ndk::ScopedAStatus::ok();
123 }
onDppProgress(::aidl::android::hardware::wifi::supplicant::DppProgressCode)124 ::ndk::ScopedAStatus onDppProgress(
125 ::aidl::android::hardware::wifi::supplicant::DppProgressCode /* code */)
126 override {
127 return ndk::ScopedAStatus::ok();
128 }
onDppSuccess(::aidl::android::hardware::wifi::supplicant::DppEventType)129 ::ndk::ScopedAStatus onDppSuccess(
130 ::aidl::android::hardware::wifi::supplicant::DppEventType /* type */)
131 override {
132 return ndk::ScopedAStatus::ok();
133 }
onDppSuccessConfigReceived(const std::vector<uint8_t> &,const std::string &,const std::vector<uint8_t> &,::aidl::android::hardware::wifi::supplicant::DppAkm,const::aidl::android::hardware::wifi::supplicant::DppConnectionKeys &)134 ::ndk::ScopedAStatus onDppSuccessConfigReceived(
135 const std::vector<uint8_t>& /* ssid */, const std::string& /* password */,
136 const std::vector<uint8_t>& /* psk */,
137 ::aidl::android::hardware::wifi::supplicant::DppAkm /* securityAkm */,
138 const ::aidl::android::hardware::wifi::supplicant::
139 DppConnectionKeys& /* DppConnectionKeys */) override {
140 return ndk::ScopedAStatus::ok();
141 }
onDppSuccessConfigSent()142 ::ndk::ScopedAStatus onDppSuccessConfigSent() override {
143 return ndk::ScopedAStatus::ok();
144 }
onEapFailure(const std::vector<uint8_t> &,int32_t)145 ::ndk::ScopedAStatus onEapFailure(const std::vector<uint8_t>& /* bssid */,
146 int32_t /* errorCode */) override {
147 return ndk::ScopedAStatus::ok();
148 }
onExtRadioWorkStart(int32_t)149 ::ndk::ScopedAStatus onExtRadioWorkStart(int32_t /* id */) override {
150 return ndk::ScopedAStatus::ok();
151 }
onExtRadioWorkTimeout(int32_t)152 ::ndk::ScopedAStatus onExtRadioWorkTimeout(int32_t /* id */) override {
153 return ndk::ScopedAStatus::ok();
154 }
onHs20DeauthImminentNotice(const std::vector<uint8_t> &,int32_t,int32_t,const std::string &)155 ::ndk::ScopedAStatus onHs20DeauthImminentNotice(
156 const std::vector<uint8_t>& /* bssid */, int32_t /* reasonCode */,
157 int32_t /* reAuthDelayInSec */, const std::string& /* url */) override {
158 return ndk::ScopedAStatus::ok();
159 }
onHs20IconQueryDone(const std::vector<uint8_t> &,const std::string &,const std::vector<uint8_t> &)160 ::ndk::ScopedAStatus onHs20IconQueryDone(
161 const std::vector<uint8_t>& /* bssid */,
162 const std::string& /* fileName */,
163 const std::vector<uint8_t>& /* data */) override {
164 return ndk::ScopedAStatus::ok();
165 }
onHs20SubscriptionRemediation(const std::vector<uint8_t> &,::aidl::android::hardware::wifi::supplicant::OsuMethod,const std::string &)166 ::ndk::ScopedAStatus onHs20SubscriptionRemediation(
167 const std::vector<uint8_t>& /* bssid */,
168 ::aidl::android::hardware::wifi::supplicant::OsuMethod /* osuMethod */,
169 const std::string& /* url */) override {
170 return ndk::ScopedAStatus::ok();
171 }
172 ::ndk::ScopedAStatus
onHs20TermsAndConditionsAcceptanceRequestedNotification(const std::vector<uint8_t> &,const std::string &)173 onHs20TermsAndConditionsAcceptanceRequestedNotification(
174 const std::vector<uint8_t>& /* bssid */,
175 const std::string& /* url */) override {
176 return ndk::ScopedAStatus::ok();
177 }
onNetworkAdded(int32_t)178 ::ndk::ScopedAStatus onNetworkAdded(int32_t /* id */) override {
179 return ndk::ScopedAStatus::ok();
180 }
onNetworkNotFound(const std::vector<uint8_t> &)181 ::ndk::ScopedAStatus onNetworkNotFound(
182 const std::vector<uint8_t>& /* ssid */) override {
183 return ndk::ScopedAStatus::ok();
184 }
onNetworkRemoved(int32_t)185 ::ndk::ScopedAStatus onNetworkRemoved(int32_t /* id */) override {
186 return ndk::ScopedAStatus::ok();
187 }
onPmkCacheAdded(int64_t,const std::vector<uint8_t> &)188 ::ndk::ScopedAStatus onPmkCacheAdded(
189 int64_t /* expirationTimeInSec */,
190 const std::vector<uint8_t>& /* serializedEntry */) override {
191 return ndk::ScopedAStatus::ok();
192 }
onStateChanged(::aidl::android::hardware::wifi::supplicant::StaIfaceCallbackState,const std::vector<uint8_t> &,int32_t,const std::vector<uint8_t> &,bool)193 ::ndk::ScopedAStatus onStateChanged(
194 ::aidl::android::hardware::wifi::supplicant::
195 StaIfaceCallbackState /* newState */,
196 const std::vector<uint8_t>& /* bssid */, int32_t /* id */,
197 const std::vector<uint8_t>& /* ssid */,
198 bool /* filsHlpSent */) override {
199 return ndk::ScopedAStatus::ok();
200 }
onWpsEventFail(const std::vector<uint8_t> &,::aidl::android::hardware::wifi::supplicant::WpsConfigError,::aidl::android::hardware::wifi::supplicant::WpsErrorIndication)201 ::ndk::ScopedAStatus onWpsEventFail(
202 const std::vector<uint8_t>& /* bssid */,
203 ::aidl::android::hardware::wifi::supplicant::
204 WpsConfigError /* configError */,
205 ::aidl::android::hardware::wifi::supplicant::
206 WpsErrorIndication /* errorInd */) override {
207 return ndk::ScopedAStatus::ok();
208 }
onWpsEventPbcOverlap()209 ::ndk::ScopedAStatus onWpsEventPbcOverlap() override {
210 return ndk::ScopedAStatus::ok();
211 }
onWpsEventSuccess()212 ::ndk::ScopedAStatus onWpsEventSuccess() override {
213 return ndk::ScopedAStatus::ok();
214 }
onQosPolicyReset()215 ::ndk::ScopedAStatus onQosPolicyReset() override { return ndk::ScopedAStatus::ok(); }
onQosPolicyRequest(int32_t,const std::vector<::aidl::android::hardware::wifi::supplicant::QosPolicyData> &)216 ::ndk::ScopedAStatus onQosPolicyRequest(
217 int32_t /* qosPolicyRequestId */,
218 const std::vector<::aidl::android::hardware::wifi::supplicant ::
219 QosPolicyData /* qosPolicyData */>&) override {
220 return ndk::ScopedAStatus::ok();
221 }
onSupplicantStateChanged(const::aidl::android::hardware::wifi::supplicant::SupplicantStateChangeData &)222 ::ndk::ScopedAStatus onSupplicantStateChanged(
223 const ::aidl::android::hardware::wifi::supplicant::
224 SupplicantStateChangeData& /* stateChangeData */) override {
225 return ndk::ScopedAStatus::ok();
226 }
onMloLinksInfoChanged(::aidl::android::hardware::wifi::supplicant::ISupplicantStaIfaceCallback::MloLinkInfoChangeReason)227 ::ndk::ScopedAStatus onMloLinksInfoChanged(
228 ::aidl::android::hardware::wifi::supplicant::ISupplicantStaIfaceCallback::
229 MloLinkInfoChangeReason /* reason */) override {
230 return ndk::ScopedAStatus::ok();
231 }
onDppConfigReceived(const::aidl::android::hardware::wifi::supplicant::DppConfigurationData &)232 ::ndk::ScopedAStatus onDppConfigReceived(
233 const ::aidl::android::hardware::wifi::supplicant::
234 DppConfigurationData& /* configData */) override {
235 return ndk::ScopedAStatus::ok();
236 }
onDppConnectionStatusResultSent(::aidl::android::hardware::wifi::supplicant::DppStatusErrorCode)237 ::ndk::ScopedAStatus onDppConnectionStatusResultSent(
238 ::aidl::android::hardware::wifi::supplicant::DppStatusErrorCode /* code */) override {
239 return ndk::ScopedAStatus::ok();
240 }
onBssFrequencyChanged(int32_t)241 ::ndk::ScopedAStatus onBssFrequencyChanged(int32_t /* frequencyMhz */) override {
242 return ndk::ScopedAStatus::ok();
243 }
onQosPolicyResponseForScs(const std::vector<::aidl::android::hardware::wifi::supplicant::QosPolicyScsResponseStatus> &)244 ::ndk::ScopedAStatus onQosPolicyResponseForScs(
245 const std::vector<::aidl::android::hardware::wifi::supplicant::
246 QosPolicyScsResponseStatus>& /* qosPolicyScsResponseStatus */)
247 override {
248 return ndk::ScopedAStatus::ok();
249 }
onPmkSaCacheAdded(const::aidl::android::hardware::wifi::supplicant::PmkSaCacheData &)250 ::ndk::ScopedAStatus onPmkSaCacheAdded(
251 const ::aidl::android::hardware::wifi::supplicant::PmkSaCacheData& /* pmkSaData */)
252 override {
253 return ndk::ScopedAStatus::ok();
254 }
onUsdPublishStarted(int32_t,int32_t)255 ::ndk::ScopedAStatus onUsdPublishStarted(int32_t /* cmdId */,
256 int32_t /* publishId */) override {
257 return ndk::ScopedAStatus::ok();
258 }
onUsdSubscribeStarted(int32_t,int32_t)259 ::ndk::ScopedAStatus onUsdSubscribeStarted(int32_t /* cmdId */,
260 int32_t /* subscribeId */) override {
261 return ndk::ScopedAStatus::ok();
262 }
onUsdPublishConfigFailed(int32_t,UsdConfigErrorCode)263 ::ndk::ScopedAStatus onUsdPublishConfigFailed(int32_t /* cmdId */,
264 UsdConfigErrorCode /* errorCode */) override {
265 return ndk::ScopedAStatus::ok();
266 }
onUsdSubscribeConfigFailed(int32_t,UsdConfigErrorCode)267 ::ndk::ScopedAStatus onUsdSubscribeConfigFailed(int32_t /* cmdId */,
268 UsdConfigErrorCode /* errorCode */) override {
269 return ndk::ScopedAStatus::ok();
270 }
onUsdPublishTerminated(int32_t,UsdTerminateReasonCode)271 ::ndk::ScopedAStatus onUsdPublishTerminated(int32_t /* publishId */,
272 UsdTerminateReasonCode /* reasonCode */) override {
273 return ndk::ScopedAStatus::ok();
274 }
onUsdSubscribeTerminated(int32_t,UsdTerminateReasonCode)275 ::ndk::ScopedAStatus onUsdSubscribeTerminated(
276 int32_t /* subscribeId */, UsdTerminateReasonCode /* reasonCode */) override {
277 return ndk::ScopedAStatus::ok();
278 }
onUsdPublishReplied(const UsdServiceDiscoveryInfo &)279 ::ndk::ScopedAStatus onUsdPublishReplied(const UsdServiceDiscoveryInfo& /* info */) override {
280 return ndk::ScopedAStatus::ok();
281 }
onUsdServiceDiscovered(const UsdServiceDiscoveryInfo &)282 ::ndk::ScopedAStatus onUsdServiceDiscovered(
283 const UsdServiceDiscoveryInfo& /* info */) override {
284 return ndk::ScopedAStatus::ok();
285 }
onUsdMessageReceived(const UsdMessageInfo &)286 ::ndk::ScopedAStatus onUsdMessageReceived(const UsdMessageInfo& /* messageInfo */) override {
287 return ndk::ScopedAStatus::ok();
288 }
289 };
290
291 class SupplicantStaIfaceAidlTest : public testing::TestWithParam<std::string> {
292 public:
SetUp()293 void SetUp() override {
294 initializeService();
295 supplicant_ = getSupplicant(GetParam().c_str());
296 ASSERT_NE(supplicant_, nullptr);
297 ASSERT_TRUE(supplicant_
298 ->setDebugParams(DebugLevel::EXCESSIVE,
299 true, // show timestamps
300 true)
301 .isOk());
302 ASSERT_TRUE(supplicant_->getInterfaceVersion(&interface_version_).isOk());
303 EXPECT_TRUE(supplicant_->getStaInterface(getStaIfaceName(), &sta_iface_)
304 .isOk());
305 ASSERT_NE(sta_iface_, nullptr);
306 }
307
TearDown()308 void TearDown() override {
309 stopSupplicantService();
310 startWifiFramework();
311 }
312
313 enum DppCallbackType {
314 ANY_CALLBACK = -2,
315 INVALID = -1,
316 EVENT_SUCCESS = 0,
317 EVENT_PROGRESS,
318 EVENT_FAILURE,
319 };
320
321 DppCallbackType dppCallbackType;
322 uint32_t code;
323
324 // Used as a mechanism to inform the test about data/event callback
notify()325 inline void notify() {
326 std::unique_lock<std::mutex> lock(mtx_);
327 cv_.notify_one();
328 }
329
330 // Test code calls this function to wait for data/event callback
wait(DppCallbackType waitForCallbackType)331 inline std::cv_status wait(DppCallbackType waitForCallbackType) {
332 std::unique_lock<std::mutex> lock(mtx_);
333 EXPECT_NE(INVALID, waitForCallbackType); // can't ASSERT in a
334 // non-void-returning method
335 auto now = std::chrono::system_clock::now();
336 std::cv_status status =
337 cv_.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
338 return status;
339 }
340
341 protected:
342 std::shared_ptr<ISupplicant> supplicant_;
343 std::shared_ptr<ISupplicantStaIface> sta_iface_;
344 int interface_version_;
345
346 private:
347 // synchronization objects
348 std::mutex mtx_;
349 std::condition_variable cv_;
350 };
351
352 /*
353 * RegisterCallback
354 */
TEST_P(SupplicantStaIfaceAidlTest,RegisterCallback)355 TEST_P(SupplicantStaIfaceAidlTest, RegisterCallback) {
356 std::shared_ptr<SupplicantStaIfaceCallback> callback =
357 ndk::SharedRefBase::make<SupplicantStaIfaceCallback>();
358 ASSERT_NE(callback, nullptr);
359 EXPECT_TRUE(sta_iface_->registerCallback(callback).isOk());
360 }
361
362 /*
363 * GetConnectionCapabilities
364 */
TEST_P(SupplicantStaIfaceAidlTest,GetConnectionCapabilities)365 TEST_P(SupplicantStaIfaceAidlTest, GetConnectionCapabilities) {
366 ConnectionCapabilities cap;
367 EXPECT_TRUE(sta_iface_->getConnectionCapabilities(&cap).isOk());
368 }
369
370 /*
371 * GetWpaDriverCapabilities
372 */
TEST_P(SupplicantStaIfaceAidlTest,GetWpaDriverCapabilities)373 TEST_P(SupplicantStaIfaceAidlTest, GetWpaDriverCapabilities) {
374 WpaDriverCapabilitiesMask cap;
375 EXPECT_TRUE(sta_iface_->getWpaDriverCapabilities(&cap).isOk());
376 }
377
378 /*
379 * GetKeyMgmtCapabilities
380 */
TEST_P(SupplicantStaIfaceAidlTest,GetKeyMgmtCapabilities)381 TEST_P(SupplicantStaIfaceAidlTest, GetKeyMgmtCapabilities) {
382 KeyMgmtMask cap;
383 EXPECT_TRUE(sta_iface_->getKeyMgmtCapabilities(&cap).isOk());
384
385 // Even though capabilities vary, these two are always set.
386 EXPECT_TRUE(!!(static_cast<uint32_t>(cap) &
387 static_cast<uint32_t>(KeyMgmtMask::NONE)));
388 EXPECT_TRUE(!!(static_cast<uint32_t>(cap) &
389 static_cast<uint32_t>(KeyMgmtMask::IEEE8021X)));
390 }
391
392 /*
393 * GetName
394 */
TEST_P(SupplicantStaIfaceAidlTest,GetName)395 TEST_P(SupplicantStaIfaceAidlTest, GetName) {
396 std::string name;
397 EXPECT_TRUE(sta_iface_->getName(&name).isOk());
398 EXPECT_NE(name.size(), 0);
399 }
400
401 /*
402 * GetType
403 */
TEST_P(SupplicantStaIfaceAidlTest,GetType)404 TEST_P(SupplicantStaIfaceAidlTest, GetType) {
405 IfaceType type;
406 EXPECT_TRUE(sta_iface_->getType(&type).isOk());
407 EXPECT_EQ(type, IfaceType::STA);
408 }
409
410 /*
411 * GetMacAddress
412 */
TEST_P(SupplicantStaIfaceAidlTest,GetMacAddress)413 TEST_P(SupplicantStaIfaceAidlTest, GetMacAddress) {
414 std::vector<uint8_t> macAddr;
415 EXPECT_TRUE(sta_iface_->getMacAddress(&macAddr).isOk());
416 EXPECT_EQ(macAddr.size(), 6);
417 }
418
419 /*
420 * ListNetworks
421 */
TEST_P(SupplicantStaIfaceAidlTest,ListNetworks)422 TEST_P(SupplicantStaIfaceAidlTest, ListNetworks) {
423 std::vector<int32_t> networks;
424 EXPECT_TRUE(sta_iface_->listNetworks(&networks).isOk());
425 }
426
427 /*
428 * SetBtCoexistenceMode
429 */
TEST_P(SupplicantStaIfaceAidlTest,SetBtCoexistenceMode)430 TEST_P(SupplicantStaIfaceAidlTest, SetBtCoexistenceMode) {
431 EXPECT_TRUE(
432 sta_iface_->setBtCoexistenceMode(BtCoexistenceMode::ENABLED).isOk());
433 EXPECT_TRUE(
434 sta_iface_->setBtCoexistenceMode(BtCoexistenceMode::DISABLED).isOk());
435 EXPECT_TRUE(
436 sta_iface_->setBtCoexistenceMode(BtCoexistenceMode::SENSE).isOk());
437 }
438
439 /*
440 * SetBtCoexistenceScanModeEnabled
441 */
TEST_P(SupplicantStaIfaceAidlTest,SetBtCoexistenceScanModeEnabled)442 TEST_P(SupplicantStaIfaceAidlTest, SetBtCoexistenceScanModeEnabled) {
443 EXPECT_TRUE(sta_iface_->setBtCoexistenceScanModeEnabled(true).isOk());
444 EXPECT_TRUE(sta_iface_->setBtCoexistenceScanModeEnabled(false).isOk());
445 }
446
447 /*
448 * SetSuspendModeEnabled
449 */
TEST_P(SupplicantStaIfaceAidlTest,SetSuspendModeEnabled)450 TEST_P(SupplicantStaIfaceAidlTest, SetSuspendModeEnabled) {
451 EXPECT_TRUE(sta_iface_->setSuspendModeEnabled(true).isOk());
452 EXPECT_TRUE(sta_iface_->setSuspendModeEnabled(false).isOk());
453 }
454
455 /*
456 * SetCountryCode
457 */
TEST_P(SupplicantStaIfaceAidlTest,SetCountryCode)458 TEST_P(SupplicantStaIfaceAidlTest, SetCountryCode) {
459 const std::vector<uint8_t> countryCode = {'U', 'S'};
460 EXPECT_TRUE(sta_iface_->setCountryCode(countryCode).isOk());
461 }
462
463 /*
464 * SetWpsDeviceName
465 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsDeviceName)466 TEST_P(SupplicantStaIfaceAidlTest, SetWpsDeviceName) {
467 const std::string deviceName = "TestWpsDeviceName";
468 EXPECT_TRUE(sta_iface_->setWpsDeviceName(deviceName).isOk());
469 }
470
471 /*
472 * SetWpsDeviceType
473 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsDeviceType)474 TEST_P(SupplicantStaIfaceAidlTest, SetWpsDeviceType) {
475 const std::vector<uint8_t> deviceType = {8, 0x1};
476 EXPECT_TRUE(sta_iface_->setWpsDeviceType(deviceType).isOk());
477 }
478
479 /*
480 * SetWpsManufacturer
481 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsManufacturer)482 TEST_P(SupplicantStaIfaceAidlTest, SetWpsManufacturer) {
483 const std::string wpsManufacturer = "TestManufacturer";
484 EXPECT_TRUE(sta_iface_->setWpsManufacturer(wpsManufacturer).isOk());
485 }
486
487 /*
488 * SetWpsModelName
489 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsModelName)490 TEST_P(SupplicantStaIfaceAidlTest, SetWpsModelName) {
491 const std::string modelName = "TestModelName";
492 EXPECT_TRUE(sta_iface_->setWpsModelName(modelName).isOk());
493 }
494
495 /*
496 * SetWpsModelNumber
497 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsModelNumber)498 TEST_P(SupplicantStaIfaceAidlTest, SetWpsModelNumber) {
499 const std::string modelNumber = "TestModelNumber";
500 EXPECT_TRUE(sta_iface_->setWpsModelNumber(modelNumber).isOk());
501 }
502
503 /*
504 * SetWpsSerialNumber
505 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsSerialNumber)506 TEST_P(SupplicantStaIfaceAidlTest, SetWpsSerialNumber) {
507 const std::string serialNumber = "TestSerialNumber";
508 EXPECT_TRUE(sta_iface_->setWpsSerialNumber(serialNumber).isOk());
509 }
510
511 /*
512 * SetWpsConfigMethods
513 */
TEST_P(SupplicantStaIfaceAidlTest,SetWpsConfigMethods)514 TEST_P(SupplicantStaIfaceAidlTest, SetWpsConfigMethods) {
515 const WpsConfigMethods configMethods = WpsConfigMethods::KEYPAD;
516 EXPECT_TRUE(sta_iface_->setWpsConfigMethods(configMethods).isOk());
517 }
518
519 /*
520 * SetExternalSim
521 */
TEST_P(SupplicantStaIfaceAidlTest,SetExternalSim)522 TEST_P(SupplicantStaIfaceAidlTest, SetExternalSim) {
523 EXPECT_TRUE(sta_iface_->setExternalSim(true).isOk());
524 EXPECT_TRUE(sta_iface_->setExternalSim(false).isOk());
525 }
526
527 /*
528 * SetMboCellularDataStatus
529 */
TEST_P(SupplicantStaIfaceAidlTest,SetMboCellularDataStatus)530 TEST_P(SupplicantStaIfaceAidlTest, SetMboCellularDataStatus) {
531 WpaDriverCapabilitiesMask cap;
532 EXPECT_TRUE(sta_iface_->getWpaDriverCapabilities(&cap).isOk());
533
534 // Operation should succeed if MBO is supported, or fail if it's not.
535 bool mboSupported =
536 !!(static_cast<uint32_t>(cap) &
537 static_cast<uint32_t>(WpaDriverCapabilitiesMask::MBO));
538 EXPECT_EQ(mboSupported, sta_iface_->setMboCellularDataStatus(true).isOk());
539 }
540
541 /*
542 * InitiateTdlsDiscover
543 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateTdlsDiscover)544 TEST_P(SupplicantStaIfaceAidlTest, InitiateTdlsDiscover) {
545 EXPECT_TRUE(sta_iface_->initiateTdlsDiscover(kTestMacAddr).isOk());
546 }
547
548 /*
549 * InitiateTdlsSetup
550 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateTdlsSetup)551 TEST_P(SupplicantStaIfaceAidlTest, InitiateTdlsSetup) {
552 EXPECT_TRUE(sta_iface_->initiateTdlsSetup(kTestMacAddr).isOk());
553 }
554
555 /*
556 * InitiateTdlsTeardown
557 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateTdlsTeardown)558 TEST_P(SupplicantStaIfaceAidlTest, InitiateTdlsTeardown) {
559 EXPECT_TRUE(sta_iface_->initiateTdlsTeardown(kTestMacAddr).isOk());
560 }
561
562 /*
563 * InitiateAnqpQuery
564 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateAnqpQuery)565 TEST_P(SupplicantStaIfaceAidlTest, InitiateAnqpQuery) {
566 const std::vector<AnqpInfoId> anqpIds = {
567 AnqpInfoId::VENUE_NAME, AnqpInfoId::NAI_REALM, AnqpInfoId::DOMAIN_NAME};
568 const std::vector<Hs20AnqpSubtypes> hsTypes = {
569 Hs20AnqpSubtypes::WAN_METRICS,
570 Hs20AnqpSubtypes::OPERATOR_FRIENDLY_NAME};
571
572 // Request should fail since the BSSID mentioned
573 // is not present in the scan results
574 EXPECT_FALSE(
575 sta_iface_->initiateAnqpQuery(kTestMacAddr, anqpIds, hsTypes).isOk());
576 }
577
578 /*
579 * InitiateHs20IconQuery
580 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateHs20IconQuery)581 TEST_P(SupplicantStaIfaceAidlTest, InitiateHs20IconQuery) {
582 // Request should fail since the BSSID mentioned
583 // is not present in the scan results
584 const std::string hs20IconFile = "TestFile";
585 EXPECT_FALSE(
586 sta_iface_->initiateHs20IconQuery(kTestMacAddr, hs20IconFile).isOk());
587 }
588
589 /*
590 * InitiateVenueUrlAnqpQuery.
591 */
TEST_P(SupplicantStaIfaceAidlTest,InitiateVenueUrlAnqpQuery)592 TEST_P(SupplicantStaIfaceAidlTest, InitiateVenueUrlAnqpQuery) {
593 // Request should fail since the BSSID mentioned
594 // is not present in the scan results
595 EXPECT_FALSE(sta_iface_->initiateVenueUrlAnqpQuery(kTestMacAddr).isOk());
596 }
597
598 /*
599 * Reassociate
600 */
TEST_P(SupplicantStaIfaceAidlTest,Reassociate)601 TEST_P(SupplicantStaIfaceAidlTest, Reassociate) {
602 EXPECT_TRUE(sta_iface_->reassociate().isOk());
603 }
604
605 /*
606 * Reconnect
607 */
TEST_P(SupplicantStaIfaceAidlTest,Reconnect)608 TEST_P(SupplicantStaIfaceAidlTest, Reconnect) {
609 EXPECT_FALSE(sta_iface_->reconnect().isOk());
610 }
611
612 /*
613 * Disconnect
614 */
TEST_P(SupplicantStaIfaceAidlTest,Disconnect)615 TEST_P(SupplicantStaIfaceAidlTest, Disconnect) {
616 EXPECT_TRUE(sta_iface_->disconnect().isOk());
617 }
618
619 /*
620 * SetPowerSave
621 */
TEST_P(SupplicantStaIfaceAidlTest,SetPowerSave)622 TEST_P(SupplicantStaIfaceAidlTest, SetPowerSave) {
623 EXPECT_TRUE(sta_iface_->setPowerSave(true).isOk());
624 EXPECT_TRUE(sta_iface_->setPowerSave(false).isOk());
625 }
626
627 /*
628 * AddExtRadioWork
629 */
TEST_P(SupplicantStaIfaceAidlTest,AddExtRadioWork)630 TEST_P(SupplicantStaIfaceAidlTest, AddExtRadioWork) {
631 const std::string radioWorkName = "TestRadioWork";
632 const int32_t radioWorkFreq = 2412;
633 const int32_t radioWorkTimeout = 8;
634 int32_t radioWorkId;
635 EXPECT_TRUE(sta_iface_
636 ->addExtRadioWork(radioWorkName, radioWorkFreq,
637 radioWorkTimeout, &radioWorkId)
638 .isOk());
639 // removeExtRadio only succeeds if the added radio work hasn't started yet,
640 // so there is no guaranteed result from calling removeExtRadioWork here.
641 // Given that, we can't currently test removeExtRadioWork following
642 // a call to addExtRadioWork.
643 }
644
645 /*
646 * RemoveExtRadioWork
647 */
TEST_P(SupplicantStaIfaceAidlTest,RemoveExtRadioWork)648 TEST_P(SupplicantStaIfaceAidlTest, RemoveExtRadioWork) {
649 // This fails because there is no ongoing radio work with radioWorkId
650 const int32_t radioWorkId = 16;
651 EXPECT_FALSE(sta_iface_->removeExtRadioWork(radioWorkId).isOk());
652 }
653
654 /*
655 * Add/Remove DppPeerUri
656 */
TEST_P(SupplicantStaIfaceAidlTest,AddRemoveDppPeerUri)657 TEST_P(SupplicantStaIfaceAidlTest, AddRemoveDppPeerUri) {
658 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
659 GTEST_SKIP() << "Missing DPP support";
660 }
661 // Add a peer URI and then remove it.
662 int32_t peerId;
663 EXPECT_TRUE(sta_iface_->addDppPeerUri(kTestUri, &peerId).isOk());
664 EXPECT_TRUE(sta_iface_->removeDppUri(peerId).isOk());
665 }
666
667 /*
668 * FilsHlpAddRequest
669 */
TEST_P(SupplicantStaIfaceAidlTest,FilsHlpAddRequest)670 TEST_P(SupplicantStaIfaceAidlTest, FilsHlpAddRequest) {
671 if (!isFilsSupported(sta_iface_)) {
672 GTEST_SKIP()
673 << "Skipping test since driver/supplicant doesn't support FILS";
674 }
675 const std::vector<uint8_t> destMacAddr = {0x00, 0x11, 0x22,
676 0x33, 0x44, 0x55};
677 const std::vector<uint8_t> pktBuffer = std::vector<uint8_t>(300, 0x3a);
678 EXPECT_TRUE(sta_iface_->filsHlpAddRequest(destMacAddr, pktBuffer).isOk());
679 }
680
681 /*
682 * FilsHlpFlushRequest
683 */
TEST_P(SupplicantStaIfaceAidlTest,FilsHlpFlushRequest)684 TEST_P(SupplicantStaIfaceAidlTest, FilsHlpFlushRequest) {
685 if (!isFilsSupported(sta_iface_)) {
686 GTEST_SKIP()
687 << "Skipping test since driver/supplicant doesn't support FILS";
688 }
689 EXPECT_TRUE(sta_iface_->filsHlpFlushRequest().isOk());
690 }
691
692 /*
693 * StartDppEnrolleeResponder
694 */
TEST_P(SupplicantStaIfaceAidlTest,StartDppEnrolleeResponder)695 TEST_P(SupplicantStaIfaceAidlTest, StartDppEnrolleeResponder) {
696 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
697 GTEST_SKIP() << "Missing DPP support";
698 }
699
700 const std::string deviceInfo = "DPP_Responder_Mode_VTS_Test";
701 const std::vector<uint8_t> mac_address = {0x22, 0x33, 0x44,
702 0x55, 0x66, 0x77};
703
704 // Generate DPP bootstrap information.
705 DppResponderBootstrapInfo bootstrapInfo;
706 EXPECT_TRUE(
707 sta_iface_
708 ->generateDppBootstrapInfoForResponder(
709 mac_address, deviceInfo, DppCurve::PRIME256V1, &bootstrapInfo)
710 .isOk());
711 EXPECT_NE(-1, bootstrapInfo.bootstrapId);
712 EXPECT_NE(0, bootstrapInfo.bootstrapId);
713 EXPECT_NE(0, bootstrapInfo.listenChannel);
714 const uint32_t bootstrap_id = bootstrapInfo.bootstrapId;
715 const uint32_t listen_channel = bootstrapInfo.listenChannel;
716
717 // Start DPP as Enrollee-Responder.
718 EXPECT_TRUE(sta_iface_->startDppEnrolleeResponder(listen_channel).isOk());
719
720 // Stop DPP Enrollee-Responder mode, ie remove the URI and stop listen.
721 EXPECT_TRUE(sta_iface_->stopDppResponder(bootstrap_id).isOk());
722 }
723
724 class IfaceDppCallback : public SupplicantStaIfaceCallback {
725 SupplicantStaIfaceAidlTest& parent_;
onDppSuccess(::aidl::android::hardware::wifi::supplicant::DppEventType event)726 ::ndk::ScopedAStatus onDppSuccess(
727 ::aidl::android::hardware::wifi::supplicant::DppEventType event)
728 override {
729 parent_.code = (uint32_t)event;
730 parent_.dppCallbackType =
731 SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_SUCCESS;
732 parent_.notify();
733 return ndk::ScopedAStatus::ok();
734 }
onDppProgress(aidl::android::hardware::wifi::supplicant::DppProgressCode code)735 ::ndk::ScopedAStatus onDppProgress(
736 aidl::android::hardware::wifi::supplicant::DppProgressCode code)
737 override {
738 parent_.code = (uint32_t)code;
739 parent_.dppCallbackType =
740 SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_PROGRESS;
741 parent_.notify();
742 return ndk::ScopedAStatus::ok();
743 }
onDppFailure(aidl::android::hardware::wifi::supplicant::DppFailureCode code,const std::string & ssid,const std::string & channelList,const std::vector<char16_t> & bandList)744 ::ndk::ScopedAStatus onDppFailure(
745 aidl::android::hardware::wifi::supplicant::DppFailureCode code,
746 const std::string& ssid __attribute__((unused)),
747 const std::string& channelList __attribute__((unused)),
748 const std::vector<char16_t>& bandList
749 __attribute__((unused))) override {
750 parent_.code = (uint32_t)code;
751 parent_.dppCallbackType =
752 SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_FAILURE;
753 parent_.notify();
754 return ndk::ScopedAStatus::ok();
755 }
756
757 public:
IfaceDppCallback(SupplicantStaIfaceAidlTest & parent)758 IfaceDppCallback(SupplicantStaIfaceAidlTest& parent) : parent_(parent){};
759 };
760
761 /*
762 * StartDppEnrolleeInitiator
763 */
TEST_P(SupplicantStaIfaceAidlTest,StartDppEnrolleeInitiator)764 TEST_P(SupplicantStaIfaceAidlTest, StartDppEnrolleeInitiator) {
765 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
766 GTEST_SKIP() << "Missing DPP support";
767 }
768
769 // Register callback
770 std::shared_ptr<IfaceDppCallback> callback =
771 ndk::SharedRefBase::make<IfaceDppCallback>(*this);
772 EXPECT_NE(callback, nullptr);
773 EXPECT_TRUE(sta_iface_->registerCallback(callback).isOk());
774
775 // Add a peer URI
776 int32_t peer_id = 0;
777 EXPECT_TRUE(sta_iface_->addDppPeerUri(kTestUri, &peer_id).isOk());
778 EXPECT_NE(0, peer_id);
779 EXPECT_NE(-1, peer_id);
780
781 // Start DPP as Enrollee-Initiator. Since this operation requires two
782 // devices, we start the operation and expect a timeout.
783 EXPECT_TRUE(sta_iface_->startDppEnrolleeInitiator(peer_id, 0).isOk());
784
785 // Wait for the timeout callback
786 EXPECT_EQ(std::cv_status::no_timeout,
787 wait(SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_FAILURE));
788 EXPECT_EQ(SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_FAILURE,
789 dppCallbackType);
790
791 // ...and then remove the peer URI.
792 EXPECT_TRUE(sta_iface_->removeDppUri(peer_id).isOk());
793 }
794
795 /*
796 * StartDppConfiguratorInitiator
797 */
TEST_P(SupplicantStaIfaceAidlTest,StartDppConfiguratorInitiator)798 TEST_P(SupplicantStaIfaceAidlTest, StartDppConfiguratorInitiator) {
799 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
800 GTEST_SKIP() << "Missing DPP support";
801 }
802
803 // Register callback
804 std::shared_ptr<IfaceDppCallback> callback =
805 ndk::SharedRefBase::make<IfaceDppCallback>(*this);
806 EXPECT_NE(callback, nullptr);
807 EXPECT_TRUE(sta_iface_->registerCallback(callback).isOk());
808
809 // Add a peer URI
810 int32_t peer_id = 0;
811 EXPECT_TRUE(sta_iface_->addDppPeerUri(kTestUri, &peer_id).isOk());
812 EXPECT_NE(0, peer_id);
813 EXPECT_NE(-1, peer_id);
814
815 const std::string ssid =
816 "6D795F746573745F73736964"; // 'my_test_ssid' encoded in hex
817 const std::string password =
818 "746F70736563726574"; // 'topsecret' encoded in hex
819 const std::vector<uint8_t> eckey_in = {0x2, 0x3, 0x4};
820 std::vector<uint8_t> eckey_out = {};
821
822 // Start DPP as Configurator-Initiator. Since this operation requires two
823 // devices, we start the operation and expect a timeout.
824 EXPECT_TRUE(sta_iface_
825 ->startDppConfiguratorInitiator(peer_id, 0, ssid, password, "",
826 DppNetRole::STA, DppAkm::PSK, eckey_in,
827 &eckey_out)
828 .isOk());
829
830 // Wait for the timeout callback
831 ASSERT_EQ(std::cv_status::no_timeout,
832 wait(SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_FAILURE));
833 ASSERT_EQ(SupplicantStaIfaceAidlTest::DppCallbackType::EVENT_FAILURE,
834 dppCallbackType);
835
836 // ...and then remove the peer URI.
837 EXPECT_TRUE(sta_iface_->removeDppUri(peer_id).isOk());
838 }
839
840 /*
841 * Configure and Disable MSCS
842 */
TEST_P(SupplicantStaIfaceAidlTest,ConfigureAndDisableMscs)843 TEST_P(SupplicantStaIfaceAidlTest, ConfigureAndDisableMscs) {
844 if (interface_version_ < 3) {
845 GTEST_SKIP() << "MSCS configure/disable is available as of Supplicant V3";
846 }
847 MscsParams params;
848 params.upBitmap = 0;
849 params.upLimit = 7;
850 params.streamTimeoutUs = 1000; // 1 ms
851 params.frameClassifierMask = 0;
852 EXPECT_TRUE(sta_iface_->configureMscs(params).isOk());
853 EXPECT_TRUE(sta_iface_->disableMscs().isOk());
854 }
855
856 /*
857 * Add and remove QoS policy with traffic characteristics
858 */
TEST_P(SupplicantStaIfaceAidlTest,AddAndRemoveQosWithTrafficChars)859 TEST_P(SupplicantStaIfaceAidlTest, AddAndRemoveQosWithTrafficChars) {
860 if (interface_version_ < 3) {
861 GTEST_SKIP() << "QosCharacteristics is available as of Supplicant V3";
862 }
863
864 QosCharacteristics qosChars;
865 qosChars.minServiceIntervalUs = 2000;
866 qosChars.maxServiceIntervalUs = 5000;
867 qosChars.minDataRateKbps = 500;
868 qosChars.delayBoundUs = 200;
869 qosChars.optionalFieldMask = 0; // no optional fields
870
871 uint8_t policyId = 5;
872 QosPolicyScsData qosPolicy;
873 qosPolicy.policyId = policyId;
874 qosPolicy.direction = QosPolicyScsData::LinkDirection::UPLINK;
875 qosPolicy.QosCharacteristics = qosChars;
876
877 std::vector<uint8_t> policyIdList{policyId};
878 std::vector<QosPolicyScsData> policyList{qosPolicy};
879 std::vector<QosPolicyScsRequestStatus> responseList;
880
881 // Check that we receive some reply for this request.
882 // Policy may not be accepted (ex. policy with this id already exists).
883 EXPECT_TRUE(sta_iface_->addQosPolicyRequestForScs(policyList, &responseList).isOk());
884 EXPECT_EQ(1, responseList.size());
885 EXPECT_TRUE(sta_iface_->removeQosPolicyForScs(policyIdList, &responseList).isOk());
886 EXPECT_EQ(1, responseList.size());
887 }
888
889 /*
890 * Verify that all USD methods check the Service Specific Info (SSI) length
891 * and fail if the provided SSI is too long.
892 */
TEST_P(SupplicantStaIfaceAidlTest,InvalidUsdServiceSpecificInfo)893 TEST_P(SupplicantStaIfaceAidlTest, InvalidUsdServiceSpecificInfo) {
894 if (interface_version_ < 4) {
895 GTEST_SKIP() << "USD is available as of Supplicant V4";
896 }
897
898 UsdCapabilities caps;
899 EXPECT_TRUE(sta_iface_->getUsdCapabilities(&caps).isOk());
900 if (!caps.isUsdPublisherSupported && !caps.isUsdSubscriberSupported) {
901 GTEST_SKIP() << "USD publish and subscribe are not supported";
902 }
903
904 int commandId = 123;
905 std::vector<uint8_t> invalidSsi(caps.maxLocalSsiLengthBytes + 1);
906 UsdBaseConfig invalidBaseConfig;
907 invalidBaseConfig.serviceSpecificInfo = invalidSsi;
908
909 if (caps.isUsdPublisherSupported) {
910 UsdPublishConfig publishConfig;
911 publishConfig.usdBaseConfig = invalidBaseConfig;
912 EXPECT_FALSE(sta_iface_->startUsdPublish(commandId, publishConfig).isOk());
913 EXPECT_FALSE(sta_iface_->updateUsdPublish(commandId, invalidSsi).isOk());
914 }
915
916 if (caps.isUsdSubscriberSupported) {
917 UsdSubscribeConfig subscribeConfig;
918 subscribeConfig.usdBaseConfig = invalidBaseConfig;
919 EXPECT_FALSE(sta_iface_->startUsdSubscribe(commandId, subscribeConfig).isOk());
920 }
921
922 UsdMessageInfo messageInfo;
923 messageInfo.message = invalidSsi;
924 EXPECT_FALSE(sta_iface_->sendUsdMessage(messageInfo).isOk());
925 }
926
927 /*
928 * Cancel a USD Publish and Subscribe session.
929 */
TEST_P(SupplicantStaIfaceAidlTest,CancelUsdSession)930 TEST_P(SupplicantStaIfaceAidlTest, CancelUsdSession) {
931 if (interface_version_ < 4) {
932 GTEST_SKIP() << "USD is available as of Supplicant V4";
933 }
934
935 UsdCapabilities caps;
936 EXPECT_TRUE(sta_iface_->getUsdCapabilities(&caps).isOk());
937 if (!caps.isUsdPublisherSupported && !caps.isUsdSubscriberSupported) {
938 GTEST_SKIP() << "USD publish and subscribe are not supported";
939 }
940
941 int sessionId = 123;
942 if (caps.isUsdPublisherSupported) {
943 // Method is expected to succeed, even if the session does not exist.
944 EXPECT_TRUE(sta_iface_->cancelUsdPublish(sessionId).isOk());
945 }
946 if (caps.isUsdSubscriberSupported) {
947 EXPECT_TRUE(sta_iface_->cancelUsdSubscribe(sessionId).isOk());
948 }
949 }
950
951 /*
952 * GenerateSelfDppConfiguration
953 */
TEST_P(SupplicantStaIfaceAidlTest,GenerateSelfDppConfiguration)954 TEST_P(SupplicantStaIfaceAidlTest, GenerateSelfDppConfiguration) {
955 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
956 GTEST_SKIP() << "Missing DPP support";
957 }
958 const std::string ssid = "my_test_ssid";
959 const std::vector<uint8_t> eckey_in = {0x2, 0x3, 0x4};
960
961 // Expect to fail as this test requires a DPP AKM supported AP and a valid private EC
962 // key generated by wpa_supplicant.
963 EXPECT_FALSE(sta_iface_->generateSelfDppConfiguration(ssid, eckey_in).isOk());
964 }
965
966 /*
967 * getSignalPollResults
968 */
TEST_P(SupplicantStaIfaceAidlTest,GetSignalPollResults)969 TEST_P(SupplicantStaIfaceAidlTest, GetSignalPollResults) {
970 if (interface_version_ < 2) {
971 GTEST_SKIP() << "getSignalPollResults is available as of Supplicant V2";
972 }
973
974 std::vector<SignalPollResult> results;
975 EXPECT_TRUE(sta_iface_->getSignalPollResults(&results).isOk());
976 }
977
978 /*
979 * Test that we can start and cancel all WPS methods.
980 */
TEST_P(SupplicantStaIfaceAidlTest,StartAndCancelWps)981 TEST_P(SupplicantStaIfaceAidlTest, StartAndCancelWps) {
982 std::vector<uint8_t> zeroMacAddr = {0, 0, 0, 0, 0, 0};
983 std::string pin = "12345678";
984
985 EXPECT_TRUE(sta_iface_->startWpsPbc(zeroMacAddr).isOk());
986 EXPECT_TRUE(sta_iface_->cancelWps().isOk());
987
988 std::string generatedPin;
989 EXPECT_TRUE(sta_iface_->startWpsPinDisplay(zeroMacAddr, &generatedPin).isOk());
990 EXPECT_TRUE(sta_iface_->cancelWps().isOk());
991
992 EXPECT_TRUE(sta_iface_->startWpsPinKeypad(pin).isOk());
993 EXPECT_TRUE(sta_iface_->cancelWps().isOk());
994
995 EXPECT_TRUE(sta_iface_->startWpsRegistrar(zeroMacAddr, pin).isOk());
996 EXPECT_TRUE(sta_iface_->cancelWps().isOk());
997 }
998
999 /*
1000 * Test that we can add, list, get, and remove a network.
1001 */
TEST_P(SupplicantStaIfaceAidlTest,ManageNetwork)1002 TEST_P(SupplicantStaIfaceAidlTest, ManageNetwork) {
1003 std::shared_ptr<ISupplicantStaNetwork> network;
1004 EXPECT_TRUE(sta_iface_->addNetwork(&network).isOk());
1005 EXPECT_NE(network, nullptr);
1006
1007 std::vector<int32_t> networkList;
1008 EXPECT_TRUE(sta_iface_->listNetworks(&networkList).isOk());
1009 EXPECT_EQ(networkList.size(), 1);
1010
1011 int networkId;
1012 EXPECT_TRUE(network->getId(&networkId).isOk());
1013 EXPECT_EQ(networkId, networkList[0]);
1014
1015 std::shared_ptr<ISupplicantStaNetwork> retrievedNetwork;
1016 EXPECT_TRUE(sta_iface_->getNetwork(networkId, &retrievedNetwork).isOk());
1017 EXPECT_NE(retrievedNetwork, nullptr);
1018 EXPECT_TRUE(sta_iface_->removeNetwork(networkId).isOk());
1019 }
1020
1021 /*
1022 * EnableAutoReconnect
1023 */
TEST_P(SupplicantStaIfaceAidlTest,EnableAutoReconnect)1024 TEST_P(SupplicantStaIfaceAidlTest, EnableAutoReconnect) {
1025 EXPECT_TRUE(sta_iface_->enableAutoReconnect(true).isOk());
1026 EXPECT_TRUE(sta_iface_->enableAutoReconnect(false).isOk());
1027 }
1028
1029 /*
1030 * SetQosPolicyFeatureEnabled
1031 */
TEST_P(SupplicantStaIfaceAidlTest,SetQosPolicyFeatureEnabled)1032 TEST_P(SupplicantStaIfaceAidlTest, SetQosPolicyFeatureEnabled) {
1033 EXPECT_TRUE(sta_iface_->setQosPolicyFeatureEnabled(true).isOk());
1034 EXPECT_TRUE(sta_iface_->setQosPolicyFeatureEnabled(false).isOk());
1035 }
1036
1037 /*
1038 * GetConnectionMloLinksInfo
1039 */
TEST_P(SupplicantStaIfaceAidlTest,GetConnectionMloLinksInfo)1040 TEST_P(SupplicantStaIfaceAidlTest, GetConnectionMloLinksInfo) {
1041 MloLinksInfo mloInfo;
1042 EXPECT_TRUE(sta_iface_->getConnectionMloLinksInfo(&mloInfo).isOk());
1043 }
1044
1045 /*
1046 * StopDppInitiator
1047 */
TEST_P(SupplicantStaIfaceAidlTest,StopDppInitiator)1048 TEST_P(SupplicantStaIfaceAidlTest, StopDppInitiator) {
1049 if (!keyMgmtSupported(sta_iface_, KeyMgmtMask::DPP)) {
1050 GTEST_SKIP() << "Missing DPP support";
1051 }
1052 EXPECT_TRUE(sta_iface_->stopDppInitiator().isOk());
1053 }
1054
1055 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaIfaceAidlTest);
1056 INSTANTIATE_TEST_SUITE_P(Supplicant, SupplicantStaIfaceAidlTest,
1057 testing::ValuesIn(android::getAidlHalInstanceNames(
1058 ISupplicant::descriptor)),
1059 android::PrintInstanceNameToString);
1060
main(int argc,char ** argv)1061 int main(int argc, char** argv) {
1062 ::testing::InitGoogleTest(&argc, argv);
1063 ProcessState::self()->setThreadPoolMaxThreadCount(1);
1064 ProcessState::self()->startThreadPool();
1065 return RUN_ALL_TESTS();
1066 }
1067