scan_utils_unittest.cpp revision 13b4064f889935091b0d55bbb056ec143972a9a4
165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang/* 265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * Copyright (C) 2016, The Android Open Source Project 365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * 465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * Licensed under the Apache License, Version 2.0 (the "License"); 565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * you may not use this file except in compliance with the License. 665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * You may obtain a copy of the License at 765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * 865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * http://www.apache.org/licenses/LICENSE-2.0 965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * 1065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * Unless required by applicable law or agreed to in writing, software 1165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * distributed under the License is distributed on an "AS IS" BASIS, 1265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * See the License for the specific language governing permissions and 1465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang * limitations under the License. 1565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang */ 1665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 1765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <functional> 1865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <memory> 1965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <vector> 2065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 2165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <linux/netlink.h> 2265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <linux/nl80211.h> 2365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 2465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include <gtest/gtest.h> 2565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 2665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include "wificond/scanning/scan_result.h" 2765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include "wificond/scanning/scan_utils.h" 2865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang#include "wificond/tests/mock_netlink_manager.h" 2965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 3065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing std::bind; 3165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing std::placeholders::_1; 3265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing std::placeholders::_2; 3365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing std::unique_ptr; 3465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing std::vector; 3565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing testing::Invoke; 3665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing testing::NiceMock; 3765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing testing::Return; 3865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing testing::_; 3965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 4065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangusing com::android::server::wifi::wificond::NativeScanResult; 4165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 4265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangnamespace android { 4365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangnamespace wificond { 4465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 4565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangnamespace { 4665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 4765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangconstexpr uint32_t kFakeInterfaceIndex = 12; 4865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangconstexpr uint32_t kFakeScheduledScanIntervalMs = 20000; 4965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangconstexpr uint32_t kFakeSequenceNumber = 1984; 5065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangconstexpr int kFakeErrorCode = EIO; 5165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangconstexpr int32_t kFakeRssiThreshold = -80; 5213b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wangconstexpr bool kFakeUseRandomMAC = true; 5365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 5465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// Currently, control messages are only created by the kernel and sent to us. 5565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// Therefore NL80211Packet doesn't have corresponding constructor. 5665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// For test we manually create control messages using this helper function. 5765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangNL80211Packet CreateControlMessageError(int error_code) { 5865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang vector<uint8_t> data; 5965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang data.resize(NLMSG_HDRLEN + NLA_ALIGN(sizeof(int)), 0); 6065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // Initialize length field. 6165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang nlmsghdr* nl_header = reinterpret_cast<nlmsghdr*>(data.data()); 6265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang nl_header->nlmsg_len = data.size(); 6365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang nl_header->nlmsg_type = NLMSG_ERROR; 6465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang nl_header->nlmsg_seq = kFakeSequenceNumber; 6565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang nl_header->nlmsg_pid = getpid(); 6665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang int* error_field = reinterpret_cast<int*>(data.data() + NLMSG_HDRLEN); 6765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang *error_field = -error_code; 6865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 6965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang return NL80211Packet(data); 7065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 7165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 7265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangNL80211Packet CreateControlMessageAck() { 7365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang return CreateControlMessageError(0); 7465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 7565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 7665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// This is a helper function to mock the behavior of NetlinkManager:: 7765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// SendMessageAndGetResponses() when we expect a single packet response. 7865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// |request_message| and |response| are mapped to existing parameters of 7965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// SendMessageAndGetResponses(). 8065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// |mock_response| and |mock_return value| are additional parameters used 8165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang// for specifying expected results, 8265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangbool AppendMessageAndReturn( 8365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet& mock_response, 8465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang bool mock_return_value, 8565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang const NL80211Packet& request_message, 8665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang vector<std::unique_ptr<const NL80211Packet>>* response) { 8765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang response->push_back(std::make_unique<NL80211Packet>(mock_response)); 8865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang return mock_return_value; 8965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 9065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 9165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} // namespace 9265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 9365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wangclass ScanUtilsTest : public ::testing::Test { 9465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang protected: 9565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang virtual void SetUp() { 9665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang ON_CALL(netlink_manager_, 9765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses(_, _)).WillByDefault(Return(true)); 9865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang } 9965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 10065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NiceMock<MockNetlinkManager> netlink_manager_; 10165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang ScanUtils scan_utils_{&netlink_manager_}; 10265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang}; 10365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 10465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangMATCHER_P(DoesNL80211PacketMatchCommand, command, 10565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang "Check if the netlink packet matches |command|") { 10665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang return arg.GetCommand() == command; 10765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 10865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 10965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanGetScanResult) { 11065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang vector<NativeScanResult> scan_results; 11165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 11265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 11365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 11465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_GET_SCAN), _)); 11565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 11665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // We don't use EXPECT_TRUE here because we need to mock a complete 11765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // response for NL80211_CMD_GET_SCAN to satisfy the parsing code called 11865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // by GetScanResult. 11965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // TODO(b/34231002): Mock response for NL80211_CMD_GET_SCAN. 12065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // TODO(b/34231420): Add validation of interface index. 12165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang scan_utils_.GetScanResult(kFakeInterfaceIndex, &scan_results); 12265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 12365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 12465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanSendScanRequest) { 12565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageAck(); 12665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 12765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 12865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 12965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)). 13065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 13165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 13265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 13313b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang EXPECT_TRUE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC, {}, {})); 13465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // TODO(b/34231420): Add validation of requested scan ssids, threshold, 13565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // and frequencies. 13665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 13765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 13865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanHandleScanRequestFailure) { 13965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageError(kFakeErrorCode); 14065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 14165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 14265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 14365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)). 14465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 14565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 14613b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang EXPECT_FALSE(scan_utils_.Scan(kFakeInterfaceIndex, kFakeUseRandomMAC, {}, {})); 14765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 14865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 14965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanSendSchedScanRequest) { 15065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageAck(); 15165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 15265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 15365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 15465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_START_SCHED_SCAN), _)). 15565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 15665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 15765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_TRUE(scan_utils_.StartScheduledScan( 15865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang kFakeInterfaceIndex, 15913b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang kFakeScheduledScanIntervalMs, 16013b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang kFakeRssiThreshold, kFakeUseRandomMAC, {}, {}, {})); 16165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // TODO(b/34231420): Add validation of requested scan ssids, threshold, 16265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang // and frequencies. 16365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 16465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 16565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanHandleSchedScanRequestFailure) { 16665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageError(kFakeErrorCode); 16765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 16865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 16965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 17065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_START_SCHED_SCAN), _)). 17165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 17265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 17365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_FALSE(scan_utils_.StartScheduledScan( 17465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang kFakeInterfaceIndex, 17513b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang kFakeScheduledScanIntervalMs, 17613b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang kFakeRssiThreshold, kFakeUseRandomMAC, {}, {}, {})); 17765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 17865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 17965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanSendFullScanRequest) { 18065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageAck(); 18165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 18265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 18365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 18465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)). 18565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 18665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 18713b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang EXPECT_TRUE(scan_utils_.StartFullScan(kFakeInterfaceIndex, kFakeUseRandomMAC)); 18865b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 18965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 19065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan WangTEST_F(ScanUtilsTest, CanHandleFullScanRequestFailure) { 19165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang NL80211Packet response = CreateControlMessageError(kFakeErrorCode); 19265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang EXPECT_CALL( 19365b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang netlink_manager_, 19465b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang SendMessageAndGetResponses( 19565b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang DoesNL80211PacketMatchCommand(NL80211_CMD_TRIGGER_SCAN), _)). 19665b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang WillOnce(Invoke(bind( 19765b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang AppendMessageAndReturn, response, true, _1, _2))); 19813b4064f889935091b0d55bbb056ec143972a9a4Ningyuan Wang EXPECT_FALSE(scan_utils_.StartFullScan(kFakeInterfaceIndex, kFakeUseRandomMAC)); 19965b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} 20065b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang 20165b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} // namespace wificond 20265b365fe4b6a99f9dab98515c1b96bd725cb56a8Ningyuan Wang} // namespace android 203