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 <memory> 18#include <vector> 19 20#include <gmock/gmock.h> 21#include <gtest/gtest.h> 22#include <wifi_system_test/mock_interface_tool.h> 23 24#include "wificond/client_interface_impl.h" 25#include "wificond/tests/mock_netlink_manager.h" 26#include "wificond/tests/mock_netlink_utils.h" 27#include "wificond/tests/mock_scan_utils.h" 28 29using android::wifi_system::MockInterfaceTool; 30using std::unique_ptr; 31using std::vector; 32using testing::NiceMock; 33using testing::Return; 34using testing::_; 35 36namespace android { 37namespace wificond { 38namespace { 39 40const uint32_t kTestWiphyIndex = 2; 41const char kTestInterfaceName[] = "testwifi0"; 42const uint32_t kTestInterfaceIndex = 42; 43const size_t kMacAddrLenBytes = ETH_ALEN; 44 45class ClientInterfaceImplTest : public ::testing::Test { 46 protected: 47 48 void SetUp() override { 49 EXPECT_CALL(*netlink_utils_, 50 SubscribeMlmeEvent(kTestInterfaceIndex, _)); 51 EXPECT_CALL(*netlink_utils_, 52 GetWiphyInfo(kTestWiphyIndex, _, _, _)); 53 client_interface_.reset(new ClientInterfaceImpl{ 54 kTestWiphyIndex, 55 kTestInterfaceName, 56 kTestInterfaceIndex, 57 vector<uint8_t>{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 58 if_tool_.get(), 59 netlink_utils_.get(), 60 scan_utils_.get()}); 61 } 62 63 void TearDown() override { 64 EXPECT_CALL(*netlink_utils_, 65 UnsubscribeMlmeEvent(kTestInterfaceIndex)); 66 } 67 68 unique_ptr<NiceMock<MockInterfaceTool>> if_tool_{ 69 new NiceMock<MockInterfaceTool>}; 70 unique_ptr<NiceMock<MockNetlinkManager>> netlink_manager_{ 71 new NiceMock<MockNetlinkManager>()}; 72 unique_ptr<NiceMock<MockNetlinkUtils>> netlink_utils_{ 73 new NiceMock<MockNetlinkUtils>(netlink_manager_.get())}; 74 unique_ptr<NiceMock<MockScanUtils>> scan_utils_{ 75 new NiceMock<MockScanUtils>(netlink_manager_.get())}; 76 unique_ptr<ClientInterfaceImpl> client_interface_; 77}; // class ClientInterfaceImplTest 78 79} // namespace 80 81TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInvalidInput) { 82 EXPECT_FALSE(client_interface_->SetMacAddress( 83 std::vector<uint8_t>(kMacAddrLenBytes - 1))); 84 EXPECT_FALSE(client_interface_->SetMacAddress( 85 std::vector<uint8_t>(kMacAddrLenBytes + 1))); 86} 87 88TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInterfaceDownFailure) { 89 EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(false)); 90 EXPECT_FALSE( 91 client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); 92} 93 94TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnAddressChangeFailure) { 95 EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); 96 EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(false)); 97 EXPECT_FALSE( 98 client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); 99} 100 101TEST_F(ClientInterfaceImplTest, SetMacAddressFailsOnInterfaceUpFailure) { 102 EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); 103 EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(true)); 104 EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(false)); 105 EXPECT_FALSE( 106 client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); 107} 108 109TEST_F(ClientInterfaceImplTest, SetMacAddressReturnsTrueOnSuccess) { 110 EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); 111 EXPECT_CALL(*if_tool_, SetMacAddress(_, _)).WillOnce(Return(true)); 112 EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(true)); 113 EXPECT_TRUE( 114 client_interface_->SetMacAddress(std::vector<uint8_t>(kMacAddrLenBytes))); 115} 116 117TEST_F(ClientInterfaceImplTest, SetMacAddressPassesCorrectAddressToIfTool) { 118 EXPECT_CALL(*if_tool_, SetWifiUpState(false)).WillOnce(Return(true)); 119 EXPECT_CALL(*if_tool_, SetMacAddress(_, 120 std::array<uint8_t, kMacAddrLenBytes>{{1, 2, 3, 4, 5, 6}})) 121 .WillOnce(Return(true)); 122 EXPECT_CALL(*if_tool_, SetWifiUpState(true)).WillOnce(Return(true)); 123 EXPECT_TRUE(client_interface_->SetMacAddress( 124 std::vector<uint8_t>{1, 2, 3, 4, 5, 6})); 125} 126 127} // namespace wificond 128} // namespace android 129