/* * 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 <memory> #include <vector> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <wifi_system_test/mock_interface_tool.h> #include "wificond/client_interface_impl.h" #include "wificond/tests/mock_netlink_manager.h" #include "wificond/tests/mock_netlink_utils.h" #include "wificond/tests/mock_scan_utils.h" using android::wifi_system::MockInterfaceTool; using std::unique_ptr; using std::vector; using testing::NiceMock; using testing::Return; using testing::_; namespace android { namespace wificond { namespace { const uint32_t kTestWiphyIndex = 2; const char kTestInterfaceName[] = "testwifi0"; const uint32_t kTestInterfaceIndex = 42; const size_t kMacAddrLenBytes = ETH_ALEN; class ClientInterfaceImplTest : public ::testing::Test { protected: void SetUp() override { EXPECT_CALL(*netlink_utils_, SubscribeMlmeEvent(kTestInterfaceIndex, _)); EXPECT_CALL(*netlink_utils_, GetWiphyInfo(kTestWiphyIndex, _, _, _)); client_interface_.reset(new ClientInterfaceImpl{ kTestWiphyIndex, kTestInterfaceName, kTestInterfaceIndex, vector<uint8_t>{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, if_tool_.get(), netlink_utils_.get(), scan_utils_.get()}); } void TearDown() override { EXPECT_CALL(*netlink_utils_, UnsubscribeMlmeEvent(kTestInterfaceIndex)); } unique_ptr<NiceMock<MockInterfaceTool>> if_tool_{ new NiceMock<MockInterfaceTool>}; unique_ptr<NiceMock<MockNetlinkManager>> netlink_manager_{ new NiceMock<MockNetlinkManager>()}; unique_ptr<NiceMock<MockNetlinkUtils>> netlink_utils_{ new NiceMock<MockNetlinkUtils>(netlink_manager_.get())}; unique_ptr<NiceMock<MockScanUtils>> scan_utils_{ new NiceMock<MockScanUtils>(netlink_manager_.get())}; unique_ptr<ClientInterfaceImpl> client_interface_; }; // class ClientInterfaceImplTest } // namespace TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInvalidInput) { EXPECT_FALSE(client_interface_->SetMacAddress( std::vector<uint8_t>(kMacAddrLenBytes - 1))); EXPECT_FALSE(client_interface_->SetMacAddress( std::vector<uint8_t>(kMacAddrLenBytes + 1))); } TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInterfaceDownFailure) { EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(false)); EXPECT_FALSE( client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); } TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnAddressChangeFailure) { EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(false)); EXPECT_FALSE( client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); } TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInterfaceUpFailure) { EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(false)); EXPECT_FALSE( client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); } TEST_F(ClientInterfaceImplTest, SetMacAddressReturnsTrueOnSuccess) { EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(true)); EXPECT_TRUE( client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); } TEST_F(ClientInterfaceImplTest, SetMacAddressPassesCorrectAddressToIfTool) { EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetMacAddress(_, std::array<uint8_t, kMacAddrLenBytes>{{1, 2, 3, 4, 5, 6}})) .WillOnce(Return(true)); EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(true)); EXPECT_TRUE(client_interface_->SetMacAddress( std::vector<uint8_t>{1, 2, 3, 4, 5, 6})); } } // namespace wificond } // namespace android