Merge "supplicant(vts): Add gtest framework" am: ae548da7d4
am: f913bff35f
Change-Id: Ia5e7e3d3180ebda1590d8450418769f663d1a1b7
This commit is contained in:
commit
dd010e40c4
8 changed files with 527 additions and 0 deletions
43
wifi/supplicant/1.0/vts/functional/Android.mk
Normal file
43
wifi/supplicant/1.0/vts/functional/Android.mk
Normal file
|
@ -0,0 +1,43 @@
|
|||
#
|
||||
# Copyright (C) 2016 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := supplicant_hidl_test
|
||||
LOCAL_CPPFLAGS := -Wall -Werror -Wextra
|
||||
LOCAL_SRC_FILES := \
|
||||
main.cpp \
|
||||
supplicant_hidl_test.cpp \
|
||||
supplicant_hidl_test_utils.cpp \
|
||||
supplicant_p2p_iface_hidl_test.cpp \
|
||||
supplicant_sta_iface_hidl_test.cpp \
|
||||
supplicant_sta_network_hidl_test.cpp
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
android.hardware.wifi.supplicant@1.0 \
|
||||
libbase \
|
||||
libcutils \
|
||||
libhidlbase \
|
||||
libhidltransport \
|
||||
libhwbinder \
|
||||
liblog \
|
||||
libutils \
|
||||
libwifi-hal \
|
||||
libwifi-system
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libgmock \
|
||||
libgtest
|
||||
include $(BUILD_NATIVE_TEST)
|
||||
|
41
wifi/supplicant/1.0/vts/functional/main.cpp
Normal file
41
wifi/supplicant/1.0/vts/functional/main.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
class SupplicantHidlEnvironment : public ::testing::Environment {
|
||||
public:
|
||||
virtual void SetUp() override {
|
||||
stopWifiFramework();
|
||||
stopSupplicant();
|
||||
}
|
||||
virtual void TearDown() override {
|
||||
startWifiFramework();
|
||||
// Framework will start wpa_supplicant.
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
::testing::AddGlobalTestEnvironment(new SupplicantHidlEnvironment);
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
int status = RUN_ALL_TESTS();
|
||||
LOG(INFO) << "Test result = " << status;
|
||||
return status;
|
||||
}
|
32
wifi/supplicant/1.0/vts/functional/supplicant_hidl_test.cpp
Normal file
32
wifi/supplicant/1.0/vts/functional/supplicant_hidl_test.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
/*
|
||||
* Create:
|
||||
* Ensures that an instance of the ISupplicant proxy object is
|
||||
* successfully created.
|
||||
*/
|
||||
TEST(SupplicantHidlTestNoFixture, Create) {
|
||||
startSupplicantAndWaitForHidlService();
|
||||
EXPECT_NE(nullptr, getSupplicant().get());
|
||||
stopSupplicant();
|
||||
}
|
|
@ -0,0 +1,267 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <hidl/HidlTransportSupport.h>
|
||||
#include <android/hidl/manager/1.0/IServiceManager.h>
|
||||
#include <android/hidl/manager/1.0/IServiceNotification.h>
|
||||
|
||||
#include <wifi_hal/driver_tool.h>
|
||||
#include <wifi_system/interface_tool.h>
|
||||
#include <wifi_system/supplicant_manager.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
using ::android::sp;
|
||||
using ::android::hardware::configureRpcThreadpool;
|
||||
using ::android::hardware::joinRpcThreadpool;
|
||||
using ::android::hardware::hidl_string;
|
||||
using ::android::hardware::hidl_vec;
|
||||
using ::android::hardware::Return;
|
||||
using ::android::hardware::Void;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicant;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicantIface;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicantNetwork;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicantStaNetwork;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::ISupplicantP2pIface;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::IfaceType;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
|
||||
using ::android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
|
||||
using ::android::hidl::manager::V1_0::IServiceNotification;
|
||||
using ::android::wifi_hal::DriverTool;
|
||||
using ::android::wifi_system::InterfaceTool;
|
||||
using ::android::wifi_system::SupplicantManager;
|
||||
|
||||
namespace {
|
||||
const char kSupplicantServiceName[] = "wpa_supplicant";
|
||||
|
||||
// Helper function to initialize the driver and firmware to STA mode.
|
||||
void initilializeDriverAndFirmware() {
|
||||
DriverTool driver_tool;
|
||||
InterfaceTool iface_tool;
|
||||
EXPECT_TRUE(driver_tool.LoadDriver());
|
||||
EXPECT_TRUE(driver_tool.ChangeFirmwareMode(DriverTool::kFirmwareModeSta));
|
||||
EXPECT_TRUE(iface_tool.SetWifiUpState(true));
|
||||
}
|
||||
|
||||
// Helper function to find any iface of the desired type exposed.
|
||||
bool findIfaceOfType(sp<ISupplicant> supplicant, IfaceType desired_type,
|
||||
ISupplicant::IfaceInfo* out_info) {
|
||||
bool operation_failed = false;
|
||||
std::vector<ISupplicant::IfaceInfo> iface_infos;
|
||||
supplicant->listInterfaces([&](const SupplicantStatus& status,
|
||||
hidl_vec<ISupplicant::IfaceInfo> infos) {
|
||||
if (status.code != SupplicantStatusCode::SUCCESS) {
|
||||
operation_failed = true;
|
||||
return;
|
||||
}
|
||||
iface_infos = infos;
|
||||
});
|
||||
if (operation_failed) {
|
||||
return false;
|
||||
}
|
||||
for (const auto& info : iface_infos) {
|
||||
if (info.type == desired_type) {
|
||||
*out_info = info;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
// Utility class to wait for wpa_supplicant's HIDL service registration.
|
||||
class ServiceNotificationListener : public IServiceNotification {
|
||||
public:
|
||||
Return<void> onRegistration(const hidl_string& fully_qualified_name,
|
||||
const hidl_string& instance_name,
|
||||
bool pre_existing) override {
|
||||
if (pre_existing) {
|
||||
return Void();
|
||||
}
|
||||
std::unique_lock<std::mutex> lock(mutex_);
|
||||
registered_.push_back(std::string(fully_qualified_name.c_str()) + "/" +
|
||||
instance_name.c_str());
|
||||
lock.unlock();
|
||||
condition_.notify_one();
|
||||
return Void();
|
||||
}
|
||||
|
||||
bool registerForHidlServiceNotifications(const std::string& instance_name) {
|
||||
if (!ISupplicant::registerForNotifications(instance_name, this)) {
|
||||
return false;
|
||||
}
|
||||
configureRpcThreadpool(2, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool waitForHidlService(uint32_t timeout_in_millis,
|
||||
const std::string& instance_name) {
|
||||
std::unique_lock<std::mutex> lock(mutex_);
|
||||
condition_.wait_for(lock, std::chrono::milliseconds(timeout_in_millis),
|
||||
[&]() { return registered_.size() >= 1; });
|
||||
if (registered_.size() != 1) {
|
||||
return false;
|
||||
}
|
||||
std::string exptected_registered =
|
||||
std::string(ISupplicant::descriptor) + "/" + instance_name;
|
||||
if (registered_[0] != exptected_registered) {
|
||||
LOG(ERROR) << "Expected: " << exptected_registered
|
||||
<< ", Got: " << registered_[0];
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<std::string> registered_{};
|
||||
std::mutex mutex_;
|
||||
std::condition_variable condition_;
|
||||
};
|
||||
|
||||
void stopWifiFramework() {
|
||||
ASSERT_EQ(std::system("svc wifi disable"), 0);
|
||||
// TODO: Use some other mechanism to wait for the framework to
|
||||
// finish disabling.
|
||||
sleep(5);
|
||||
}
|
||||
|
||||
void startWifiFramework() {
|
||||
ASSERT_EQ(std::system("svc wifi enable"), 0);
|
||||
// These tests don't care whether the framework
|
||||
// finished enabling or not.
|
||||
}
|
||||
|
||||
void stopSupplicant() {
|
||||
DriverTool driver_tool;
|
||||
SupplicantManager supplicant_manager;
|
||||
|
||||
ASSERT_TRUE(supplicant_manager.StopSupplicant());
|
||||
ASSERT_TRUE(driver_tool.UnloadDriver());
|
||||
ASSERT_FALSE(supplicant_manager.IsSupplicantRunning());
|
||||
}
|
||||
|
||||
void startSupplicantAndWaitForHidlService() {
|
||||
initilializeDriverAndFirmware();
|
||||
|
||||
android::sp<ServiceNotificationListener> notification_listener =
|
||||
new ServiceNotificationListener();
|
||||
ASSERT_TRUE(notification_listener->registerForHidlServiceNotifications(
|
||||
kSupplicantServiceName));
|
||||
|
||||
SupplicantManager supplicant_manager;
|
||||
ASSERT_TRUE(supplicant_manager.StartSupplicant());
|
||||
ASSERT_TRUE(supplicant_manager.IsSupplicantRunning());
|
||||
|
||||
ASSERT_TRUE(
|
||||
notification_listener->waitForHidlService(200, kSupplicantServiceName));
|
||||
}
|
||||
|
||||
sp<ISupplicant> getSupplicant() {
|
||||
return ISupplicant::getService(kSupplicantServiceName);
|
||||
}
|
||||
|
||||
sp<ISupplicantStaIface> getSupplicantStaIface() {
|
||||
sp<ISupplicant> supplicant = getSupplicant();
|
||||
if (!supplicant.get()) {
|
||||
return nullptr;
|
||||
}
|
||||
ISupplicant::IfaceInfo info;
|
||||
if (!findIfaceOfType(supplicant, IfaceType::STA, &info)) {
|
||||
return nullptr;
|
||||
}
|
||||
bool operation_failed = false;
|
||||
sp<ISupplicantStaIface> sta_iface;
|
||||
supplicant->getInterface(info, [&](const SupplicantStatus& status,
|
||||
const sp<ISupplicantIface>& iface) {
|
||||
if (status.code != SupplicantStatusCode::SUCCESS) {
|
||||
operation_failed = true;
|
||||
return;
|
||||
}
|
||||
sta_iface = ISupplicantStaIface::castFrom(iface);
|
||||
});
|
||||
if (operation_failed) {
|
||||
return nullptr;
|
||||
}
|
||||
return sta_iface;
|
||||
}
|
||||
|
||||
sp<ISupplicantStaNetwork> createSupplicantStaNetwork() {
|
||||
sp<ISupplicantStaIface> sta_iface = getSupplicantStaIface();
|
||||
if (!sta_iface.get()) {
|
||||
return nullptr;
|
||||
}
|
||||
bool operation_failed = false;
|
||||
sp<ISupplicantStaNetwork> sta_network;
|
||||
sta_iface->addNetwork([&](const SupplicantStatus& status,
|
||||
const sp<ISupplicantNetwork>& network) {
|
||||
if (status.code != SupplicantStatusCode::SUCCESS) {
|
||||
operation_failed = true;
|
||||
return;
|
||||
}
|
||||
sta_network = ISupplicantStaNetwork::castFrom(network);
|
||||
});
|
||||
if (operation_failed) {
|
||||
return nullptr;
|
||||
}
|
||||
return sta_network;
|
||||
}
|
||||
|
||||
sp<ISupplicantP2pIface> getSupplicantP2pIface() {
|
||||
sp<ISupplicant> supplicant = getSupplicant();
|
||||
if (!supplicant.get()) {
|
||||
return nullptr;
|
||||
}
|
||||
ISupplicant::IfaceInfo info;
|
||||
if (!findIfaceOfType(supplicant, IfaceType::P2P, &info)) {
|
||||
return nullptr;
|
||||
}
|
||||
bool operation_failed = false;
|
||||
sp<ISupplicantP2pIface> p2p_iface;
|
||||
supplicant->getInterface(info, [&](const SupplicantStatus& status,
|
||||
const sp<ISupplicantIface>& iface) {
|
||||
if (status.code != SupplicantStatusCode::SUCCESS) {
|
||||
operation_failed = true;
|
||||
return;
|
||||
}
|
||||
p2p_iface = ISupplicantP2pIface::castFrom(iface);
|
||||
});
|
||||
if (operation_failed) {
|
||||
return nullptr;
|
||||
}
|
||||
return p2p_iface;
|
||||
}
|
||||
|
||||
bool turnOnExcessiveLogging() {
|
||||
sp<ISupplicant> supplicant = getSupplicant();
|
||||
if (!supplicant.get()) {
|
||||
return false;
|
||||
}
|
||||
bool operation_failed = false;
|
||||
supplicant->setDebugParams(
|
||||
ISupplicant::DebugLevel::EXCESSIVE,
|
||||
true, // show timestamps
|
||||
true, // show keys
|
||||
[&](const SupplicantStatus& status) {
|
||||
if (status.code != SupplicantStatusCode::SUCCESS) {
|
||||
operation_failed = true;
|
||||
}
|
||||
});
|
||||
return !operation_failed;
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef SUPPLICANT_HIDL_TEST_UTILS_H
|
||||
#define SUPPLICANT_HIDL_TEST_UTILS_H
|
||||
|
||||
#include <android/hardware/wifi/supplicant/1.0/ISupplicant.h>
|
||||
#include <android/hardware/wifi/supplicant/1.0/ISupplicantP2pIface.h>
|
||||
#include <android/hardware/wifi/supplicant/1.0/ISupplicantStaIface.h>
|
||||
#include <android/hardware/wifi/supplicant/1.0/ISupplicantStaNetwork.h>
|
||||
|
||||
// Used to stop the android wifi framework before every test.
|
||||
void stopWifiFramework();
|
||||
void startWifiFramework();
|
||||
void stopSupplicant();
|
||||
// Used to configure the chip, driver and start wpa_supplicant before every
|
||||
// test.
|
||||
void startSupplicantAndWaitForHidlService();
|
||||
|
||||
// Helper functions to obtain references to the various HIDL interface objects.
|
||||
// Note: We only have a single instance of each of these objects currently.
|
||||
// These helper functions should be modified to return vectors if we support
|
||||
// multiple instances.
|
||||
android::sp<android::hardware::wifi::supplicant::V1_0::ISupplicant>
|
||||
getSupplicant();
|
||||
android::sp<android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface>
|
||||
getSupplicantStaIface();
|
||||
android::sp<android::hardware::wifi::supplicant::V1_0::ISupplicantStaNetwork>
|
||||
createSupplicantStaNetwork();
|
||||
android::sp<android::hardware::wifi::supplicant::V1_0::ISupplicantP2pIface>
|
||||
getSupplicantP2pIface();
|
||||
|
||||
bool turnOnExcessiveLogging();
|
||||
|
||||
#endif /* SUPPLICANT_HIDL_TEST_UTILS_H */
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
/*
|
||||
* Create:
|
||||
* Ensures that an instance of the ISupplicantP2pIface proxy object is
|
||||
* successfully created.
|
||||
*/
|
||||
TEST(SupplicantP2pIfaceHidlTestNoFixture, Create) {
|
||||
startSupplicantAndWaitForHidlService();
|
||||
EXPECT_NE(nullptr, getSupplicantP2pIface().get());
|
||||
stopSupplicant();
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
/*
|
||||
* Create:
|
||||
* Ensures that an instance of the ISupplicantStaIface proxy object is
|
||||
* successfully created.
|
||||
*/
|
||||
TEST(SupplicantStaIfaceHidlTestNoFixture, Create) {
|
||||
startSupplicantAndWaitForHidlService();
|
||||
EXPECT_NE(nullptr, getSupplicantStaIface().get());
|
||||
stopSupplicant();
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2016 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "supplicant_hidl_test_utils.h"
|
||||
|
||||
/*
|
||||
* Create:
|
||||
* Ensures that an instance of the ISupplicantStaNetwork proxy object is
|
||||
* successfully created.
|
||||
*/
|
||||
TEST(SupplicantStaNetworkHidlTestNoFixture, Create) {
|
||||
startSupplicantAndWaitForHidlService();
|
||||
EXPECT_NE(nullptr, createSupplicantStaNetwork().get());
|
||||
stopSupplicant();
|
||||
}
|
Loading…
Reference in a new issue