From 3f2cfb15316127c66b1f36ecdd292867be52e969 Mon Sep 17 00:00:00 2001 From: Anay Wadhera Date: Fri, 23 Sep 2022 11:15:44 -0700 Subject: [PATCH] Implement BluetoothConnectionInfo PiperOrigin-RevId: 476416765 --- Package.swift | 1 + internal/platform/BUILD | 7 ++ .../platform/bluetooth_connection_info.cc | 34 +++++++ internal/platform/bluetooth_connection_info.h | 65 +++++++++++++ .../bluetooth_connection_info_test.cc | 93 +++++++++++++++++++ 5 files changed, 200 insertions(+) create mode 100644 internal/platform/bluetooth_connection_info.cc create mode 100644 internal/platform/bluetooth_connection_info.h create mode 100644 internal/platform/bluetooth_connection_info_test.cc diff --git a/Package.swift b/Package.swift index 4913d6bf..917aacac 100644 --- a/Package.swift +++ b/Package.swift @@ -485,6 +485,7 @@ let package = Package( "internal/platform/condition_variable_test.cc", "internal/platform/thread_check_nocompile_test.py", "internal/platform/bluetooth_classic_test.cc", + "internal/platform/bluetooth_connection_info_test.cc", "internal/platform/mutex_test.cc", "internal/platform/atomic_reference_test.cc", "internal/platform/logging_test.cc", diff --git a/internal/platform/BUILD b/internal/platform/BUILD index 2dcda5a9..a28c7632 100644 --- a/internal/platform/BUILD +++ b/internal/platform/BUILD @@ -144,7 +144,11 @@ cc_library( cc_library( name = "connection_info", + srcs = [ + "bluetooth_connection_info.cc", + ], hdrs = [ + "bluetooth_connection_info.h", "connection_info.h", ], defines = ["NO_WEBRTC"], @@ -155,6 +159,7 @@ cc_library( ], deps = [ "//internal/platform:base", + "@com_google_absl//absl/strings", ], ) @@ -407,6 +412,7 @@ cc_test( "ble_v2_test.cc", "bluetooth_adapter_test.cc", "bluetooth_classic_test.cc", + "bluetooth_connection_info_test.cc", "cancelable_alarm_test.cc", "condition_variable_test.cc", "count_down_latch_test.cc", @@ -432,6 +438,7 @@ cc_test( deps = [ ":base", ":comm", + ":connection_info", ":logging", ":test_util", ":types", diff --git a/internal/platform/bluetooth_connection_info.cc b/internal/platform/bluetooth_connection_info.cc new file mode 100644 index 00000000..b133ec6c --- /dev/null +++ b/internal/platform/bluetooth_connection_info.cc @@ -0,0 +1,34 @@ +// Copyright 2022 Google LLC +// +// 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 "internal/platform/bluetooth_connection_info.h" + +#include +#include + +namespace location { +namespace nearby { + +ByteArray BluetoothConnectionInfo::ToBytes() const { + return ByteArray(absl::StrCat(mac_address_.AsStringView(), service_id_)); +} + +BluetoothConnectionInfo BluetoothConnectionInfo::FromBytes(ByteArray bytes) { + std::string serial(bytes.AsStringView()); + ByteArray mac_address = ByteArray(serial.substr(0, kMacAddressLength)); + std::string service_id = serial.substr(kMacAddressLength); + return BluetoothConnectionInfo(mac_address, service_id); +} +} // namespace nearby +} // namespace location diff --git a/internal/platform/bluetooth_connection_info.h b/internal/platform/bluetooth_connection_info.h new file mode 100644 index 00000000..34aff091 --- /dev/null +++ b/internal/platform/bluetooth_connection_info.h @@ -0,0 +1,65 @@ +// Copyright 2022 Google LLC +// +// 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. + +#ifndef THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_BLUETOOTH_CONNECTION_INFO_H_ +#define THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_BLUETOOTH_CONNECTION_INFO_H_ + +#include + +#include "absl/strings/string_view.h" +#include "internal/platform/byte_array.h" +#include "internal/platform/connection_info.h" + +namespace location { +namespace nearby { + +constexpr int kMacAddressLength = 6; + +class BluetoothConnectionInfo : public ConnectionInfo { + public: + MediumType GetMediumType() const override { return MediumType::kBluetooth; } + ByteArray ToBytes() const override; + BluetoothConnectionInfo() = delete; + explicit BluetoothConnectionInfo(const ByteArray& mac_address, + absl::string_view service_id) + : mac_address_(mac_address), service_id_(std::string(service_id)) {} + + BluetoothConnectionInfo(BluetoothConnectionInfo const& info) { + mac_address_ = info.mac_address_; + service_id_ = info.service_id_; + } + static BluetoothConnectionInfo FromBytes(ByteArray bytes); + ByteArray GetMacAddress() const { return mac_address_; } + absl::string_view GetServiceId() const { return service_id_; } + + private: + ByteArray mac_address_; + std::string service_id_; +}; + +inline bool operator==(const BluetoothConnectionInfo& a, + const BluetoothConnectionInfo& b) { + return a.GetMacAddress() == b.GetMacAddress() && + a.GetServiceId() == b.GetServiceId(); +} + +inline bool operator!=(const BluetoothConnectionInfo& a, + const BluetoothConnectionInfo& b) { + return !(a == b); +} + +} // namespace nearby +} // namespace location + +#endif // THIRD_PARTY_NEARBY_INTERNAL_PLATFORM_BLUETOOTH_CONNECTION_INFO_H_ diff --git a/internal/platform/bluetooth_connection_info_test.cc b/internal/platform/bluetooth_connection_info_test.cc new file mode 100644 index 00000000..64bcc790 --- /dev/null +++ b/internal/platform/bluetooth_connection_info_test.cc @@ -0,0 +1,93 @@ +// Copyright 2022 Google LLC +// +// 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 "internal/platform/bluetooth_connection_info.h" + +#include + +#include "gmock/gmock.h" +#include "protobuf-matchers/protocol-buffer-matchers.h" +#include "gtest/gtest.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" + +namespace location { +namespace nearby { +namespace { + +constexpr absl::string_view kMacAddr = "\x4C\x8B\x1D\xCE\xBA\xD1"; +constexpr absl::string_view kServiceId{"NearbyConnectTest12"}; + +TEST(BluetoothConnectionInfoTest, TestMediumType) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + EXPECT_EQ(info.GetMediumType(), + BluetoothConnectionInfo::MediumType::kBluetooth); +} + +TEST(BluetoothConnectionInfoTest, TestToBytes) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + ByteArray serialized_expected = + ByteArray(absl::StrCat(kMacAddr, kServiceId)); + EXPECT_EQ(info.ToBytes(), serialized_expected); +} + +TEST(BluetoothConnectionInfoTest, TestFromBytes) { + std::string macAddr(kMacAddr); + ByteArray serialized = + ByteArray(absl::StrCat(macAddr, kServiceId)); + BluetoothConnectionInfo info = BluetoothConnectionInfo::FromBytes(serialized); + EXPECT_EQ(info.GetMacAddress(), ByteArray(macAddr)); + EXPECT_EQ(info.GetServiceId(), kServiceId); +} + +TEST(BluetoothConnectionInfoTest, TestGetMacAddress) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + EXPECT_EQ(info.GetMacAddress(), ByteArray(macAddr)); +} + +TEST(BluetoothConnectionInfoTest, TestGetServiceId) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + EXPECT_EQ(info.GetServiceId(), kServiceId); +} + +TEST(BluetoothConnectionInfoTest, TestToFromBytes) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + ByteArray serialized = info.ToBytes(); + BluetoothConnectionInfo result = + BluetoothConnectionInfo::FromBytes(serialized); + EXPECT_EQ(result, info); +} + +TEST(BluetoothConnectionInfoTest, TestCopy) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + BluetoothConnectionInfo copy(info); + EXPECT_EQ(info, copy); +} + +TEST(BluetoothConnectionInfoTest, TestEquals) { + std::string macAddr(kMacAddr); + BluetoothConnectionInfo info(ByteArray(macAddr), kServiceId); + BluetoothConnectionInfo info2(ByteArray(macAddr), kServiceId); + EXPECT_EQ(info, info2); +} + +} // namespace +} // namespace nearby +} // namespace location