blob: 53c19acebf98c868d4ff750f1d14c1798fc965a1 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdint.h>
#include <memory>
#include "base/macros.h"
#include "device/bluetooth/bluetooth_common.h"
#include "device/bluetooth/bluetooth_discovery_session.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const device::BluetoothUUID uuid1003("1003");
const device::BluetoothUUID uuid1004("1004");
const device::BluetoothUUID uuid1020("1020");
} // namespace
namespace device {
TEST(BluetoothDiscoveryFilterTest, Equal) {
BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
df1.SetRSSI(-65);
df1.AddUUID(uuid1020);
df1.AddUUID(uuid1003);
BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_CLASSIC);
df2.SetRSSI(-65);
df2.AddUUID(uuid1020);
df2.AddUUID(uuid1004);
// uuids are not same, so should fail
ASSERT_FALSE(df1.Equals(df2));
// make filters equal
df1.AddUUID(uuid1004);
df2.AddUUID(uuid1003);
ASSERT_TRUE(df1.Equals(df2));
// now transport don't match
df1.SetTransport(BLUETOOTH_TRANSPORT_LE);
ASSERT_FALSE(df1.Equals(df2));
// now everything is back matching
df1.SetTransport(BLUETOOTH_TRANSPORT_CLASSIC);
ASSERT_TRUE(df1.Equals(df2));
// now rssi don't match
df1.SetRSSI(-30);
ASSERT_FALSE(df1.Equals(df2));
BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_CLASSIC);
df3.SetPathloss(45);
df3.AddUUID(uuid1020);
df3.AddUUID(uuid1003);
df3.AddUUID(uuid1004);
// Having Pathloss and RSSI set in two different filter makes them unequal.
ASSERT_FALSE(df1.Equals(df3));
}
TEST(BluetoothDiscoveryFilterTest, CopyFrom) {
BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
df1.SetRSSI(-65);
df1.AddUUID(uuid1020);
df1.AddUUID(uuid1003);
BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_CLASSIC);
df2.CopyFrom(df1);
int16_t out_rssi;
std::set<device::BluetoothUUID> out_uuids;
// make sure all properties were copied
df2.GetRSSI(&out_rssi);
EXPECT_EQ(-65, out_rssi);
EXPECT_EQ(BLUETOOTH_TRANSPORT_CLASSIC, df2.GetTransport());
df2.GetUUIDs(out_uuids);
EXPECT_TRUE(out_uuids.find(uuid1020) != out_uuids.end());
EXPECT_TRUE(out_uuids.find(uuid1003) != out_uuids.end());
}
TEST(BluetoothDiscoveryFilterTest, MergeUUIDs) {
BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_LE);
df1.AddUUID(uuid1020);
df1.AddUUID(uuid1003);
BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
df2.AddUUID(uuid1020);
df2.AddUUID(uuid1004);
std::unique_ptr<BluetoothDiscoveryFilter> df3 =
BluetoothDiscoveryFilter::Merge(&df1, &df2);
// df3 should contain all uuids from df1 and df2
std::set<device::BluetoothUUID> out_uuids;
df3->GetUUIDs(out_uuids);
EXPECT_TRUE(out_uuids.find(uuid1020) != out_uuids.end());
EXPECT_TRUE(out_uuids.find(uuid1003) != out_uuids.end());
EXPECT_TRUE(out_uuids.find(uuid1004) != out_uuids.end());
// Merging with empty filter would return empty filter
df3 = BluetoothDiscoveryFilter::Merge(&df1, nullptr);
df3->GetUUIDs(out_uuids);
EXPECT_EQ(0UL, out_uuids.size());
EXPECT_TRUE(df3->IsDefault());
}
TEST(BluetoothDiscoveryFilterTest, MergeProximity) {
BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_LE);
df1.SetRSSI(-50);
BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
df2.SetRSSI(-70);
BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_LE);
df3.SetPathloss(70);
BluetoothDiscoveryFilter df4(BLUETOOTH_TRANSPORT_LE);
df4.SetPathloss(20);
std::unique_ptr<BluetoothDiscoveryFilter> result =
BluetoothDiscoveryFilter::Merge(&df1, &df2);
int16_t out_rssi;
// Merging RSSI should return smaller of both values
EXPECT_TRUE(result->GetRSSI(&out_rssi));
EXPECT_EQ(-70, out_rssi);
uint16_t out_pathloss;
// Merging RSSI with Pathloss should clear proximity
result = BluetoothDiscoveryFilter::Merge(&df1, &df3);
EXPECT_FALSE(result->GetRSSI(&out_rssi));
EXPECT_FALSE(result->GetPathloss(&out_pathloss));
// Merging Pathloss should return bigger of both values
result = BluetoothDiscoveryFilter::Merge(&df3, &df4);
EXPECT_TRUE(result->GetPathloss(&out_pathloss));
EXPECT_EQ(70, out_pathloss);
}
TEST(BluetoothDiscoveryFilterTest, MergeTransport) {
BluetoothDiscoveryFilter df1(BLUETOOTH_TRANSPORT_CLASSIC);
BluetoothDiscoveryFilter df2(BLUETOOTH_TRANSPORT_LE);
BluetoothDiscoveryFilter df3(BLUETOOTH_TRANSPORT_DUAL);
std::unique_ptr<BluetoothDiscoveryFilter> result =
BluetoothDiscoveryFilter::Merge(&df1, &df2);
// Merging LE and CLASSIC should result in both being set
EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, result->GetTransport());
result = BluetoothDiscoveryFilter::Merge(&df1, &df3);
EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, result->GetTransport());
// Merging with null should alway result with empty filter.
result = BluetoothDiscoveryFilter::Merge(&df1, nullptr);
EXPECT_TRUE(result->IsDefault());
}
} // namespace device