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