1 /*
2 * Copyright (C) 2020 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 <android/hardware/wifi/1.1/IWifi.h>
19 #include <android/hardware/wifi/supplicant/1.1/ISupplicant.h>
20 #include <android/hardware/wifi/supplicant/1.2/types.h>
21 #include <android/hardware/wifi/supplicant/1.3/ISupplicant.h>
22 #include <android/hardware/wifi/supplicant/1.3/ISupplicantStaNetwork.h>
23 #include <android/hardware/wifi/supplicant/1.3/types.h>
24 #include <android/hardware/wifi/supplicant/1.4/ISupplicant.h>
25 #include <android/hardware/wifi/supplicant/1.4/ISupplicantStaIface.h>
26 #include <android/hardware/wifi/supplicant/1.4/ISupplicantStaIfaceCallback.h>
27 #include <android/hardware/wifi/supplicant/1.4/types.h>
28 #include <gtest/gtest.h>
29 #include <hidl/GtestPrinter.h>
30 #include <hidl/HidlSupport.h>
31 #include <hidl/ServiceManagement.h>
32
33 #include "supplicant_hidl_test_utils.h"
34 #include "supplicant_hidl_test_utils_1_4.h"
35
36 using ::android::sp;
37 using ::android::hardware::hidl_array;
38 using ::android::hardware::hidl_string;
39 using ::android::hardware::hidl_vec;
40 using ::android::hardware::Return;
41 using ::android::hardware::Void;
42 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
43 using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
44 using ::android::hardware::wifi::supplicant::V1_2::DppAkm;
45 using ::android::hardware::wifi::supplicant::V1_2::DppFailureCode;
46 using ::android::hardware::wifi::supplicant::V1_2::DppNetRole;
47 using ::android::hardware::wifi::supplicant::V1_2::DppProgressCode;
48 using ::android::hardware::wifi::supplicant::V1_3::DppSuccessCode;
49 using ::android::hardware::wifi::supplicant::V1_3::ISupplicantStaNetwork;
50 using ::android::hardware::wifi::supplicant::V1_4::ConnectionCapabilities;
51 using ::android::hardware::wifi::supplicant::V1_4::DppCurve;
52 using ::android::hardware::wifi::supplicant::V1_4::DppResponderBootstrapInfo;
53 using ::android::hardware::wifi::supplicant::V1_4::ISupplicant;
54 using ::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIface;
55 using ::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIfaceCallback;
56
57 namespace {
58 constexpr uint8_t kTestMacAddr[] = {0x56, 0x67, 0x67, 0xf4, 0x56, 0x92};
59 } // namespace
60
61 using SupplicantStatusV1_4 =
62 ::android::hardware::wifi::supplicant::V1_4::SupplicantStatus;
63 using SupplicantStatusCodeV1_4 =
64 ::android::hardware::wifi::supplicant::V1_4::SupplicantStatusCode;
65
66 class SupplicantStaIfaceHidlTest : public SupplicantHidlTestBaseV1_4 {
67 public:
SetUp()68 virtual void SetUp() override {
69 SupplicantHidlTestBaseV1_4::SetUp();
70 sta_iface_ = getSupplicantStaIface_1_4(supplicant_);
71 ASSERT_NE(sta_iface_.get(), nullptr);
72
73 memcpy(mac_addr_.data(), kTestMacAddr, mac_addr_.size());
74 }
75
76 protected:
77 // ISupplicantStaIface object used for all tests in this fixture.
78 sp<ISupplicantStaIface> sta_iface_;
79 // MAC address to use for various tests.
80 std::array<uint8_t, 6> mac_addr_;
81
isDppSupported()82 bool isDppSupported() {
83 uint32_t keyMgmtMask = 0;
84
85 // We need to first get the key management capabilities from the device.
86 // If DPP is not supported, we just pass the test.
87 sta_iface_->getKeyMgmtCapabilities_1_3(
88 [&](const SupplicantStatus& status, uint32_t keyMgmtMaskInternal) {
89 EXPECT_EQ(SupplicantStatusCode::SUCCESS, status.code);
90 keyMgmtMask = keyMgmtMaskInternal;
91 });
92
93 if (!(keyMgmtMask & ISupplicantStaNetwork::KeyMgmtMask::DPP)) {
94 // DPP not supported
95 return false;
96 }
97 return true;
98 }
99 };
100
101 class IfaceCallback : public ISupplicantStaIfaceCallback {
onNetworkAdded(uint32_t)102 Return<void> onNetworkAdded(uint32_t /* id */) override { return Void(); }
onNetworkRemoved(uint32_t)103 Return<void> onNetworkRemoved(uint32_t /* id */) override { return Void(); }
onStateChanged(ISupplicantStaIfaceCallback::State,const hidl_array<uint8_t,6> &,uint32_t,const hidl_vec<uint8_t> &)104 Return<void> onStateChanged(
105 ISupplicantStaIfaceCallback::State /* newState */,
106 const hidl_array<uint8_t, 6>& /*bssid */, uint32_t /* id */,
107 const hidl_vec<uint8_t>& /* ssid */) override {
108 return Void();
109 }
onAnqpQueryDone(const hidl_array<uint8_t,6> &,const::android::hardware::wifi::supplicant::V1_0::ISupplicantStaIfaceCallback::AnqpData &,const ISupplicantStaIfaceCallback::Hs20AnqpData &)110 Return<void> onAnqpQueryDone(
111 const hidl_array<uint8_t, 6>& /* bssid */,
112 const ::android::hardware::wifi::supplicant::V1_0::
113 ISupplicantStaIfaceCallback::AnqpData& /* data */,
114 const ISupplicantStaIfaceCallback::Hs20AnqpData& /* hs20Data */)
115 override {
116 return Void();
117 }
onHs20IconQueryDone(const hidl_array<uint8_t,6> &,const hidl_string &,const hidl_vec<uint8_t> &)118 virtual Return<void> onHs20IconQueryDone(
119 const hidl_array<uint8_t, 6>& /* bssid */,
120 const hidl_string& /* fileName */,
121 const hidl_vec<uint8_t>& /* data */) override {
122 return Void();
123 }
onHs20SubscriptionRemediation(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::OsuMethod,const hidl_string &)124 virtual Return<void> onHs20SubscriptionRemediation(
125 const hidl_array<uint8_t, 6>& /* bssid */,
126 ISupplicantStaIfaceCallback::OsuMethod /* osuMethod */,
127 const hidl_string& /* url*/) override {
128 return Void();
129 }
onHs20TermsAndConditionsAcceptanceRequestedNotification(const hidl_array<uint8_t,6> &,const hidl_string &)130 Return<void> onHs20TermsAndConditionsAcceptanceRequestedNotification(
131 const hidl_array<uint8_t, 6>& /* bssid */,
132 const hidl_string& /* url */) override {
133 return Void();
134 }
onHs20DeauthImminentNotice(const hidl_array<uint8_t,6> &,uint32_t,uint32_t,const hidl_string &)135 Return<void> onHs20DeauthImminentNotice(
136 const hidl_array<uint8_t, 6>& /* bssid */, uint32_t /* reasonCode */,
137 uint32_t /* reAuthDelayInSec */,
138 const hidl_string& /* url */) override {
139 return Void();
140 }
onDisconnected(const hidl_array<uint8_t,6> &,bool,ISupplicantStaIfaceCallback::ReasonCode)141 Return<void> onDisconnected(const hidl_array<uint8_t, 6>& /* bssid */,
142 bool /* locallyGenerated */,
143 ISupplicantStaIfaceCallback::ReasonCode
144 /* reasonCode */) override {
145 return Void();
146 }
onAssociationRejected(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::StatusCode,bool)147 Return<void> onAssociationRejected(
148 const hidl_array<uint8_t, 6>& /* bssid */,
149 ISupplicantStaIfaceCallback::StatusCode /* statusCode */,
150 bool /*timedOut */) override {
151 return Void();
152 }
onAuthenticationTimeout(const hidl_array<uint8_t,6> &)153 Return<void> onAuthenticationTimeout(
154 const hidl_array<uint8_t, 6>& /* bssid */) override {
155 return Void();
156 }
onBssidChanged(ISupplicantStaIfaceCallback::BssidChangeReason,const hidl_array<uint8_t,6> &)157 Return<void> onBssidChanged(
158 ISupplicantStaIfaceCallback::BssidChangeReason /* reason */,
159 const hidl_array<uint8_t, 6>& /* bssid */) override {
160 return Void();
161 }
onEapFailure()162 Return<void> onEapFailure() override { return Void(); }
onEapFailure_1_1(ISupplicantStaIfaceCallback::EapErrorCode)163 Return<void> onEapFailure_1_1(
164 ISupplicantStaIfaceCallback::EapErrorCode /* eapErrorCode */) override {
165 return Void();
166 }
onEapFailure_1_3(uint32_t)167 Return<void> onEapFailure_1_3(uint32_t /* eapErrorCode */) override {
168 return Void();
169 }
onWpsEventSuccess()170 Return<void> onWpsEventSuccess() override { return Void(); }
onWpsEventFail(const hidl_array<uint8_t,6> &,ISupplicantStaIfaceCallback::WpsConfigError,ISupplicantStaIfaceCallback::WpsErrorIndication)171 Return<void> onWpsEventFail(
172 const hidl_array<uint8_t, 6>& /* bssid */,
173 ISupplicantStaIfaceCallback::WpsConfigError /* configError */,
174 ISupplicantStaIfaceCallback::WpsErrorIndication /* errorInd */)
175 override {
176 return Void();
177 }
onWpsEventPbcOverlap()178 Return<void> onWpsEventPbcOverlap() override { return Void(); }
onExtRadioWorkStart(uint32_t)179 Return<void> onExtRadioWorkStart(uint32_t /* id */) override {
180 return Void();
181 }
onExtRadioWorkTimeout(uint32_t)182 Return<void> onExtRadioWorkTimeout(uint32_t /* id*/) override {
183 return Void();
184 }
onDppSuccessConfigReceived(const hidl_vec<uint8_t> &,const hidl_string &,const hidl_array<uint8_t,32> &,DppAkm)185 Return<void> onDppSuccessConfigReceived(
186 const hidl_vec<uint8_t>& /* ssid */, const hidl_string& /* password */,
187 const hidl_array<uint8_t, 32>& /* psk */,
188 DppAkm /* securityAkm */) override {
189 return Void();
190 }
onDppSuccessConfigSent()191 Return<void> onDppSuccessConfigSent() override { return Void(); }
onDppProgress(DppProgressCode)192 Return<void> onDppProgress(DppProgressCode /* code */) override {
193 return Void();
194 }
onDppFailure(DppFailureCode)195 Return<void> onDppFailure(DppFailureCode /* code */) override {
196 return Void();
197 }
onDppSuccess(DppSuccessCode)198 Return<void> onDppSuccess(DppSuccessCode /* code */) override {
199 return Void();
200 }
onDppProgress_1_3(::android::hardware::wifi::supplicant::V1_3::DppProgressCode)201 Return<void> onDppProgress_1_3(
202 ::android::hardware::wifi::supplicant::V1_3::DppProgressCode /* code */)
203 override {
204 return Void();
205 }
onDppFailure_1_3(::android::hardware::wifi::supplicant::V1_3::DppFailureCode,const hidl_string &,const hidl_string &,const hidl_vec<uint16_t> &)206 Return<void> onDppFailure_1_3(
207 ::android::hardware::wifi::supplicant::V1_3::DppFailureCode /* code */,
208 const hidl_string& /* ssid */, const hidl_string& /* channelList */,
209 const hidl_vec<uint16_t>& /* bandList */) override {
210 return Void();
211 }
onPmkCacheAdded(int64_t,const hidl_vec<uint8_t> &)212 Return<void> onPmkCacheAdded(
213 int64_t /* expirationTimeInSec */,
214 const hidl_vec<uint8_t>& /* serializedEntry */) override {
215 return Void();
216 }
onBssTmHandlingDone(const ISupplicantStaIfaceCallback::BssTmData &)217 Return<void> onBssTmHandlingDone(
218 const ISupplicantStaIfaceCallback::BssTmData& /* data */) override {
219 return Void();
220 }
onStateChanged_1_3(ISupplicantStaIfaceCallback::State,const hidl_array<uint8_t,6> &,uint32_t,const hidl_vec<uint8_t> &,bool)221 Return<void> onStateChanged_1_3(
222 ISupplicantStaIfaceCallback::State /* newState */,
223 const hidl_array<uint8_t, 6>& /*bssid */, uint32_t /* id */,
224 const hidl_vec<uint8_t>& /* ssid */, bool /* filsHlpSent */) override {
225 return Void();
226 }
onAnqpQueryDone_1_4(const hidl_array<uint8_t,6> &,const::android::hardware::wifi::supplicant::V1_4::ISupplicantStaIfaceCallback::AnqpData &,const ISupplicantStaIfaceCallback::Hs20AnqpData &)227 Return<void> onAnqpQueryDone_1_4(
228 const hidl_array<uint8_t, 6>& /* bssid */,
229 const ::android::hardware::wifi::supplicant::V1_4::
230 ISupplicantStaIfaceCallback::AnqpData& /* data */,
231 const ISupplicantStaIfaceCallback::Hs20AnqpData& /* hs20Data */)
232 override {
233 return Void();
234 }
onAssociationRejected_1_4(const ISupplicantStaIfaceCallback::AssociationRejectionData &)235 Return<void> onAssociationRejected_1_4(
236 const ISupplicantStaIfaceCallback::AssociationRejectionData& /* data */)
237 override {
238 return Void();
239 }
onNetworkNotFound(const hidl_vec<uint8_t> &)240 Return<void> onNetworkNotFound(
241 const hidl_vec<uint8_t>& /* ssid */) override {
242 return Void();
243 }
244 };
245
246 /*
247 * getConnectionCapabilities_1_4
248 */
TEST_P(SupplicantStaIfaceHidlTest,GetConnectionCapabilities)249 TEST_P(SupplicantStaIfaceHidlTest, GetConnectionCapabilities) {
250 sta_iface_->getConnectionCapabilities_1_4(
251 [&](const SupplicantStatusV1_4& status,
252 ConnectionCapabilities /* capabilities */) {
253 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
254 });
255 }
256
257 /*
258 * RegisterCallback_1_4
259 */
TEST_P(SupplicantStaIfaceHidlTest,RegisterCallback_1_4)260 TEST_P(SupplicantStaIfaceHidlTest, RegisterCallback_1_4) {
261 sta_iface_->registerCallback_1_4(
262 new IfaceCallback(), [](const SupplicantStatusV1_4& status) {
263 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
264 });
265 }
266
267 /*
268 * InitiateVenueUrlAnqpQuery.
269 */
TEST_P(SupplicantStaIfaceHidlTest,InitiateVenueUrlAnqpQuery)270 TEST_P(SupplicantStaIfaceHidlTest, InitiateVenueUrlAnqpQuery) {
271 sta_iface_->initiateVenueUrlAnqpQuery(
272 mac_addr_, [](const SupplicantStatusV1_4& status) {
273 // These requests will fail unless the BSSID mentioned is actually
274 // present in scan results.
275 EXPECT_EQ(SupplicantStatusCodeV1_4::FAILURE_UNKNOWN, status.code);
276 });
277 }
278
279 /*
280 * GetWpaDriverCapabilities
281 */
TEST_P(SupplicantStaIfaceHidlTest,GetWpaDriverCapabilities)282 TEST_P(SupplicantStaIfaceHidlTest, GetWpaDriverCapabilities) {
283 sta_iface_->getWpaDriverCapabilities_1_4(
284 [&](const SupplicantStatusV1_4& status, uint32_t) {
285 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
286 });
287 }
288
289 /*
290 * StartDppEnrolleeResponder
291 */
TEST_P(SupplicantStaIfaceHidlTest,StartDppEnrolleeResponder)292 TEST_P(SupplicantStaIfaceHidlTest, StartDppEnrolleeResponder) {
293 // We need to first get the key management capabilities from the device.
294 // If DPP is not supported, we just pass the test.
295 if (!isDppSupported()) {
296 // DPP not supported
297 return;
298 }
299
300 hidl_string deviceInfo = "DPP_Responder_Mode_VTS_Test";
301 uint32_t bootstrap_id = 0;
302 uint32_t listen_channel = 0;
303 uint8_t mac_address[6] = {0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
304
305 // Generate DPP bootstrap information
306 sta_iface_->generateDppBootstrapInfoForResponder(
307 mac_address, deviceInfo, DppCurve::PRIME256V1,
308 [&](const SupplicantStatusV1_4& status,
309 DppResponderBootstrapInfo bootstrapInfo) {
310 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
311 EXPECT_NE(-1, bootstrapInfo.bootstrapId);
312 EXPECT_NE(0, bootstrapInfo.bootstrapId);
313 bootstrap_id = bootstrapInfo.bootstrapId;
314 listen_channel = bootstrapInfo.listenChannel;
315 EXPECT_NE(0, bootstrapInfo.listenChannel);
316 });
317
318 // Start DPP as Enrollee-Responder.
319 sta_iface_->startDppEnrolleeResponder(
320 listen_channel, [&](const SupplicantStatusV1_4& status) {
321 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
322 });
323
324 // Stop DPP Enrollee-Responder mode, ie remove the URI and stop listen.
325 sta_iface_->stopDppResponder(
326 bootstrap_id, [&](const SupplicantStatusV1_4& status) {
327 EXPECT_EQ(SupplicantStatusCodeV1_4::SUCCESS, status.code);
328 });
329 }
330
331 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(SupplicantStaIfaceHidlTest);
332 INSTANTIATE_TEST_CASE_P(
333 PerInstance, SupplicantStaIfaceHidlTest,
334 testing::Combine(
335 testing::ValuesIn(android::hardware::getAllHalInstanceNames(
336 android::hardware::wifi::V1_0::IWifi::descriptor)),
337 testing::ValuesIn(android::hardware::getAllHalInstanceNames(
338 android::hardware::wifi::supplicant::V1_4::ISupplicant::
339 descriptor))),
340 android::hardware::PrintInstanceTupleNameToString<>);
341