• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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