mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
[BLE Refactor] Add Base64 encoder to BleAdvertisementHeader
PiperOrigin-RevId: 453567012
This commit is contained in:
committed by
Copybara-Service
parent
199bbc9cd1
commit
9069451c08
@@ -20,6 +20,7 @@
|
||||
#include <utility>
|
||||
|
||||
#include "absl/strings/str_cat.h"
|
||||
#include "internal/platform/base64_utils.h"
|
||||
#include "internal/platform/base_input_stream.h"
|
||||
#include "internal/platform/logging.h"
|
||||
|
||||
@@ -54,24 +55,25 @@ BleAdvertisementHeader::BleAdvertisementHeader(
|
||||
|
||||
BleAdvertisementHeader::BleAdvertisementHeader(
|
||||
const ByteArray &ble_advertisement_header_bytes) {
|
||||
if (ble_advertisement_header_bytes.Empty()) {
|
||||
ByteArray advertisement_header_bytes =
|
||||
Base64Utils::Decode(ble_advertisement_header_bytes.AsStringView());
|
||||
if (advertisement_header_bytes.Empty()) {
|
||||
NEARBY_LOG(
|
||||
ERROR,
|
||||
"Cannot deserialize BLEAdvertisementHeader: failed Base64 decoding");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ble_advertisement_header_bytes.size() < kMinAdvertisementHeaderLength) {
|
||||
if (advertisement_header_bytes.size() < kMinAdvertisementHeaderLength) {
|
||||
NEARBY_LOG(ERROR,
|
||||
"Cannot deserialize BleAdvertisementHeader: expecting min %u "
|
||||
"raw bytes, got %" PRIu64 " instead",
|
||||
kMinAdvertisementHeaderLength,
|
||||
ble_advertisement_header_bytes.size());
|
||||
advertisement_header_bytes.size());
|
||||
return;
|
||||
}
|
||||
|
||||
ByteArray advertisement_header_bytes{ble_advertisement_header_bytes};
|
||||
BaseInputStream base_input_stream{advertisement_header_bytes};
|
||||
BaseInputStream base_input_stream(advertisement_header_bytes);
|
||||
// The first 1 byte is supposed to be the version and number of slots.
|
||||
auto version_and_num_slots_byte =
|
||||
static_cast<char>(base_input_stream.ReadUint8());
|
||||
@@ -138,7 +140,7 @@ BleAdvertisementHeader::operator ByteArray() const {
|
||||
std::string(psm_bytes));
|
||||
// clang-format on
|
||||
|
||||
return ByteArray(std::move(out));
|
||||
return ByteArray(Base64Utils::Encode(ByteArray(std::move(out))));
|
||||
}
|
||||
|
||||
bool BleAdvertisementHeader::operator==(
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/hash/hash_testing.h"
|
||||
#include "internal/platform/base64_utils.h"
|
||||
|
||||
namespace location {
|
||||
namespace nearby {
|
||||
@@ -34,12 +35,12 @@ constexpr absl::string_view kServiceIDBloomFilter{
|
||||
constexpr absl::string_view kAdvertisementHash{"\x0a\x0b\x0c\x0d"};
|
||||
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionWorks) {
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
|
||||
EXPECT_TRUE(ble_advertisement_header.IsValid());
|
||||
EXPECT_EQ(kVersion, ble_advertisement_header.GetVersion());
|
||||
@@ -55,12 +56,11 @@ TEST(BleAdvertisementHeaderTest, ConstructionWorks) {
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFailsWithBadVersion) {
|
||||
auto bad_version = static_cast<BleAdvertisementHeader::Version>(666);
|
||||
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
bad_version, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
bad_version, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue);
|
||||
|
||||
EXPECT_FALSE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -68,12 +68,12 @@ TEST(BleAdvertisementHeaderTest, ConstructionFailsWithBadVersion) {
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionSucceedsWithZeroNumSlot) {
|
||||
int num_slot = 0;
|
||||
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, num_slot, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, num_slot, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
|
||||
EXPECT_TRUE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -81,12 +81,12 @@ TEST(BleAdvertisementHeaderTest, ConstructionSucceedsWithZeroNumSlot) {
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFailsWithNegativeNumSlot) {
|
||||
int num_slot = -1;
|
||||
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, num_slot, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, num_slot, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
|
||||
EXPECT_FALSE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -95,13 +95,12 @@ TEST(BleAdvertisementHeaderTest,
|
||||
ConstructionFailsWithShortServiceIdBloomFilter) {
|
||||
char short_service_id_bloom_filter[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09";
|
||||
|
||||
ByteArray short_service_id_bloom_filter_bytes{short_service_id_bloom_filter};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray short_service_id_bloom_filter_bytes(short_service_id_bloom_filter);
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false,
|
||||
kNumSlots, short_service_id_bloom_filter_bytes,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, short_service_id_bloom_filter_bytes,
|
||||
advertisement_hash, kPsmValue);
|
||||
|
||||
EXPECT_FALSE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -112,11 +111,11 @@ TEST(BleAdvertisementHeaderTest,
|
||||
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b";
|
||||
|
||||
ByteArray service_id_bloom_filter{long_service_id_bloom_filter};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
|
||||
EXPECT_FALSE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -124,12 +123,12 @@ TEST(BleAdvertisementHeaderTest,
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFailsWithShortAdvertisementHash) {
|
||||
char short_advertisement_hash[] = "\x0a\x0b\x0c";
|
||||
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{short_advertisement_hash};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash(short_advertisement_hash);
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
|
||||
EXPECT_FALSE(ble_advertisement_header.IsValid());
|
||||
}
|
||||
@@ -137,8 +136,8 @@ TEST(BleAdvertisementHeaderTest, ConstructionFailsWithShortAdvertisementHash) {
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFailsWithLongAdvertisementHash) {
|
||||
char long_advertisement_hash[] = "\x0a\x0b\x0c\x0d\x0e";
|
||||
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{long_advertisement_hash};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash(long_advertisement_hash);
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
@@ -147,16 +146,16 @@ TEST(BleAdvertisementHeaderTest, ConstructionFailsWithLongAdvertisementHash) {
|
||||
}
|
||||
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFromSerializedStringWorks) {
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader org_ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader org_ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
auto ble_advertisement_header_bytes = ByteArray(org_ble_advertisement_header);
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
ble_advertisement_header_bytes};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
ble_advertisement_header_bytes);
|
||||
|
||||
EXPECT_TRUE(ble_advertisement_header.IsValid());
|
||||
EXPECT_EQ(kVersion, ble_advertisement_header.GetVersion());
|
||||
@@ -169,51 +168,20 @@ TEST(BleAdvertisementHeaderTest, ConstructionFromSerializedStringWorks) {
|
||||
EXPECT_EQ(kPsmValue, ble_advertisement_header.GetPsm());
|
||||
}
|
||||
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFromExtraBytesWorks) {
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFromDecodedByteArrayFails) {
|
||||
ByteArray service_id_bloom_filter((std::string(kServiceIDBloomFilter)));
|
||||
ByteArray advertisement_hash((std::string(kAdvertisementHash)));
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
BleAdvertisementHeader ble_advertisement_header(
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter, advertisement_hash,
|
||||
kPsmValue);
|
||||
auto ble_advertisement_header_bytes = ByteArray(ble_advertisement_header);
|
||||
|
||||
ByteArray long_ble_advertisement_header_bytes{
|
||||
ble_advertisement_header_bytes.size() + 1};
|
||||
long_ble_advertisement_header_bytes.CopyAt(0, ble_advertisement_header_bytes);
|
||||
// Decode the returned byte array and input as a parameter by construction.
|
||||
BleAdvertisementHeader failed_ble_advertisement_header(
|
||||
Base64Utils::Decode(ble_advertisement_header_bytes.AsStringView()));
|
||||
|
||||
BleAdvertisementHeader long_ble_advertisement_header{
|
||||
long_ble_advertisement_header_bytes};
|
||||
|
||||
EXPECT_TRUE(long_ble_advertisement_header.IsValid());
|
||||
EXPECT_EQ(kVersion, long_ble_advertisement_header.GetVersion());
|
||||
EXPECT_FALSE(ble_advertisement_header.IsSupportExtendedAdvertisement());
|
||||
EXPECT_EQ(kNumSlots, long_ble_advertisement_header.GetNumSlots());
|
||||
EXPECT_EQ(service_id_bloom_filter,
|
||||
long_ble_advertisement_header.GetServiceIdBloomFilter());
|
||||
EXPECT_EQ(advertisement_hash,
|
||||
long_ble_advertisement_header.GetAdvertisementHash());
|
||||
EXPECT_EQ(kPsmValue, long_ble_advertisement_header.GetPsm());
|
||||
}
|
||||
|
||||
TEST(BleAdvertisementHeaderTest, ConstructionFromShortLengthFails) {
|
||||
ByteArray service_id_bloom_filter{std::string(kServiceIDBloomFilter)};
|
||||
ByteArray advertisement_hash{std::string(kAdvertisementHash)};
|
||||
|
||||
BleAdvertisementHeader ble_advertisement_header{
|
||||
kVersion, false, kNumSlots, service_id_bloom_filter,
|
||||
advertisement_hash, kPsmValue};
|
||||
auto ble_advertisement_header_bytes = ByteArray(ble_advertisement_header);
|
||||
|
||||
ByteArray short_ble_advertisement_header_bytes{
|
||||
ble_advertisement_header_bytes.size() - 3};
|
||||
short_ble_advertisement_header_bytes.CopyAt(0,
|
||||
ble_advertisement_header_bytes);
|
||||
|
||||
BleAdvertisementHeader short_ble_advertisement_header{
|
||||
short_ble_advertisement_header_bytes};
|
||||
|
||||
EXPECT_FALSE(short_ble_advertisement_header.IsValid());
|
||||
EXPECT_FALSE(failed_ble_advertisement_header.IsValid());
|
||||
}
|
||||
|
||||
TEST(BleAdvertisementHeaderTest, Hash) {
|
||||
|
||||
Reference in New Issue
Block a user