1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237 |
- // Copyright 2021 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 "ash/services/quick_pair/fast_pair_data_parser.h"
- #include <stddef.h>
- #include <iterator>
- #include "ash/quick_pair/common/fast_pair/fast_pair_service_data_creator.h"
- #include "ash/services/quick_pair/public/cpp/decrypted_passkey.h"
- #include "ash/services/quick_pair/public/cpp/decrypted_response.h"
- #include "ash/services/quick_pair/public/cpp/fast_pair_message_type.h"
- #include "ash/services/quick_pair/public/cpp/not_discoverable_advertisement.h"
- #include "ash/services/quick_pair/public/mojom/fast_pair_data_parser.mojom.h"
- #include "base/run_loop.h"
- #include "base/strings/string_number_conversions.h"
- #include "base/test/bind.h"
- #include "base/test/task_environment.h"
- #include "mojo/public/cpp/bindings/remote.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- #include "third_party/boringssl/src/include/openssl/aes.h"
- namespace {
- constexpr int kNotDiscoverableAdvHeader = 0b00000110;
- constexpr int kAccountKeyFilterHeader = 0b01100000;
- constexpr int kAccountKeyFilterNoNotificationHeader = 0b01100010;
- constexpr int kSaltHeader = 0b00010001;
- const std::vector<uint8_t> kSaltBytes = {0x01};
- const std::vector<uint8_t> kInvalidSaltBytes = {0x01, 0x02};
- const std::vector<uint8_t> kDeviceAddressBytes = {17, 18, 19, 20, 21, 22};
- constexpr int kBatteryHeader = 0b00110011;
- constexpr int kBatterHeaderNoNotification = 0b00110100;
- const std::string kModelId = "112233";
- const std::string kAccountKeyFilter = "112233445566";
- const std::string kSalt = "01";
- const std::string kInvalidSalt = "01020404050607";
- const std::string kBattery = "01048F";
- const std::string kDeviceAddress = "11:12:13:14:15:16";
- std::vector<uint8_t> aes_key_bytes = {0xA0, 0xBA, 0xF0, 0xBB, 0x95, 0x1F,
- 0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45,
- 0x61, 0xC3, 0x32, 0x1D};
- std::vector<uint8_t> EncryptBytes(const std::vector<uint8_t>& bytes) {
- AES_KEY aes_key;
- AES_set_encrypt_key(aes_key_bytes.data(), aes_key_bytes.size() * 8, &aes_key);
- uint8_t encrypted_bytes[16];
- AES_encrypt(bytes.data(), encrypted_bytes, &aes_key);
- return std::vector<uint8_t>(std::begin(encrypted_bytes),
- std::end(encrypted_bytes));
- }
- } // namespace
- namespace ash {
- namespace quick_pair {
- class FastPairDataParserTest : public testing::Test {
- public:
- void SetUp() override {
- data_parser_ = std::make_unique<FastPairDataParser>(
- remote_.BindNewPipeAndPassReceiver());
- }
- protected:
- base::test::TaskEnvironment task_environment_;
- mojo::Remote<mojom::FastPairDataParser> remote_;
- std::unique_ptr<FastPairDataParser> data_parser_;
- };
- TEST_F(FastPairDataParserTest, DecryptResponseUnsuccessfully) {
- std::vector<uint8_t> response_bytes = {/*message_type=*/0x02,
- /*address_bytes=*/0x02,
- 0x03,
- 0x04,
- 0x05,
- 0x06,
- 0x07,
- /*salt=*/0x08,
- 0x09,
- 0x0A,
- 0x0B,
- 0x0C,
- 0x0D,
- 0x0E,
- 0x0F,
- 0x00};
- std::vector<uint8_t> encrypted_bytes = EncryptBytes(response_bytes);
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](const absl::optional<DecryptedResponse>& response) {
- EXPECT_FALSE(response.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseDecryptedResponse(aes_key_bytes, encrypted_bytes,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, DecryptResponseSuccessfully) {
- std::vector<uint8_t> response_bytes;
- // Message type.
- uint8_t message_type = 0x01;
- response_bytes.push_back(message_type);
- // Address bytes.
- std::array<uint8_t, 6> address_bytes = {0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
- std::copy(address_bytes.begin(), address_bytes.end(),
- std::back_inserter(response_bytes));
- // Random salt
- std::array<uint8_t, 9> salt = {0x08, 0x09, 0x0A, 0x0B, 0x0C,
- 0x0D, 0x0E, 0x0F, 0x00};
- std::copy(salt.begin(), salt.end(), std::back_inserter(response_bytes));
- std::vector<uint8_t> encrypted_bytes = EncryptBytes(response_bytes);
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop, &address_bytes,
- &salt](const absl::optional<DecryptedResponse>& response) {
- EXPECT_TRUE(response.has_value());
- EXPECT_EQ(response->message_type,
- FastPairMessageType::kKeyBasedPairingResponse);
- EXPECT_EQ(response->address_bytes, address_bytes);
- EXPECT_EQ(response->salt, salt);
- run_loop.Quit();
- });
- data_parser_->ParseDecryptedResponse(aes_key_bytes, encrypted_bytes,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, DecryptPasskeyUnsuccessfully) {
- std::vector<uint8_t> passkey_bytes = {/*message_type=*/0x04,
- /*passkey=*/0x02,
- 0x03,
- 0x04,
- /*salt=*/0x05,
- 0x06,
- 0x07,
- 0x08,
- 0x09,
- 0x0A,
- 0x0B,
- 0x0C,
- 0x0D,
- 0x0E,
- 0x0F,
- 0x0E};
- std::vector<uint8_t> encrypted_bytes = EncryptBytes(passkey_bytes);
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](const absl::optional<DecryptedPasskey>& passkey) {
- EXPECT_FALSE(passkey.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseDecryptedPasskey(aes_key_bytes, encrypted_bytes,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, DecryptSeekerPasskeySuccessfully) {
- std::vector<uint8_t> passkey_bytes;
- // Message type.
- uint8_t message_type = 0x02;
- passkey_bytes.push_back(message_type);
- // Passkey bytes.
- uint32_t passkey = 5;
- passkey_bytes.push_back(passkey >> 16);
- passkey_bytes.push_back(passkey >> 8);
- passkey_bytes.push_back(passkey);
- // Random salt
- std::array<uint8_t, 12> salt = {0x08, 0x09, 0x0A, 0x08, 0x09, 0x0E,
- 0x0A, 0x0C, 0x0D, 0x0E, 0x05, 0x02};
- std::copy(salt.begin(), salt.end(), std::back_inserter(passkey_bytes));
- std::vector<uint8_t> encrypted_bytes = EncryptBytes(passkey_bytes);
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop, &passkey,
- &salt](const absl::optional<DecryptedPasskey>& decrypted_passkey) {
- EXPECT_TRUE(decrypted_passkey.has_value());
- EXPECT_EQ(decrypted_passkey->message_type,
- FastPairMessageType::kSeekersPasskey);
- EXPECT_EQ(decrypted_passkey->passkey, passkey);
- EXPECT_EQ(decrypted_passkey->salt, salt);
- run_loop.Quit();
- });
- data_parser_->ParseDecryptedPasskey(aes_key_bytes, encrypted_bytes,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, DecryptProviderPasskeySuccessfully) {
- std::vector<uint8_t> passkey_bytes;
- // Message type.
- uint8_t message_type = 0x03;
- passkey_bytes.push_back(message_type);
- // Passkey bytes.
- uint32_t passkey = 5;
- passkey_bytes.push_back(passkey >> 16);
- passkey_bytes.push_back(passkey >> 8);
- passkey_bytes.push_back(passkey);
- // Random salt
- std::array<uint8_t, 12> salt = {0x08, 0x09, 0x0A, 0x08, 0x09, 0x0E,
- 0x0A, 0x0C, 0x0D, 0x0E, 0x05, 0x02};
- std::copy(salt.begin(), salt.end(), std::back_inserter(passkey_bytes));
- std::vector<uint8_t> encrypted_bytes = EncryptBytes(passkey_bytes);
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop, &passkey,
- &salt](const absl::optional<DecryptedPasskey>& decrypted_passkey) {
- EXPECT_TRUE(decrypted_passkey.has_value());
- EXPECT_EQ(decrypted_passkey->message_type,
- FastPairMessageType::kProvidersPasskey);
- EXPECT_EQ(decrypted_passkey->passkey, passkey);
- EXPECT_EQ(decrypted_passkey->salt, salt);
- run_loop.Quit();
- });
- data_parser_->ParseDecryptedPasskey(aes_key_bytes, encrypted_bytes,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_Empty) {
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(
- std::vector<uint8_t>(), kDeviceAddress, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseNotDiscoverableAdvertisement_NoApplicibleData) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseNotDiscoverableAdvertisement_AccountKeyFilter) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterHeader)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_TRUE(advertisement.has_value());
- EXPECT_EQ(kAccountKeyFilter,
- base::HexEncode(advertisement->account_key_filter));
- EXPECT_EQ(kSaltBytes, advertisement->salt);
- EXPECT_TRUE(advertisement->show_ui);
- EXPECT_FALSE(advertisement->battery_notification.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseNotDiscoverableAdvertisement_AccountKeyFilterNoNotification) {
- std::vector<uint8_t> bytes =
- FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterNoNotificationHeader)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_TRUE(advertisement.has_value());
- EXPECT_EQ(kAccountKeyFilter,
- base::HexEncode(advertisement->account_key_filter));
- EXPECT_EQ(kSaltBytes, advertisement->salt);
- EXPECT_FALSE(advertisement->show_ui);
- EXPECT_FALSE(advertisement->battery_notification.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_WrongVersion) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(0b00100000)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseNotDiscoverableAdvertisement_ZeroLengthExtraField) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterHeader)
- .AddExtraField("")
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_WrongType) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(0b01100001)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_SaltTooLarge) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(0b01100001)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kInvalidSalt)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_FALSE(advertisement.has_value());
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_Battery) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterHeader)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .AddExtraFieldHeader(kBatteryHeader)
- .AddExtraField(kBattery)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_TRUE(advertisement.has_value());
- EXPECT_EQ(kAccountKeyFilter,
- base::HexEncode(advertisement->account_key_filter));
- EXPECT_EQ(kSaltBytes, advertisement->salt);
- EXPECT_TRUE(advertisement->show_ui);
- EXPECT_TRUE(advertisement->battery_notification.has_value());
- EXPECT_TRUE(advertisement->battery_notification->show_ui);
- EXPECT_FALSE(
- advertisement->battery_notification->left_bud_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->left_bud_info.percentage,
- 1);
- EXPECT_FALSE(
- advertisement->battery_notification->right_bud_info.is_charging);
- EXPECT_EQ(
- advertisement->battery_notification->right_bud_info.percentage, 4);
- EXPECT_TRUE(advertisement->battery_notification->case_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->case_info.percentage,
- 15);
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_MissingSalt) {
- std::vector<uint8_t> bytes = FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterHeader)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kBatteryHeader)
- .AddExtraField(kBattery)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_TRUE(advertisement.has_value());
- EXPECT_EQ(kAccountKeyFilter,
- base::HexEncode(advertisement->account_key_filter));
- EXPECT_EQ(kDeviceAddressBytes, advertisement->salt);
- EXPECT_TRUE(advertisement->show_ui);
- EXPECT_TRUE(advertisement->battery_notification.has_value());
- EXPECT_TRUE(advertisement->battery_notification->show_ui);
- EXPECT_FALSE(
- advertisement->battery_notification->left_bud_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->left_bud_info.percentage,
- 1);
- EXPECT_FALSE(
- advertisement->battery_notification->right_bud_info.is_charging);
- EXPECT_EQ(
- advertisement->battery_notification->right_bud_info.percentage, 4);
- EXPECT_TRUE(advertisement->battery_notification->case_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->case_info.percentage,
- 15);
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseNotDiscoverableAdvertisement_BatteryNoUi) {
- std::vector<uint8_t> bytes =
- FastPairServiceDataCreator::Builder()
- .SetHeader(kNotDiscoverableAdvHeader)
- .SetModelId(kModelId)
- .AddExtraFieldHeader(kAccountKeyFilterHeader)
- .AddExtraField(kAccountKeyFilter)
- .AddExtraFieldHeader(kSaltHeader)
- .AddExtraField(kSalt)
- .AddExtraFieldHeader(kBatterHeaderNoNotification)
- .AddExtraField(kBattery)
- .Build()
- ->CreateServiceData();
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](
- const absl::optional<NotDiscoverableAdvertisement>& advertisement) {
- EXPECT_TRUE(advertisement.has_value());
- EXPECT_EQ(kAccountKeyFilter,
- base::HexEncode(advertisement->account_key_filter));
- EXPECT_EQ(kSaltBytes, advertisement->salt);
- EXPECT_TRUE(advertisement->show_ui);
- EXPECT_TRUE(advertisement->battery_notification.has_value());
- EXPECT_FALSE(advertisement->battery_notification->show_ui);
- EXPECT_FALSE(
- advertisement->battery_notification->left_bud_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->left_bud_info.percentage,
- 1);
- EXPECT_FALSE(
- advertisement->battery_notification->right_bud_info.is_charging);
- EXPECT_EQ(
- advertisement->battery_notification->right_bud_info.percentage, 4);
- EXPECT_TRUE(advertisement->battery_notification->case_info.is_charging);
- EXPECT_EQ(advertisement->battery_notification->case_info.percentage,
- 15);
- run_loop.Quit();
- });
- data_parser_->ParseNotDiscoverableAdvertisement(bytes, kDeviceAddress,
- std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_EnableSilenceMode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x01, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_enable_silence_mode());
- EXPECT_TRUE(messages[0]->get_enable_silence_mode());
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_SilenceMode_AdditionalData) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x01, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x01,
- /*additional_data=*/0x08};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_DisableSilenceMode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x01, /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_enable_silence_mode());
- EXPECT_FALSE(messages[0]->get_enable_silence_mode());
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_BluetoothInvalidMessageCode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x01, /*mesage_code=*/0x03,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_CompanionAppLogBufferFull) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x02, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_companion_app_log_buffer_full());
- EXPECT_TRUE(messages[0]->get_companion_app_log_buffer_full());
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_CompanionAppInvalidMessageCode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x02, /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_CompanionAppLogBufferFull_AdditionalData) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x02, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x01,
- /*additional_data=*/0x08};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_ModelId) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x03,
- /*additional_data=*/0xAA,
- 0xBB,
- 0xCC};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_model_id());
- EXPECT_EQ(messages[0]->get_model_id(), "AABBCC");
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_BleAddress) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00,
- 0x06,
- /*additional_data=*/0xAA,
- 0xBB,
- 0xCC,
- 0xDD,
- 0xEE,
- 0xFF};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_ble_address_update());
- EXPECT_EQ(messages[0]->get_ble_address_update(), "AA:BB:CC:DD:EE:FF");
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_WrongAdditionalDataSize) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00,
- 0x08,
- /*additional_data=*/0xAA,
- 0xBB,
- 0xCC,
- 0xDD,
- 0xEE,
- 0xFF};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_BatteryNotification) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x03,
- /*additional_data_length=*/0x00,
- 0x03,
- /*additional_data=*/0x57,
- 0x41,
- 0x7F};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_battery_update());
- EXPECT_EQ(messages[0]->get_battery_update()->left_bud_info->percentage,
- 87);
- EXPECT_EQ(messages[0]->get_battery_update()->right_bud_info->percentage,
- 65);
- EXPECT_EQ(messages[0]->get_battery_update()->case_info->percentage, -1);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_RemainingBatteryTime) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x04,
- /*additional_data_length=*/0x00, 0x01,
- /*additional_data=*/0xF0};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_remaining_battery_time());
- EXPECT_EQ(messages[0]->get_remaining_battery_time(), 240);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_RemainingBatteryTime_2BytesAdditionalData) {
- std::vector<uint8_t> bytes = {
- /*mesage_group=*/0x03, /*mesage_code=*/0x04,
- /*additional_data_length=*/0x00, 0x02,
- /*additional_data=*/0x01, 0x0F};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_remaining_battery_time());
- EXPECT_EQ(messages[0]->get_remaining_battery_time(), 271);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_DeviceInfoInvalidMessageCode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x09,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_ModelIdInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_BleAddressUpdateInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_BatteryUpdateInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x03,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_RemainingBatteryInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x04,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_ActiveComponentsInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x06,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_ActiveComponents) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x06,
- /*additional_data_length=*/0x00, 0x01,
- /*additional_data=*/0x03};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_active_components_byte());
- EXPECT_EQ(messages[0]->get_active_components_byte(), 0x03);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_AndroidPlatform) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x01,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_sdk_version());
- EXPECT_EQ(messages[0]->get_sdk_version(), 28);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_PlatformInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03, /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00, 0x00};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_InvalidPlatform) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x03,
- /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x02,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_RingDeviceNoTimeout) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04, /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00, 0x01,
- /*additional_data=*/0x01};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_ring_device_event());
- EXPECT_EQ(messages[0]->get_ring_device_event()->ring_device_byte, 0x01);
- EXPECT_EQ(messages[0]->get_ring_device_event()->timeout_in_seconds, -1);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_RingDeviceTimeout) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x01,
- 0x3C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_ring_device_event());
- EXPECT_EQ(messages[0]->get_ring_device_event()->ring_device_byte, 0x01);
- EXPECT_EQ(messages[0]->get_ring_device_event()->timeout_in_seconds, 60);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_RingInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x03,
- /*additional_data=*/0x02,
- 0x1C,
- 0x02};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_RingInvalidMessageCode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x02,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_Ack) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0xFF,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x04,
- 0x01};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_acknowledgement());
- EXPECT_EQ(messages[0]->get_acknowledgement()->action_message_code,
- 0x01);
- EXPECT_EQ(messages[0]->get_acknowledgement()->action_message_group,
- mojom::MessageGroup::kDeviceActionEvent);
- EXPECT_EQ(messages[0]->get_acknowledgement()->acknowledgement,
- mojom::Acknowledgement::kAck);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_Nak) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0xFF,
- /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00,
- 0x03,
- /*additional_data=*/0x00,
- 0x04,
- 0x01};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_acknowledgement());
- EXPECT_EQ(messages[0]->get_acknowledgement()->action_message_code,
- 0x01);
- EXPECT_EQ(messages[0]->get_acknowledgement()->action_message_group,
- mojom::MessageGroup::kDeviceActionEvent);
- EXPECT_EQ(messages[0]->get_acknowledgement()->acknowledgement,
- mojom::Acknowledgement::kNotSupportedNak);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_AckInvalidMessageCode) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0xFF,
- /*mesage_code=*/0x03,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x04,
- 0x01};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_AckInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0xFF,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x03,
- /*additional_data=*/0x04,
- 0x01,
- 0x01};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_NakInvalidLength) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0xFF,
- /*mesage_code=*/0x02,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x00,
- 0x04};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest, ParseMessageStreamMessage_NotEnoughBytes) {
- std::vector<uint8_t> bytes = {0x01, 0x02, 0x03};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_MultipleMessages_Valid) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x01,
- /*additional_data=*/0x01,
- /*mesage_group=*/0x03,
- /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x01,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 2);
- EXPECT_TRUE(messages[0]->is_ring_device_event());
- EXPECT_EQ(messages[0]->get_ring_device_event()->ring_device_byte, 0x01);
- EXPECT_EQ(messages[0]->get_ring_device_event()->timeout_in_seconds, -1);
- EXPECT_TRUE(messages[1]->is_sdk_version());
- EXPECT_EQ(messages[1]->get_sdk_version(), 28);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_MultipleMessages_ValidInvalid) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x01,
- /*additional_data=*/0x01,
- /*mesage_group=*/0x03,
- /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x02,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 1);
- EXPECT_TRUE(messages[0]->is_ring_device_event());
- EXPECT_EQ(messages[0]->get_ring_device_event()->ring_device_byte, 0x01);
- EXPECT_EQ(messages[0]->get_ring_device_event()->timeout_in_seconds, -1);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- TEST_F(FastPairDataParserTest,
- ParseMessageStreamMessage_MultipleMessages_Invalid) {
- std::vector<uint8_t> bytes = {/*mesage_group=*/0x04,
- /*mesage_code=*/0x01,
- /*additional_data_length=*/0x00,
- 0x00,
- /*mesage_group=*/0x03,
- /*mesage_code=*/0x08,
- /*additional_data_length=*/0x00,
- 0x02,
- /*additional_data=*/0x02,
- 0x1C};
- base::RunLoop run_loop;
- auto callback = base::BindLambdaForTesting(
- [&run_loop](std::vector<mojom::MessageStreamMessagePtr> messages) {
- EXPECT_EQ(static_cast<int>(messages.size()), 0);
- run_loop.Quit();
- });
- data_parser_->ParseMessageStreamMessages(bytes, std::move(callback));
- run_loop.Run();
- }
- } // namespace quick_pair
- } // namespace ash
|