1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
18#include <cutils/properties.h>
19
20#include <VtsHalHidlTargetTestBase.h>
21
22#include <android/hardware/wifi/hostapd/1.0/IHostapd.h>
23
24#include "hostapd_hidl_call_util.h"
25#include "hostapd_hidl_test_utils.h"
26
27using ::android::sp;
28using ::android::hardware::hidl_vec;
29using ::android::hardware::wifi::hostapd::V1_0::IHostapd;
30using ::android::hardware::wifi::hostapd::V1_0::HostapdStatus;
31using ::android::hardware::wifi::hostapd::V1_0::HostapdStatusCode;
32
33namespace {
34constexpr unsigned char kNwSsid[] = {'t', 'e', 's', 't', '1',
35                                     '2', '3', '4', '5'};
36constexpr char kNwPassphrase[] = "test12345";
37constexpr int kIfaceChannel = 6;
38constexpr int kIfaceInvalidChannel = 567;
39}  // namespace
40
41class HostapdHidlTest : public ::testing::VtsHalHidlTargetTestBase {
42   public:
43    virtual void SetUp() override {
44        startHostapdAndWaitForHidlService();
45        hostapd_ = getHostapd();
46        ASSERT_NE(hostapd_.get(), nullptr);
47    }
48
49    virtual void TearDown() override { stopHostapd(); }
50
51   protected:
52    std::string getPrimaryWlanIfaceName() {
53        std::array<char, PROPERTY_VALUE_MAX> buffer;
54        property_get("wifi.interface", buffer.data(), "wlan0");
55        return buffer.data();
56    }
57
58    IHostapd::IfaceParams getIfaceParamsWithAcs() {
59        IHostapd::IfaceParams iface_params;
60        iface_params.ifaceName = getPrimaryWlanIfaceName();
61        iface_params.hwModeParams.enable80211N = true;
62        iface_params.hwModeParams.enable80211AC = false;
63        iface_params.channelParams.enableAcs = true;
64        iface_params.channelParams.acsShouldExcludeDfs = true;
65        iface_params.channelParams.channel = 0;
66        iface_params.channelParams.band = IHostapd::Band::BAND_ANY;
67        return iface_params;
68    }
69
70    IHostapd::IfaceParams getIfaceParamsWithoutAcs() {
71        IHostapd::IfaceParams iface_params;
72        iface_params.ifaceName = getPrimaryWlanIfaceName();
73        iface_params.hwModeParams.enable80211N = true;
74        iface_params.hwModeParams.enable80211AC = false;
75        iface_params.channelParams.enableAcs = false;
76        iface_params.channelParams.acsShouldExcludeDfs = false;
77        iface_params.channelParams.channel = kIfaceChannel;
78        iface_params.channelParams.band = IHostapd::Band::BAND_2_4_GHZ;
79        return iface_params;
80    }
81
82    IHostapd::IfaceParams getIfaceParamsWithInvalidChannel() {
83        IHostapd::IfaceParams iface_params;
84        iface_params.ifaceName = getPrimaryWlanIfaceName();
85        iface_params.hwModeParams.enable80211N = true;
86        iface_params.hwModeParams.enable80211AC = false;
87        iface_params.channelParams.enableAcs = false;
88        iface_params.channelParams.acsShouldExcludeDfs = false;
89        iface_params.channelParams.channel = kIfaceInvalidChannel;
90        iface_params.channelParams.band = IHostapd::Band::BAND_2_4_GHZ;
91        return iface_params;
92    }
93
94    IHostapd::NetworkParams getPskNwParams() {
95        IHostapd::NetworkParams nw_params;
96        nw_params.ssid =
97            std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
98        nw_params.isHidden = false;
99        nw_params.encryptionType = IHostapd::EncryptionType::WPA2;
100        nw_params.pskPassphrase = kNwPassphrase;
101        return nw_params;
102    }
103
104    IHostapd::NetworkParams getInvalidPskNwParams() {
105        IHostapd::NetworkParams nw_params;
106        nw_params.ssid =
107            std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
108        nw_params.isHidden = false;
109        nw_params.encryptionType = IHostapd::EncryptionType::WPA2;
110        return nw_params;
111    }
112
113    IHostapd::NetworkParams getOpenNwParams() {
114        IHostapd::NetworkParams nw_params;
115        nw_params.ssid =
116            std::vector<uint8_t>(kNwSsid, kNwSsid + sizeof(kNwSsid));
117        nw_params.isHidden = false;
118        nw_params.encryptionType = IHostapd::EncryptionType::NONE;
119        return nw_params;
120    }
121    // IHostapd object used for all tests in this fixture.
122    sp<IHostapd> hostapd_;
123};
124
125/*
126 * Create:
127 * Ensures that an instance of the IHostapd proxy object is
128 * successfully created.
129 */
130TEST(HostapdHidlTestNoFixture, Create) {
131    startHostapdAndWaitForHidlService();
132    EXPECT_NE(nullptr, getHostapd().get());
133    stopHostapd();
134}
135
136/**
137 * Adds an access point with PSK network config & ACS enabled.
138 * Access point creation should pass.
139 */
140TEST_F(HostapdHidlTest, AddPskAccessPointWithAcs) {
141    auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
142                              getPskNwParams());
143    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
144}
145
146/**
147 * Adds an access point with Open network config & ACS enabled.
148 * Access point creation should pass.
149 */
150TEST_F(HostapdHidlTest, AddOpenAccessPointWithAcs) {
151    auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
152                              getOpenNwParams());
153    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
154}
155
156/**
157 * Adds an access point with PSK network config & ACS disabled.
158 * Access point creation should pass.
159 */
160TEST_F(HostapdHidlTest, AddPskAccessPointWithoutAcs) {
161    auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
162                              getIfaceParamsWithoutAcs(), getPskNwParams());
163    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
164}
165
166/**
167 * Adds an access point with Open network config & ACS disabled.
168 * Access point creation should pass.
169 */
170TEST_F(HostapdHidlTest, AddOpenAccessPointWithoutAcs) {
171    auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
172                              getIfaceParamsWithoutAcs(), getOpenNwParams());
173    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
174}
175
176/**
177 * Adds & then removes an access point with PSK network config & ACS enabled.
178 * Access point creation & removal should pass.
179 */
180TEST_F(HostapdHidlTest, RemoveAccessPointWithAcs) {
181    auto status = HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithAcs(),
182                              getPskNwParams());
183    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
184    status =
185        HIDL_INVOKE(hostapd_, removeAccessPoint, getPrimaryWlanIfaceName());
186    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
187}
188
189/**
190 * Adds & then removes an access point with PSK network config & ACS disabled.
191 * Access point creation & removal should pass.
192 */
193TEST_F(HostapdHidlTest, RemoveAccessPointWithoutAcs) {
194    auto status = HIDL_INVOKE(hostapd_, addAccessPoint,
195                              getIfaceParamsWithoutAcs(), getPskNwParams());
196    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
197    status =
198        HIDL_INVOKE(hostapd_, removeAccessPoint, getPrimaryWlanIfaceName());
199    EXPECT_EQ(HostapdStatusCode::SUCCESS, status.code);
200}
201
202/**
203 * Adds an access point with invalid channel.
204 * Access point creation should fail.
205 */
206TEST_F(HostapdHidlTest, AddPskAccessPointWithInvalidChannel) {
207    auto status =
208        HIDL_INVOKE(hostapd_, addAccessPoint,
209                    getIfaceParamsWithInvalidChannel(), getPskNwParams());
210    EXPECT_NE(HostapdStatusCode::SUCCESS, status.code);
211}
212
213/**
214 * Adds an access point with invalid PSK network config.
215 * Access point creation should fail.
216 */
217TEST_F(HostapdHidlTest, AddInvalidPskAccessPointWithoutAcs) {
218    auto status =
219        HIDL_INVOKE(hostapd_, addAccessPoint, getIfaceParamsWithoutAcs(),
220                    getInvalidPskNwParams());
221    EXPECT_NE(HostapdStatusCode::SUCCESS, status.code);
222}
223
224/*
225 * Terminate
226 * This terminates the service.
227 */
228TEST_F(HostapdHidlTest, Terminate) {
229    hostapd_->terminate();
230}
231