chromium/chromecast/device/bluetooth/le/scan_filter_test.cc

// 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