// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/device/bluetooth/le/scan_filter.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromecast {
namespace bluetooth {
namespace {
const char kName[] = "foo";
const bluetooth_v2_shlib::Uuid kUuid = {{0x12, 0x3e, 0x45, 0x67, 0xe8, 0x9b,
0x12, 0xd3, 0xa4, 0x56, 0x42, 0x66,
0x55, 0x44, 0x00, 0x00}};
} // namespace
TEST(ScanFilterTest, Name) {
ScanFilter filter;
LeScanResult result;
EXPECT_TRUE(filter.Matches(result));
filter.name = kName;
EXPECT_FALSE(filter.Matches(result));
result.type_to_data[LeScanResult::kGapShortName].emplace_back(
reinterpret_cast<const uint8_t*>(kName),
reinterpret_cast<const uint8_t*>(kName) + strlen(kName));
EXPECT_TRUE(filter.Matches(result));
++result.type_to_data[LeScanResult::kGapShortName][0][0];
EXPECT_FALSE(filter.Matches(result));
}
TEST(ScanFilterTest, Uuid) {
ScanFilter filter;
filter.service_uuid = kUuid;
LeScanResult result;
EXPECT_FALSE(filter.Matches(result));
result.type_to_data[LeScanResult::kGapIncomplete128BitServiceUuids]
.emplace_back(kUuid.rbegin(), kUuid.rend());
EXPECT_TRUE(filter.Matches(result));
++result.type_to_data[LeScanResult::kGapIncomplete128BitServiceUuids][0][0];
EXPECT_FALSE(filter.Matches(result));
}
TEST(ScanFilterTest, NameAndUuid) {
ScanFilter filter;
filter.name = kName;
filter.service_uuid = kUuid;
LeScanResult result;
EXPECT_FALSE(filter.Matches(result));
result.type_to_data[LeScanResult::kGapShortName].emplace_back(
reinterpret_cast<const uint8_t*>(kName),
reinterpret_cast<const uint8_t*>(kName) + strlen(kName));
EXPECT_FALSE(filter.Matches(result));
result.type_to_data[LeScanResult::kGapIncomplete128BitServiceUuids]
.emplace_back(kUuid.rbegin(), kUuid.rend());
EXPECT_TRUE(filter.Matches(result));
// Unmatching name shouldn't work.
--result.type_to_data[LeScanResult::kGapShortName][0][0];
EXPECT_FALSE(filter.Matches(result));
// Unmatching uuid shouldn't work.
++result.type_to_data[LeScanResult::kGapIncomplete128BitServiceUuids][0][0];
++result.type_to_data[LeScanResult::kGapShortName][0][0];
EXPECT_FALSE(filter.Matches(result));
--result.type_to_data[LeScanResult::kGapIncomplete128BitServiceUuids][0][0];
EXPECT_TRUE(filter.Matches(result));
}
TEST(ScanFilterTest, RegexName) {
const char kHello[] = "hello";
// Just test some basic regular experssions, we don't want this to be testing
// RE2.
ScanFilter filter;
filter.regex_name = "ell";
LeScanResult result;
EXPECT_FALSE(filter.Matches(result));
result.type_to_data[LeScanResult::kGapShortName].emplace_back(
reinterpret_cast<const uint8_t*>(kHello),
reinterpret_cast<const uint8_t*>(kHello) + strlen(kHello));
EXPECT_TRUE(filter.Matches(result));
filter.regex_name = "g";
EXPECT_FALSE(filter.Matches(result));
filter.regex_name = "h.*o";
EXPECT_TRUE(filter.Matches(result));
}
TEST(ScanFilterTest, RegexNameIgnoredIfNameSet) {
ScanFilter filter;
filter.regex_name = "."; // Match any string.
filter.name = "bar";
LeScanResult result;
result.type_to_data[LeScanResult::kGapShortName].emplace_back(
reinterpret_cast<const uint8_t*>(kName),
reinterpret_cast<const uint8_t*>(kName) + strlen(kName));
EXPECT_FALSE(filter.Matches(result));
filter.name = kName;
EXPECT_TRUE(filter.Matches(result));
}
} // namespace bluetooth
} // namespace chromecast