blob: 537e7e3c75aebeff8ba4a00db31bc7532443c14b [file] [log] [blame]
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_bluetooth_sapphire/internal/host/common/device_address.h"
#include <map>
#include <unordered_map>
#include "pw_unit_test/framework.h"
namespace bt {
namespace {
// Initialize from bytes.
const DeviceAddress kClassic(DeviceAddress::Type::kBREDR,
{0x55, 0x44, 0x33, 0x22, 0x11, 0x41});
const DeviceAddress kPublic(DeviceAddress::Type::kLEPublic,
{0x42, 0x11, 0x22, 0x33, 0x44, 0x55});
const DeviceAddress kNonResolvable(DeviceAddress::Type::kLERandom,
{0x55, 0x44, 0x33, 0x22, 0x11, 0x00});
const DeviceAddress kResolvable(DeviceAddress::Type::kLERandom,
{0x55, 0x44, 0x33, 0x22, 0x11, 0x43});
const DeviceAddress kStatic(DeviceAddress::Type::kLERandom,
{0x55, 0x44, 0x33, 0x22, 0x11, 0xC3});
struct TestPayload {
uint8_t arg0;
DeviceAddressBytes bdaddr;
} __attribute__((packed));
TEST(DeviceAddressBytesTest, ToString) {
DeviceAddressBytes bdaddr({1, 15, 2, 255, 127, 3});
EXPECT_EQ("03:7F:FF:02:0F:01", bdaddr.ToString());
bdaddr = DeviceAddressBytes();
EXPECT_EQ("00:00:00:00:00:00", bdaddr.ToString());
}
TEST(DeviceAddressBytesTest, CastFromBytes) {
std::array<uint8_t, 7> bytes{{10, 1, 15, 2, 255, 127, 3}};
EXPECT_EQ(bytes.size(), sizeof(TestPayload));
auto* bdaddr = reinterpret_cast<DeviceAddressBytes*>(bytes.data());
EXPECT_EQ("7F:FF:02:0F:01:0A", bdaddr->ToString());
auto* test_payload = reinterpret_cast<TestPayload*>(bytes.data());
EXPECT_EQ(10, test_payload->arg0);
EXPECT_EQ("03:7F:FF:02:0F:01", test_payload->bdaddr.ToString());
}
TEST(DeviceAddressBytesTest, FromView) {
std::array<uint8_t, 6> buffer = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xAA};
auto bdaddr_view = pw::bluetooth::emboss::MakeBdAddrView(&buffer);
DeviceAddressBytes addr(bdaddr_view);
EXPECT_EQ("AA:FF:FF:FF:FF:FE", addr.ToString());
}
TEST(DeviceAddressBytesTest, ToView) {
DeviceAddressBytes addr = DeviceAddressBytes({0, 0, 0, 0, 0, 0});
EXPECT_EQ(addr.view().bd_addr().Read(), 0u);
addr = DeviceAddressBytes({0xfe, 0xff, 0xff, 0xff, 0xff, 0xff});
EXPECT_EQ(addr.view().bd_addr().Read(), 0xfffffffffffelu);
}
TEST(DeviceAddressBytesTest, Comparison) {
DeviceAddressBytes bdaddr0, bdaddr1;
EXPECT_EQ(bdaddr0, bdaddr1);
bdaddr0 = DeviceAddressBytes({1, 2, 3, 4, 5, 6});
EXPECT_NE(bdaddr0, bdaddr1);
bdaddr1 = bdaddr0;
EXPECT_EQ(bdaddr0, bdaddr1);
}
TEST(DeviceAddressTest, Comparison) {
DeviceAddress addr0, addr1;
EXPECT_EQ(addr0, addr1);
addr0 = DeviceAddress(DeviceAddress::Type::kBREDR, {1, 2, 3, 4, 5, 6});
EXPECT_NE(addr0, addr1);
addr1 = DeviceAddress(DeviceAddress::Type::kLEPublic, addr0.value());
EXPECT_EQ(addr0, addr1);
addr0 = DeviceAddress(DeviceAddress::Type::kLERandom, addr0.value());
EXPECT_NE(addr0, addr1);
}
TEST(DeviceAddressTest, Map) {
std::map<DeviceAddress, int> map;
DeviceAddress address1;
DeviceAddress address2(address1);
DeviceAddress address3(DeviceAddress::Type::kLEPublic, address1.value());
DeviceAddress address4(DeviceAddress::Type::kLEPublic, {1});
map[address1] = 1;
auto iter = map.find(address1);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address2);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address3);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address4);
EXPECT_EQ(map.end(), iter);
map[address3] = 2;
map[address4] = 3;
EXPECT_EQ(2u, map.size());
EXPECT_EQ(2, map[address1]);
EXPECT_EQ(2, map[address2]);
EXPECT_EQ(2, map[address3]);
EXPECT_EQ(3, map[address4]);
}
TEST(DeviceAddressTest, UnorderedMap) {
std::unordered_map<DeviceAddress, int> map;
DeviceAddress address1;
DeviceAddress address2(address1);
DeviceAddress address3(DeviceAddress::Type::kLEPublic, address1.value());
DeviceAddress address4(DeviceAddress::Type::kLEPublic, {1});
map[address1] = 1;
auto iter = map.find(address1);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address2);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address3);
EXPECT_NE(map.end(), iter);
EXPECT_EQ(1, iter->second);
iter = map.find(address4);
EXPECT_EQ(map.end(), iter);
map[address3] = 2;
map[address4] = 3;
EXPECT_EQ(2u, map.size());
EXPECT_EQ(2, map[address1]);
EXPECT_EQ(2, map[address2]);
EXPECT_EQ(2, map[address3]);
EXPECT_EQ(3, map[address4]);
}
TEST(DeviceAddressTest, IsResolvablePrivate) {
EXPECT_FALSE(kClassic.IsResolvablePrivate());
EXPECT_FALSE(kPublic.IsResolvablePrivate());
EXPECT_FALSE(kNonResolvable.IsResolvablePrivate());
EXPECT_TRUE(kResolvable.IsResolvablePrivate());
EXPECT_FALSE(kStatic.IsResolvablePrivate());
}
TEST(DeviceAddressTest, IsNonResolvablePrivate) {
EXPECT_FALSE(kClassic.IsNonResolvablePrivate());
EXPECT_FALSE(kPublic.IsNonResolvablePrivate());
EXPECT_TRUE(kNonResolvable.IsNonResolvablePrivate());
EXPECT_FALSE(kResolvable.IsNonResolvablePrivate());
EXPECT_FALSE(kStatic.IsNonResolvablePrivate());
}
TEST(DeviceAddressTest, IsStatic) {
EXPECT_FALSE(kClassic.IsStaticRandom());
EXPECT_FALSE(kPublic.IsStaticRandom());
EXPECT_FALSE(kNonResolvable.IsStaticRandom());
EXPECT_FALSE(kResolvable.IsStaticRandom());
EXPECT_TRUE(kStatic.IsStaticRandom());
}
TEST(DeviceAddressTest, IsPublic) {
EXPECT_TRUE(kClassic.IsPublic());
EXPECT_TRUE(kPublic.IsPublic());
EXPECT_FALSE(kNonResolvable.IsPublic());
EXPECT_FALSE(kResolvable.IsPublic());
EXPECT_FALSE(kStatic.IsPublic());
}
} // namespace
} // namespace bt