123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142 |
- // Copyright 2014 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 "device/bluetooth/bluetooth_adapter.h"
- #include <stddef.h>
- #include <stdint.h>
- #include <memory>
- #include <utility>
- #include <vector>
- #include "base/barrier_closure.h"
- #include "base/bind.h"
- #include "base/callback_helpers.h"
- #include "base/logging.h"
- #include "base/memory/ref_counted.h"
- #include "base/run_loop.h"
- #include "base/test/bind.h"
- #include "base/test/task_environment.h"
- #include "base/threading/thread_task_runner_handle.h"
- #include "build/build_config.h"
- #include "device/bluetooth/bluetooth_common.h"
- #include "device/bluetooth/bluetooth_device.h"
- #include "device/bluetooth/bluetooth_discovery_session.h"
- #include "device/bluetooth/bluetooth_gatt_service.h"
- #include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
- #include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
- #include "device/bluetooth/bluetooth_local_gatt_service.h"
- #include "device/bluetooth/test/bluetooth_test.h"
- #include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
- #include "device/bluetooth/test/test_bluetooth_advertisement_observer.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #if BUILDFLAG(IS_ANDROID)
- #include "device/bluetooth/test/bluetooth_test_android.h"
- #elif BUILDFLAG(IS_MAC)
- #include "device/bluetooth/test/bluetooth_test_mac.h"
- #elif BUILDFLAG(IS_WIN)
- #include "base/win/windows_version.h"
- #include "device/bluetooth/test/bluetooth_test_win.h"
- #elif defined(USE_CAST_BLUETOOTH_ADAPTER)
- #include "device/bluetooth/test/bluetooth_test_cast.h"
- #elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
- #include "device/bluetooth/test/bluetooth_test_bluez.h"
- #elif BUILDFLAG(IS_FUCHSIA)
- #include "device/bluetooth/test/bluetooth_test_fuchsia.h"
- #endif
- #if BUILDFLAG(IS_CHROMEOS)
- #include "device/bluetooth/bluetooth_low_energy_scan_filter.h"
- #include "device/bluetooth/bluetooth_low_energy_scan_session.h"
- #endif // BUILDFLAG(IS_CHROMEOS)
- using device::BluetoothDevice;
- namespace device {
- void AddDeviceFilterWithUUID(BluetoothDiscoveryFilter* filter,
- BluetoothUUID uuid) {
- BluetoothDiscoveryFilter::DeviceInfoFilter device_filter;
- device_filter.uuids.insert(uuid);
- filter->AddDeviceFilter(device_filter);
- }
- namespace {
- class TestBluetoothAdapter final : public BluetoothAdapter {
- public:
- TestBluetoothAdapter() = default;
- void Initialize(base::OnceClosure callback) override {
- std::move(callback).Run();
- }
- std::string GetAddress() const override { return ""; }
- std::string GetName() const override { return ""; }
- void SetName(const std::string& name,
- base::OnceClosure callback,
- ErrorCallback error_callback) override {}
- bool IsInitialized() const override { return false; }
- bool IsPresent() const override { return false; }
- bool IsPowered() const override { return false; }
- void SetPowered(bool powered,
- base::OnceClosure callback,
- ErrorCallback error_callback) override {}
- bool IsDiscoverable() const override { return false; }
- void SetDiscoverable(bool discoverable,
- base::OnceClosure callback,
- ErrorCallback error_callback) override {}
- bool IsDiscovering() const override { return false; }
- UUIDList GetUUIDs() const override { return UUIDList(); }
- void CreateRfcommService(const BluetoothUUID& uuid,
- const ServiceOptions& options,
- CreateServiceCallback callback,
- CreateServiceErrorCallback error_callback) override {
- }
- void CreateL2capService(const BluetoothUUID& uuid,
- const ServiceOptions& options,
- CreateServiceCallback callback,
- CreateServiceErrorCallback error_callback) override {}
- void RegisterAdvertisement(
- std::unique_ptr<BluetoothAdvertisement::Data> advertisement_data,
- CreateAdvertisementCallback callback,
- AdvertisementErrorCallback error_callback) override {}
- #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
- void SetAdvertisingInterval(
- const base::TimeDelta& min,
- const base::TimeDelta& max,
- base::OnceClosure callback,
- AdvertisementErrorCallback error_callback) override {}
- void ResetAdvertising(base::OnceClosure callback,
- AdvertisementErrorCallback error_callback) override {}
- void ConnectDevice(
- const std::string& address,
- const absl::optional<BluetoothDevice::AddressType>& address_type,
- ConnectDeviceCallback callback,
- ErrorCallback error_callback) override {}
- #endif
- BluetoothLocalGattService* GetGattService(
- const std::string& identifier) const override {
- return nullptr;
- }
- #if BUILDFLAG(IS_CHROMEOS)
- void SetServiceAllowList(const UUIDList& uuids,
- base::OnceClosure callback,
- ErrorCallback error_callback) override {}
- LowEnergyScanSessionHardwareOffloadingStatus
- GetLowEnergyScanSessionHardwareOffloadingStatus() override {
- return LowEnergyScanSessionHardwareOffloadingStatus::kNotSupported;
- }
- std::unique_ptr<BluetoothLowEnergyScanSession> StartLowEnergyScanSession(
- std::unique_ptr<BluetoothLowEnergyScanFilter> filter,
- base::WeakPtr<BluetoothLowEnergyScanSession::Delegate> delegate)
- override {
- return nullptr;
- }
- #endif // BUILDFLAG(IS_CHROMEOS)
- #if BUILDFLAG(IS_CHROMEOS_ASH)
- void SetStandardChromeOSAdapterName() override {}
- #endif // BUILDFLAG(IS_CHROMEOS_ASH)
- void OnStartDiscoverySessionQuitLoop(
- base::OnceClosure run_loop_quit,
- std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) {
- ++callback_count_;
- std::move(run_loop_quit).Run();
- discovery_sessions_holder_.push(std::move(discovery_session));
- }
- void OnRemoveDiscoverySession(base::OnceClosure run_loop_quit) {
- ++callback_count_;
- std::move(run_loop_quit).Run();
- }
- void OnRemoveDiscoverySessionError(base::OnceClosure run_loop_quit) {
- ++callback_count_;
- std::move(run_loop_quit).Run();
- }
- void set_discovery_session_outcome(
- UMABluetoothDiscoverySessionOutcome outcome) {
- discovery_session_outcome_ = outcome;
- }
- void StopDiscoverySession(base::OnceClosure run_loop_quit) {
- auto split_run_loop = base::SplitOnceCallback(std::move(run_loop_quit));
- discovery_sessions_holder_.front()->Stop(
- base::BindOnce(&TestBluetoothAdapter::OnRemoveDiscoverySession, this,
- std::move(split_run_loop.first)),
- base::BindOnce(&TestBluetoothAdapter::OnRemoveDiscoverySessionError,
- this, std::move(split_run_loop.second)));
- discovery_sessions_holder_.pop();
- }
- void StopAllDiscoverySessions(base::OnceClosure run_loop_quit) {
- base::RepeatingClosure closure = base::BarrierClosure(
- discovery_sessions_holder_.size(), std::move(run_loop_quit));
- while (!discovery_sessions_holder_.empty()) {
- discovery_sessions_holder_.front()->Stop(
- base::BindLambdaForTesting([closure, this]() {
- ++callback_count_;
- closure.Run();
- }),
- base::BindOnce(&TestBluetoothAdapter::OnRemoveDiscoverySessionError,
- this, closure));
- discovery_sessions_holder_.pop();
- }
- }
- void CleanupSessions() {
- // clear discovery_sessions_holder_
- base::queue<std::unique_ptr<BluetoothDiscoverySession>> empty_queue;
- std::swap(discovery_sessions_holder_, empty_queue);
- }
- void QueueStartRequests(base::OnceClosure run_loop_quit, int num_requests) {
- base::RepeatingClosure closure =
- base::BarrierClosure(num_requests, std::move(run_loop_quit));
- for (int i = 0; i < num_requests; ++i) {
- StartDiscoverySession(
- /*client_name=*/std::string(),
- base::BindLambdaForTesting(
- [closure, this](std::unique_ptr<device::BluetoothDiscoverySession>
- discovery_session) {
- ++callback_count_;
- discovery_sessions_holder_.push(std::move(discovery_session));
- closure.Run();
- }),
- closure);
- }
- }
- void StartSessionWithFilter(
- std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
- base::OnceClosure run_loop_quit) {
- StartDiscoverySessionWithFilter(
- std::move(discovery_filter),
- /*client_name=*/std::string(),
- base::BindOnce(&TestBluetoothAdapter::OnStartDiscoverySessionQuitLoop,
- this, std::move(run_loop_quit)),
- base::DoNothing());
- }
- void RunStartSessionWithFilter(
- std::unique_ptr<BluetoothDiscoveryFilter> filter) {
- base::RunLoop loop;
- StartSessionWithFilter(std::move(filter), loop.QuitClosure());
- loop.Run();
- }
- // |discovery_sessions_holder_| is used to hold unique pointers of Discovery
- // Sessions so that the destructors don't get called and so we can test
- // removing them
- base::queue<std::unique_ptr<BluetoothDiscoverySession>>
- discovery_sessions_holder_;
- std::unique_ptr<BluetoothDiscoveryFilter> current_filter =
- std::make_unique<BluetoothDiscoveryFilter>();
- int callback_count_ = 0;
- bool is_discovering_ = false;
- protected:
- ~TestBluetoothAdapter() override = default;
- bool SetPoweredImpl(bool powered) override { return false; }
- base::WeakPtr<BluetoothAdapter> GetWeakPtr() override {
- return weak_ptr_factory_.GetWeakPtr();
- }
- void StartScanWithFilter(
- std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
- DiscoverySessionResultCallback callback) override {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&TestBluetoothAdapter::SetFilter,
- weak_ptr_factory_.GetWeakPtr(),
- std::move(discovery_filter), std::move(callback)));
- }
- void UpdateFilter(std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
- DiscoverySessionResultCallback callback) override {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&TestBluetoothAdapter::SetFilter,
- weak_ptr_factory_.GetWeakPtr(),
- std::move(discovery_filter), std::move(callback)));
- }
- void SetFilter(std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
- DiscoverySessionResultCallback callback) {
- bool is_error = discovery_session_outcome_ !=
- UMABluetoothDiscoverySessionOutcome::SUCCESS;
- if (!is_error) {
- is_discovering_ = true;
- current_filter->CopyFrom(*discovery_filter.get());
- }
- std::move(callback).Run(is_error, discovery_session_outcome_);
- }
- void StopScan(DiscoverySessionResultCallback callback) override {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&TestBluetoothAdapter::FakeOSStopScan,
- weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
- }
- void FakeOSStopScan(DiscoverySessionResultCallback callback) {
- is_discovering_ = false;
- std::move(callback).Run(/*is_error=*/false,
- UMABluetoothDiscoverySessionOutcome::SUCCESS);
- }
- void RemovePairingDelegateInternal(
- BluetoothDevice::PairingDelegate* pairing_delegate) override {}
- private:
- void PostDelayedTask(base::OnceClosure callback) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
- std::move(callback));
- }
- UMABluetoothDiscoverySessionOutcome discovery_session_outcome_ =
- UMABluetoothDiscoverySessionOutcome::SUCCESS;
- // This must be the last field in the class so that weak pointers are
- // invalidated first.
- base::WeakPtrFactory<TestBluetoothAdapter> weak_ptr_factory_{this};
- };
- class TestPairingDelegate : public BluetoothDevice::PairingDelegate {
- public:
- void RequestPinCode(BluetoothDevice* device) override {}
- void RequestPasskey(BluetoothDevice* device) override {}
- void DisplayPinCode(BluetoothDevice* device,
- const std::string& pincode) override {}
- void DisplayPasskey(BluetoothDevice* device, uint32_t passkey) override {}
- void KeysEntered(BluetoothDevice* device, uint32_t entered) override {}
- void ConfirmPasskey(BluetoothDevice* device, uint32_t passkey) override {}
- void AuthorizePairing(BluetoothDevice* device) override {}
- };
- } // namespace
- class BluetoothAdapterTest : public testing::Test {
- public:
- void SetUp() override { adapter_ = new TestBluetoothAdapter(); }
- protected:
- scoped_refptr<TestBluetoothAdapter> adapter_;
- base::test::TaskEnvironment task_environment_;
- };
- TEST_F(BluetoothAdapterTest, NoDefaultPairingDelegate) {
- // Verify that when there is no registered pairing delegate, NULL is returned.
- EXPECT_TRUE(adapter_->DefaultPairingDelegate() == nullptr);
- }
- TEST_F(BluetoothAdapterTest, OneDefaultPairingDelegate) {
- // Verify that when there is one registered pairing delegate, it is returned.
- TestPairingDelegate delegate;
- adapter_->AddPairingDelegate(&delegate,
- BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_LOW);
- EXPECT_EQ(&delegate, adapter_->DefaultPairingDelegate());
- }
- TEST_F(BluetoothAdapterTest, SamePriorityDelegates) {
- // Verify that when there are two registered pairing delegates of the same
- // priority, the first one registered is returned.
- TestPairingDelegate delegate1, delegate2;
- adapter_->AddPairingDelegate(&delegate1,
- BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_LOW);
- adapter_->AddPairingDelegate(&delegate2,
- BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_LOW);
- EXPECT_EQ(&delegate1, adapter_->DefaultPairingDelegate());
- // After unregistering the first, the second can be returned.
- adapter_->RemovePairingDelegate(&delegate1);
- EXPECT_EQ(&delegate2, adapter_->DefaultPairingDelegate());
- }
- TEST_F(BluetoothAdapterTest, HighestPriorityDelegate) {
- // Verify that when there are two registered pairing delegates, the one with
- // the highest priority is returned.
- TestPairingDelegate delegate1, delegate2;
- adapter_->AddPairingDelegate(&delegate1,
- BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_LOW);
- adapter_->AddPairingDelegate(
- &delegate2, BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH);
- EXPECT_EQ(&delegate2, adapter_->DefaultPairingDelegate());
- }
- TEST_F(BluetoothAdapterTest, UnregisterDelegate) {
- // Verify that after unregistering a delegate, NULL is returned.
- TestPairingDelegate delegate;
- adapter_->AddPairingDelegate(&delegate,
- BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_LOW);
- adapter_->RemovePairingDelegate(&delegate);
- EXPECT_TRUE(adapter_->DefaultPairingDelegate() == nullptr);
- }
- TEST_F(BluetoothAdapterTest, GetMergedDiscoveryFilterEmpty) {
- std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter;
- discovery_filter = adapter_->GetMergedDiscoveryFilter();
- EXPECT_TRUE(discovery_filter->IsDefault());
- }
- TEST_F(BluetoothAdapterTest, GetMergedDiscoveryFilterRegular) {
- std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter;
- // having one reglar session should result in no filter
- std::unique_ptr<BluetoothDiscoveryFilter> resulting_filter =
- adapter_->GetMergedDiscoveryFilter();
- EXPECT_TRUE(resulting_filter->IsDefault());
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, TestQueueingLogic) {
- auto discovery_filter =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- AddDeviceFilterWithUUID(discovery_filter.get(), BluetoothUUID("1001"));
- auto discovery_filter2 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- AddDeviceFilterWithUUID(discovery_filter2.get(), BluetoothUUID("1002"));
- // Start a discovery session
- base::RunLoop run_loop1;
- adapter_->StartSessionWithFilter(std::move(discovery_filter),
- run_loop1.QuitClosure());
- // Since the first request is still running we have not hit a single callback
- EXPECT_EQ(0, adapter_->callback_count_);
- // While our first Discovery Session is starting queue up another one with a
- // different filter.
- base::RunLoop run_loop2;
- adapter_->StartSessionWithFilter(std::move(discovery_filter2),
- run_loop2.QuitClosure());
- // Finish the first request. This should automatically start the queued
- // request when completed.
- run_loop1.Run();
- EXPECT_EQ(1, adapter_->callback_count_);
- EXPECT_TRUE(adapter_->is_discovering_);
- adapter_->callback_count_ = 0;
- // While our second discovery session is starting queue up 4 start requests
- // with default filters.
- base::RunLoop run_loop3;
- adapter_->QueueStartRequests(run_loop3.QuitClosure(), 4);
- // Finish the second request. This should start the 4 queued requests.
- run_loop2.Run();
- EXPECT_EQ(1, adapter_->callback_count_);
- adapter_->callback_count_ = 0;
- // Queue up stop requests for the 2 started sessions.
- base::RunLoop run_loop4;
- adapter_->StopAllDiscoverySessions(base::DoNothing());
- // Confirm that no callbacks were hit and the filter has not changed.
- EXPECT_EQ(0, adapter_->callback_count_);
- EXPECT_FALSE(adapter_->current_filter->IsDefault());
- // Run the 4 queued default requests. This should call all 4 callbacks from
- // the start requests and automatically call the start the queue stop
- // requests. These will short circuit and return immediately because the
- // filter remains the default filter.
- run_loop3.Run();
- EXPECT_EQ(6, adapter_->callback_count_);
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, ShortCircuitUpdateTest) {
- auto discovery_filter_default1 = std::make_unique<BluetoothDiscoveryFilter>();
- auto discovery_filter =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter->SetRSSI(-30);
- base::RunLoop run_loop;
- adapter_->StartSessionWithFilter(std::move(discovery_filter_default1),
- run_loop.QuitClosure());
- run_loop.Run();
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(1, adapter_->callback_count_);
- // This time since there is no actual change being made the adapter should
- // short circuit the callback immediately with success
- auto discovery_filter_default2 = std::make_unique<BluetoothDiscoveryFilter>();
- adapter_->StartSessionWithFilter(std::move(discovery_filter_default2),
- base::DoNothing());
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(2, adapter_->callback_count_);
- // This filter is different but is already covered under the default filter so
- // it should still short circuit
- adapter_->StartSessionWithFilter(std::move(discovery_filter),
- base::DoNothing());
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(3, adapter_->callback_count_);
- // End the first discovery session which still short circuits because there is
- // still a default session active
- adapter_->StopDiscoverySession(base::DoNothing());
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(4, adapter_->callback_count_);
- // When removing the second default filter we should now actually update
- // because discovery_filter is the only filter left
- base::RunLoop run_loop2;
- adapter_->StopDiscoverySession(run_loop2.QuitClosure());
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(4, adapter_->callback_count_);
- run_loop2.Run();
- EXPECT_FALSE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(5, adapter_->callback_count_);
- // Adding another default but not finishing the update
- base::RunLoop run_loop3;
- auto discovery_filter_default3 = std::make_unique<BluetoothDiscoveryFilter>();
- adapter_->StartSessionWithFilter(std::move(discovery_filter_default3),
- run_loop3.QuitClosure());
- EXPECT_FALSE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(5, adapter_->callback_count_);
- // Queue up another request that should short circuit and return success when
- // default filter 3 updates
- auto discovery_filter_default4 = std::make_unique<BluetoothDiscoveryFilter>();
- adapter_->StartSessionWithFilter(std::move(discovery_filter_default4),
- base::DoNothing());
- EXPECT_FALSE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(5, adapter_->callback_count_);
- // Running the loop default filter 3 will update the the OS filter then then
- // start processing the queued request. The queued request does not change
- // the filter so it should automatically short circuit and return success.
- run_loop3.Run();
- EXPECT_TRUE(adapter_->current_filter->IsDefault());
- EXPECT_EQ(7, adapter_->callback_count_);
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, GetMergedDiscoveryFilterRssi) {
- int16_t resulting_rssi;
- uint16_t resulting_pathloss;
- std::unique_ptr<BluetoothDiscoveryFilter> resulting_filter;
- auto discovery_filter =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter->SetRSSI(-30);
- auto discovery_filter2 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter2->SetRSSI(-65);
- // Make sure adapter has one session without filtering.
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter));
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- resulting_filter->GetRSSI(&resulting_rssi);
- EXPECT_EQ(-30, resulting_rssi);
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter2));
- // result of merging two rssi values should be lower one
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- resulting_filter->GetRSSI(&resulting_rssi);
- EXPECT_EQ(-65, resulting_rssi);
- BluetoothDiscoveryFilter* df3 =
- new BluetoothDiscoveryFilter(BLUETOOTH_TRANSPORT_LE);
- df3->SetPathloss(60);
- std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter3(df3);
- // when rssi and pathloss are merged, both should be cleared, because there is
- // no way to tell which filter will be more generic
- {
- base::RunLoop run_loop;
- adapter_->StartSessionWithFilter(std::move(discovery_filter3),
- run_loop.QuitClosure());
- run_loop.Run();
- }
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- EXPECT_FALSE(resulting_filter->GetRSSI(&resulting_rssi));
- EXPECT_FALSE(resulting_filter->GetPathloss(&resulting_pathloss));
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, GetMergedDiscoveryFilterTransport) {
- std::unique_ptr<BluetoothDiscoveryFilter> resulting_filter;
- auto discovery_filter =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_CLASSIC);
- auto discovery_filter2 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter));
- // Just one filter, make sure transport was properly rewritten
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- EXPECT_EQ(BLUETOOTH_TRANSPORT_CLASSIC, resulting_filter->GetTransport());
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter2));
- // Two filters, should have OR of both transport's
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, resulting_filter->GetTransport());
- auto discovery_filter3 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter3->CopyFrom(
- BluetoothDiscoveryFilter(BLUETOOTH_TRANSPORT_DUAL));
- // Merging empty filter in should result in empty filter
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter3));
- resulting_filter = adapter_->GetMergedDiscoveryFilter();
- EXPECT_TRUE(resulting_filter->IsDefault());
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, GetMergedDiscoveryFilterAllFields) {
- int16_t resulting_rssi;
- std::set<device::BluetoothUUID> resulting_uuids;
- auto discovery_filter =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter->SetRSSI(-60);
- AddDeviceFilterWithUUID(discovery_filter.get(), BluetoothUUID("1000"));
- auto discovery_filter2 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter2->SetRSSI(-85);
- AddDeviceFilterWithUUID(discovery_filter2.get(), BluetoothUUID("1020"));
- AddDeviceFilterWithUUID(discovery_filter2.get(), BluetoothUUID("1001"));
- auto discovery_filter3 =
- std::make_unique<BluetoothDiscoveryFilter>(BLUETOOTH_TRANSPORT_LE);
- discovery_filter3->SetRSSI(-65);
- discovery_filter3->SetTransport(BLUETOOTH_TRANSPORT_CLASSIC);
- AddDeviceFilterWithUUID(discovery_filter3.get(), BluetoothUUID("1020"));
- AddDeviceFilterWithUUID(discovery_filter3.get(), BluetoothUUID("1003"));
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter));
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter2));
- adapter_->RunStartSessionWithFilter(std::move(discovery_filter3));
- std::unique_ptr<BluetoothDiscoveryFilter> resulting_filter =
- adapter_->GetMergedDiscoveryFilter();
- resulting_filter->GetRSSI(&resulting_rssi);
- resulting_filter->GetUUIDs(resulting_uuids);
- EXPECT_TRUE(resulting_filter->GetTransport());
- EXPECT_EQ(BLUETOOTH_TRANSPORT_DUAL, resulting_filter->GetTransport());
- EXPECT_EQ(-85, resulting_rssi);
- EXPECT_EQ(4UL, resulting_uuids.size());
- EXPECT_TRUE(resulting_uuids.find(device::BluetoothUUID("1000")) !=
- resulting_uuids.end());
- EXPECT_TRUE(resulting_uuids.find(device::BluetoothUUID("1001")) !=
- resulting_uuids.end());
- EXPECT_TRUE(resulting_uuids.find(device::BluetoothUUID("1003")) !=
- resulting_uuids.end());
- EXPECT_TRUE(resulting_uuids.find(device::BluetoothUUID("1020")) !=
- resulting_uuids.end());
- adapter_->CleanupSessions();
- }
- TEST_F(BluetoothAdapterTest, StartDiscoverySession_Destroy) {
- base::RunLoop loop;
- adapter_->StartDiscoverySession(
- /*client_name=*/std::string(),
- base::BindLambdaForTesting(
- [&](std::unique_ptr<BluetoothDiscoverySession> session) {
- adapter_.reset();
- loop.Quit();
- }),
- base::DoNothing());
- loop.Run();
- }
- TEST_F(BluetoothAdapterTest, StartDiscoverySessionError_Destroy) {
- base::RunLoop loop;
- adapter_->set_discovery_session_outcome(
- UMABluetoothDiscoverySessionOutcome::FAILED);
- adapter_->StartDiscoverySession(/*client_name=*/std::string(),
- base::DoNothing(),
- base::BindLambdaForTesting([&]() {
- adapter_.reset();
- loop.Quit();
- }));
- loop.Run();
- }
- // TODO(scheib): Enable BluetoothTest fixture tests on all platforms.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_ConstructDefaultAdapter ConstructDefaultAdapter
- #else
- #define MAYBE_ConstructDefaultAdapter DISABLED_ConstructDefaultAdapter
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, ConstructDefaultAdapter) {
- #else
- TEST_F(BluetoothTest, MAYBE_ConstructDefaultAdapter) {
- #endif
- InitWithDefaultAdapter();
- if (!adapter_->IsPresent() || !adapter_->IsPowered()) {
- LOG(WARNING)
- << "Bluetooth adapter not present or not powered; skipping unit test.";
- return;
- }
- EXPECT_FALSE(adapter_->GetAddress().empty());
- EXPECT_FALSE(adapter_->GetName().empty());
- EXPECT_FALSE(adapter_->IsDiscoverable());
- EXPECT_FALSE(adapter_->IsDiscovering());
- } // namespace device
- // TODO(scheib): Enable BluetoothTest fixture tests on all platforms.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_ConstructWithoutDefaultAdapter ConstructWithoutDefaultAdapter
- #else
- #define MAYBE_ConstructWithoutDefaultAdapter \
- DISABLED_ConstructWithoutDefaultAdapter
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, ConstructWithoutDefaultAdapter) {
- #else
- TEST_F(BluetoothTest, MAYBE_ConstructWithoutDefaultAdapter) {
- #endif // BUILDFLAG(IS_WIN)
- InitWithoutDefaultAdapter();
- EXPECT_EQ(adapter_->GetAddress(), "");
- EXPECT_EQ(adapter_->GetName(), "");
- EXPECT_FALSE(adapter_->IsPresent());
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_FALSE(adapter_->IsDiscoverable());
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- // TODO(scheib): Enable BluetoothTest fixture tests on all platforms.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_ConstructFakeAdapter ConstructFakeAdapter
- #else
- #define MAYBE_ConstructFakeAdapter DISABLED_ConstructFakeAdapter
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, ConstructFakeAdapter) {
- #else
- TEST_F(BluetoothTest, MAYBE_ConstructFakeAdapter) {
- #endif // BUILDFLAG(IS_WIN)
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- EXPECT_EQ(adapter_->GetAddress(), kTestAdapterAddress);
- EXPECT_EQ(adapter_->GetName(), kTestAdapterName);
- EXPECT_TRUE(adapter_->CanPower());
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_TRUE(adapter_->IsPeripheralRoleSupported());
- EXPECT_FALSE(adapter_->IsDiscoverable());
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, ConstructFakeAdapterWithoutRadio) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitFakeAdapterWithoutRadio();
- EXPECT_EQ(adapter_->GetAddress(), kTestAdapterAddress);
- EXPECT_EQ(adapter_->GetName(), kTestAdapterName);
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_FALSE(adapter_->CanPower());
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_FALSE(adapter_->IsDiscoverable());
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- TEST_P(BluetoothTestWinrtOnly, ConstructFakeAdapterWithoutPowerControl) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitFakeAdapterWithRadioAccessDenied();
- EXPECT_EQ(adapter_->GetAddress(), kTestAdapterAddress);
- EXPECT_EQ(adapter_->GetName(), kTestAdapterName);
- EXPECT_TRUE(adapter_->IsPresent());
- EXPECT_FALSE(adapter_->CanPower());
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_FALSE(adapter_->IsDiscoverable());
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- #endif // BUILDFLAG(IS_WIN)
- // TODO(scheib): Enable BluetoothTest fixture tests on all platforms.
- #if BUILDFLAG(IS_ANDROID)
- #define MAYBE_DiscoverySession DiscoverySession
- #else
- #define MAYBE_DiscoverySession DISABLED_DiscoverySession
- #endif
- // Starts and Stops a discovery session.
- TEST_F(BluetoothTest, MAYBE_DiscoverySession) {
- InitWithFakeAdapter();
- EXPECT_FALSE(adapter_->IsDiscovering());
- StartLowEnergyDiscoverySession();
- EXPECT_EQ(1, callback_count_);
- EXPECT_EQ(0, error_callback_count_);
- EXPECT_TRUE(adapter_->IsDiscovering());
- ASSERT_EQ((size_t)1, discovery_sessions_.size());
- EXPECT_TRUE(discovery_sessions_[0]->IsActive());
- ResetEventCounts();
- discovery_sessions_[0]->Stop(GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- EXPECT_FALSE(adapter_->IsDiscovering());
- EXPECT_FALSE(discovery_sessions_[0]->IsActive());
- }
- // Android only: this test is specific for Android and should not be
- // enabled for other platforms.
- #if BUILDFLAG(IS_ANDROID)
- TEST_F(BluetoothTest, AdapterIllegalStateBeforeStartScan) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- ForceIllegalStateException();
- StartLowEnergyDiscoverySessionExpectedToFail();
- EXPECT_EQ(0, callback_count_);
- EXPECT_EQ(1, error_callback_count_);
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- #endif // BUILDFLAG(IS_ANDROID)
- // Android only: this test is specific for Android and should not be
- // enabled for other platforms.
- #if BUILDFLAG(IS_ANDROID)
- TEST_F(BluetoothTest, AdapterIllegalStateBeforeStopScan) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- StartLowEnergyDiscoverySession();
- EXPECT_EQ(1, callback_count_);
- EXPECT_EQ(0, error_callback_count_);
- EXPECT_TRUE(adapter_->IsDiscovering());
- ForceIllegalStateException();
- discovery_sessions_[0]->Stop(GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- EXPECT_FALSE(adapter_->IsDiscovering());
- }
- #endif // BUILDFLAG(IS_ANDROID)
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_NoPermissions NoPermissions
- #else
- #define MAYBE_NoPermissions DISABLED_NoPermissions
- #endif
- // Checks that discovery fails (instead of hanging) when permissions are denied.
- TEST_F(BluetoothTest, MAYBE_NoPermissions) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- if (!DenyPermission()) {
- // Platform always gives permission to scan.
- return;
- }
- StartLowEnergyDiscoverySessionExpectedToFail();
- EXPECT_EQ(0, callback_count_);
- EXPECT_EQ(1, error_callback_count_);
- }
- // Android-only: Only Android requires location services to be turned on to scan
- // for Bluetooth devices.
- #if BUILDFLAG(IS_ANDROID)
- // Checks that discovery fails (instead of hanging) when location services are
- // turned off.
- TEST_F(BluetoothTest, NoLocationServices) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateLocationServicesOff();
- StartLowEnergyDiscoverySessionExpectedToFail();
- EXPECT_EQ(0, callback_count_);
- EXPECT_EQ(1, error_callback_count_);
- }
- #endif // BUILDFLAG(IS_ANDROID)
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_DiscoverLowEnergyDevice DiscoverLowEnergyDevice
- #else
- #define MAYBE_DiscoverLowEnergyDevice DISABLED_DiscoverLowEnergyDevice
- #endif
- // Discovers a device.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, DiscoverLowEnergyDevice) {
- #else
- TEST_F(BluetoothTest, MAYBE_DiscoverLowEnergyDevice) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- // Start discovery and find a device.
- StartLowEnergyDiscoverySession();
- SimulateLowEnergyDevice(1);
- EXPECT_EQ(1, observer.device_added_count());
- BluetoothDevice* device = adapter_->GetDevice(observer.last_device_address());
- EXPECT_TRUE(device);
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_DiscoverLowEnergyDeviceTwice DiscoverLowEnergyDeviceTwice
- #else
- #define MAYBE_DiscoverLowEnergyDeviceTwice DISABLED_DiscoverLowEnergyDeviceTwice
- #endif
- // Discovers the same device multiple times.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, DiscoverLowEnergyDeviceTwice) {
- #else
- TEST_F(BluetoothTest, MAYBE_DiscoverLowEnergyDeviceTwice) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- // Start discovery and find a device.
- StartLowEnergyDiscoverySession();
- SimulateLowEnergyDevice(1);
- EXPECT_EQ(1, observer.device_added_count());
- BluetoothDevice* device = adapter_->GetDevice(observer.last_device_address());
- EXPECT_TRUE(device);
- // Find the same device again. This should not create a new device object.
- observer.Reset();
- SimulateLowEnergyDevice(1);
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_DiscoverLowEnergyDeviceWithUpdatedUUIDs \
- DiscoverLowEnergyDeviceWithUpdatedUUIDs
- #else
- #define MAYBE_DiscoverLowEnergyDeviceWithUpdatedUUIDs \
- DISABLED_DiscoverLowEnergyDeviceWithUpdatedUUIDs
- #endif
- // Discovers a device, and then again with new Service UUIDs.
- // Makes sure we don't create another device when we've found the
- // device in the past.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, DiscoverLowEnergyDeviceWithUpdatedUUIDs) {
- #else
- TEST_F(BluetoothTest, MAYBE_DiscoverLowEnergyDeviceWithUpdatedUUIDs) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- // Start discovery and find a device.
- StartLowEnergyDiscoverySession();
- BluetoothDevice* device = SimulateLowEnergyDevice(1);
- // Discover same device again with updated UUIDs:
- observer.Reset();
- SimulateLowEnergyDevice(2);
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(1, observer.device_changed_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- EXPECT_EQ(device, observer.last_device());
- // Discover same device again with empty UUIDs:
- observer.Reset();
- SimulateLowEnergyDevice(3);
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(1, observer.device_changed_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_DiscoverMultipleLowEnergyDevices DiscoverMultipleLowEnergyDevices
- #else
- #define MAYBE_DiscoverMultipleLowEnergyDevices \
- DISABLED_DiscoverMultipleLowEnergyDevices
- #endif
- // Discovers multiple devices when addresses vary.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrt, DiscoverMultipleLowEnergyDevices) {
- #else
- TEST_F(BluetoothTest, MAYBE_DiscoverMultipleLowEnergyDevices) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- // Start discovery and find a device.
- StartLowEnergyDiscoverySession();
- SimulateLowEnergyDevice(1);
- SimulateLowEnergyDevice(4);
- EXPECT_EQ(2, observer.device_added_count());
- EXPECT_EQ(2u, adapter_->GetDevices().size());
- }
- #if BUILDFLAG(IS_WIN)
- // Tests that the adapter responds to external changes to the power state.
- TEST_P(BluetoothTestWinrtOnly, SimulateAdapterPoweredOffAndOn) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- SimulateAdapterPoweredOff();
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- EXPECT_FALSE(observer.last_powered());
- SimulateAdapterPoweredOn();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- EXPECT_TRUE(observer.last_powered());
- }
- // Tests that power change notifications are deduplicated.
- // Multiple StateChanged events with the same state only cause a
- // single AdapterPoweredChanged() call.
- TEST_P(BluetoothTestWinrtOnly, SimulateDuplicateStateChanged) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- SimulateSpuriousRadioStateChangedEvent();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- SimulateAdapterPoweredOff();
- SimulateSpuriousRadioStateChangedEvent();
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- EXPECT_FALSE(observer.last_powered());
- SimulateAdapterPoweredOn();
- SimulateSpuriousRadioStateChangedEvent();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- EXPECT_TRUE(observer.last_powered());
- }
- // Tests that the adapter responds to external changes to the power state, even
- // if it failed to obtain the underlying radio.
- TEST_P(BluetoothTestWinrtOnly, SimulateAdapterPoweredOnAndOffWithoutRadio) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitFakeAdapterWithoutRadio();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- SimulateAdapterPoweredOn();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- EXPECT_TRUE(observer.last_powered());
- SimulateAdapterPoweredOff();
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- EXPECT_FALSE(observer.last_powered());
- }
- // Makes sure the error callback gets run when changing the adapter power state
- // fails.
- // TODO(https://crbug.com/878680): Implement SimulateAdapterPowerSuccess() and
- // enable on all platforms.
- TEST_P(BluetoothTestWinrtOnly, SimulateAdapterPowerFailure) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- adapter_->SetPowered(false, GetCallback(Call::NOT_EXPECTED),
- GetErrorCallback(Call::EXPECTED));
- SimulateAdapterPowerFailure();
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- }
- #endif // BUILDFLAG(IS_WIN)
- // TODO(https://crbug.com/804356): Enable this test on old Windows versions as
- // well.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, TogglePowerFakeAdapter) {
- #else
- TEST_F(BluetoothTest, TogglePowerFakeAdapter) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- // Check if power can be turned off.
- adapter_->SetPowered(false, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- // Check if power can be turned on again.
- adapter_->SetPowered(true, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_TogglePowerFakeAdapter_Twice TogglePowerFakeAdapter_Twice
- #else
- #define MAYBE_TogglePowerFakeAdapter_Twice DISABLED_TogglePowerFakeAdapter_Twice
- #endif
- // These tests are not relevant for BlueZ and old Windows versions. On these
- // platforms the corresponding system APIs are blocking or use callbacks, so
- // that it is not necessary to store pending callbacks and wait for the
- // appropriate events.
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, TogglePowerFakeAdapter_Twice) {
- #else
- TEST_F(BluetoothTest, MAYBE_TogglePowerFakeAdapter_Twice) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- // Post two pending turn off requests, the second should fail due to the
- // presence of another callback.
- adapter_->SetPowered(false, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- adapter_->SetPowered(false, GetCallback(Call::NOT_EXPECTED),
- GetErrorCallback(Call::EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- // Post two pending turn on requests, the second should fail due to the
- // presence of another callback.
- adapter_->SetPowered(true, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- adapter_->SetPowered(true, GetCallback(Call::NOT_EXPECTED),
- GetErrorCallback(Call::EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_TogglePowerFakeAdapter_WithinCallback_On_Off \
- TogglePowerFakeAdapter_WithinCallback_On_Off
- #else
- #define MAYBE_TogglePowerFakeAdapter_WithinCallback_On_Off \
- DISABLED_TogglePowerFakeAdapter_WithinCallback_On_Off
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, TogglePowerFakeAdapter_WithinCallback_On_Off) {
- #else
- TEST_F(BluetoothTest, MAYBE_TogglePowerFakeAdapter_WithinCallback_On_Off) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- // Turn adapter off, while powering it on in the callback.
- adapter_->SetPowered(false, base::BindLambdaForTesting([&] {
- adapter_->SetPowered(
- true, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- }),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_TogglePowerFakeAdapter_WithinCallback_Off_On \
- TogglePowerFakeAdapter_WithinCallback_Off_On
- #else
- #define MAYBE_TogglePowerFakeAdapter_WithinCallback_Off_On \
- DISABLED_TogglePowerFakeAdapter_WithinCallback_Off_On
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, TogglePowerFakeAdapter_WithinCallback_Off_On) {
- #else
- TEST_F(BluetoothTest, MAYBE_TogglePowerFakeAdapter_WithinCallback_Off_On) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- // Turn power off.
- adapter_->SetPowered(false, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- // Turn adapter on, while powering it off in the callback.
- adapter_->SetPowered(true, base::BindLambdaForTesting([&] {
- adapter_->SetPowered(
- false, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- }),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- EXPECT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(3, observer.powered_changed_count());
- }
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_TogglePowerFakeAdapter_DestroyWithPending \
- TogglePowerFakeAdapter_DestroyWithPending
- #else
- #define MAYBE_TogglePowerFakeAdapter_DestroyWithPending \
- DISABLED_TogglePowerFakeAdapter_DestroyWithPending
- #endif
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, TogglePowerFakeAdapter_DestroyWithPending) {
- #else
- TEST_F(BluetoothTest, MAYBE_TogglePowerFakeAdapter_DestroyWithPending) {
- #endif
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- // Schedule pending power off request and cause destruction of the adapter by
- // dropping the reference count to 0. Note that we are intentionally not using
- // a TestBluetoothAdapterObserver, as this would hold another reference to the
- // adapter and thus interfere with the intended destruction.
- // We expect the error callback to be invoked, and any other subsequent calls
- // to SetPowered() should fail as well.
- bool error_callback_called = false;
- BluetoothAdapter* adapter = adapter_.get();
- adapter->SetPowered(
- false, GetCallback(Call::NOT_EXPECTED),
- base::BindLambdaForTesting(
- // Note that we explicitly need to capture a pointer to the
- // underlying adapter, even though we pass |this| implicitly. This is
- // because by the time this callback is invoked, |adapter| is already
- // set to null, but the pointed to adapter instance is still alive. So
- // using the pointer is safe, but dereferencing |adapter| crashes.
- [&] {
- error_callback_called = true;
- adapter->SetPowered(false, GetCallback(Call::NOT_EXPECTED),
- GetErrorCallback(Call::EXPECTED));
- adapter->SetPowered(true, GetCallback(Call::NOT_EXPECTED),
- GetErrorCallback(Call::EXPECTED));
- }));
- adapter_ = nullptr;
- // Empty the message loop to make sure posted callbacks get run.
- task_environment_.RunUntilIdle();
- EXPECT_TRUE(error_callback_called);
- }
- #if BUILDFLAG(IS_ANDROID)
- #define MAYBE_TogglePowerBeforeScan TogglePowerBeforeScan
- #else
- #define MAYBE_TogglePowerBeforeScan DISABLED_TogglePowerBeforeScan
- #endif
- TEST_F(BluetoothTest, MAYBE_TogglePowerBeforeScan) {
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- ASSERT_TRUE(adapter_->IsPresent());
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(0, observer.powered_changed_count());
- // Turn off adapter.
- adapter_->SetPowered(false, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(adapter_->IsPowered());
- EXPECT_EQ(1, observer.powered_changed_count());
- // Try to perform a scan.
- StartLowEnergyDiscoverySessionExpectedToFail();
- // Turn on adapter.
- adapter_->SetPowered(true, GetCallback(Call::EXPECTED),
- GetErrorCallback(Call::NOT_EXPECTED));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(adapter_->IsPowered());
- EXPECT_EQ(2, observer.powered_changed_count());
- // Try to perform a scan again.
- ResetEventCounts();
- StartLowEnergyDiscoverySession();
- EXPECT_EQ(1, callback_count_);
- EXPECT_EQ(0, error_callback_count_);
- EXPECT_TRUE(adapter_->IsDiscovering());
- ASSERT_EQ((size_t)1, discovery_sessions_.size());
- EXPECT_TRUE(discovery_sessions_[0]->IsActive());
- }
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, DiscoverySessionFailure) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- EXPECT_FALSE(adapter_->IsDiscovering());
- StartLowEnergyDiscoverySession();
- EXPECT_EQ(1, callback_count_);
- EXPECT_EQ(0, error_callback_count_);
- EXPECT_TRUE(adapter_->IsDiscovering());
- EXPECT_EQ(1, observer.discovering_changed_count());
- EXPECT_TRUE(observer.last_discovering());
- ASSERT_EQ((size_t)1, discovery_sessions_.size());
- EXPECT_TRUE(discovery_sessions_[0]->IsActive());
- SimulateLowEnergyDiscoveryFailure();
- EXPECT_FALSE(adapter_->IsDiscovering());
- EXPECT_FALSE(discovery_sessions_[0]->IsActive());
- EXPECT_EQ(2, observer.discovering_changed_count());
- EXPECT_FALSE(observer.last_discovering());
- }
- #endif // BUILDFLAG(IS_WIN)
- #if BUILDFLAG(IS_MAC)
- #define MAYBE_TurnOffAdapterWithConnectedDevice \
- TurnOffAdapterWithConnectedDevice
- #else
- #define MAYBE_TurnOffAdapterWithConnectedDevice \
- DISABLED_TurnOffAdapterWithConnectedDevice
- #endif
- // TODO(crbug.com/725270): Enable on relevant platforms.
- TEST_F(BluetoothTest, MAYBE_TurnOffAdapterWithConnectedDevice) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- StartLowEnergyDiscoverySession();
- BluetoothDevice* device = SimulateLowEnergyDevice(3);
- device->CreateGattConnection(
- GetGattConnectionCallback(Call::EXPECTED, Result::SUCCESS));
- SimulateGattConnection(device);
- base::RunLoop().RunUntilIdle();
- ASSERT_TRUE(device->IsGattConnected());
- ResetEventCounts();
- SimulateAdapterPoweredOff();
- EXPECT_EQ(2, observer.device_changed_count());
- EXPECT_FALSE(device->IsConnected());
- EXPECT_FALSE(device->IsGattConnected());
- }
- #if BUILDFLAG(IS_WIN)
- TEST_P(BluetoothTestWinrtOnly, RegisterAdvertisement) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- InitWithFakeAdapter();
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_FALSE(pending_advertisements.empty());
- SimulateAdvertisementStarted(pending_advertisements[0]);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, FailRegisterAdvertisement) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- InitWithFakeAdapter();
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::NOT_EXPECTED),
- GetAdvertisementErrorCallback(Call::EXPECTED));
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_FALSE(pending_advertisements.empty());
- SimulateAdvertisementError(pending_advertisements[0],
- BluetoothAdvertisement::ERROR_ADAPTER_POWERED_OFF);
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(BluetoothAdvertisement::ERROR_ADAPTER_POWERED_OFF,
- last_advertisement_error_code_);
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, RegisterAndUnregisterAdvertisement) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- InitWithFakeAdapter();
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_FALSE(pending_advertisements.empty());
- auto* advertisement = pending_advertisements[0];
- SimulateAdvertisementStarted(advertisement);
- base::RunLoop().RunUntilIdle();
- TestBluetoothAdvertisementObserver observer(advertisement);
- advertisement->Unregister(GetCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- SimulateAdvertisementStopped(advertisement);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, FailUnregisterAdvertisement) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- InitWithFakeAdapter();
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_FALSE(pending_advertisements.empty());
- auto* advertisement = pending_advertisements[0];
- SimulateAdvertisementStarted(advertisement);
- base::RunLoop().RunUntilIdle();
- TestBluetoothAdvertisementObserver observer(advertisement);
- advertisement->Unregister(GetCallback(Call::NOT_EXPECTED),
- GetAdvertisementErrorCallback(Call::EXPECTED));
- SimulateAdvertisementError(advertisement,
- BluetoothAdvertisement::ERROR_RESET_ADVERTISING);
- base::RunLoop().RunUntilIdle();
- // Expect no change to the observer status.
- EXPECT_FALSE(observer.released());
- EXPECT_EQ(0u, observer.released_count());
- EXPECT_EQ(BluetoothAdvertisement::ERROR_RESET_ADVERTISING,
- last_advertisement_error_code_);
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, RegisterAdvertisementWithInvalidData) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- // WinRT only accepts ManufacturerData in the payload, other data should be
- // rejected.
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_service_data(
- std::make_unique<BluetoothAdvertisement::ServiceData>());
- InitWithFakeAdapter();
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::NOT_EXPECTED),
- GetAdvertisementErrorCallback(Call::EXPECTED));
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(BluetoothAdvertisement::ERROR_STARTING_ADVERTISEMENT,
- last_advertisement_error_code_);
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, RegisterMultipleAdvertisements) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- constexpr size_t kNumAdvertisements = 10u;
- for (size_t i = 0; i < kNumAdvertisements; ++i) {
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- }
- base::RunLoop().RunUntilIdle();
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_EQ(kNumAdvertisements, pending_advertisements.size());
- for (size_t i = 0; i < kNumAdvertisements; ++i)
- SimulateAdvertisementStarted(pending_advertisements[i]);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, UnregisterAdvertisementWhilePendingUnregister) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- base::RunLoop().RunUntilIdle();
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_EQ(1u, pending_advertisements.size());
- auto* advertisement = pending_advertisements[0];
- SimulateAdvertisementStarted(advertisement);
- base::RunLoop().RunUntilIdle();
- TestBluetoothAdvertisementObserver observer(advertisement);
- advertisement->Unregister(GetCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- // Schedule another Unregister, which is expected to fail.
- advertisement->Unregister(GetCallback(Call::NOT_EXPECTED),
- GetAdvertisementErrorCallback(Call::EXPECTED));
- base::RunLoop().RunUntilIdle();
- // Expect no change to the observer status.
- EXPECT_FALSE(observer.released());
- EXPECT_EQ(0u, observer.released_count());
- EXPECT_EQ(BluetoothAdvertisement::ERROR_RESET_ADVERTISING,
- last_advertisement_error_code_);
- // Simulate success of the first unregistration.
- SimulateAdvertisementStopped(advertisement);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, DoubleUnregisterAdvertisement) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- base::RunLoop().RunUntilIdle();
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_EQ(1u, pending_advertisements.size());
- auto* advertisement = pending_advertisements[0];
- SimulateAdvertisementStarted(advertisement);
- base::RunLoop().RunUntilIdle();
- // Perform two unregistrations after each other. Both should succeed.
- TestBluetoothAdvertisementObserver observer(advertisement);
- advertisement->Unregister(GetCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- SimulateAdvertisementStopped(advertisement);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- advertisement->Unregister(GetCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- SimulateAdvertisementStopped(advertisement);
- base::RunLoop().RunUntilIdle();
- // The second unregister is a no-op, and should not notify observers again.
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- }
- TEST_P(BluetoothTestWinrtOnly, SimulateAdvertisementStoppedByOS) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- auto advertisement_data = std::make_unique<BluetoothAdvertisement::Data>(
- BluetoothAdvertisement::ADVERTISEMENT_TYPE_BROADCAST);
- advertisement_data->set_manufacturer_data(
- std::make_unique<BluetoothAdvertisement::ManufacturerData>());
- adapter_->RegisterAdvertisement(
- std::move(advertisement_data),
- GetCreateAdvertisementCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- base::RunLoop().RunUntilIdle();
- auto pending_advertisements = adapter_->GetPendingAdvertisementsForTesting();
- ASSERT_EQ(1u, pending_advertisements.size());
- auto* advertisement = pending_advertisements[0];
- SimulateAdvertisementStarted(advertisement);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(adapter_->GetPendingAdvertisementsForTesting().empty());
- TestBluetoothAdvertisementObserver observer(advertisement);
- // Simulate the OS stopping the advertisement. This should notify the
- // |observer|.
- SimulateAdvertisementStopped(advertisement);
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- // While Unregister() is a no-op now, we still expect an invocation of the
- // success callback, but no change to the |observer| state.
- advertisement->Unregister(GetCallback(Call::EXPECTED),
- GetAdvertisementErrorCallback(Call::NOT_EXPECTED));
- base::RunLoop().RunUntilIdle();
- EXPECT_TRUE(observer.released());
- EXPECT_EQ(1u, observer.released_count());
- }
- #endif // BUILDFLAG(IS_WIN)
- #if (BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)) && \
- !defined(USE_CAST_BLUETOOTH_ADAPTER)
- #define MAYBE_RegisterLocalGattServices RegisterLocalGattServices
- #else
- #define MAYBE_RegisterLocalGattServices DISABLED_RegisterLocalGattServices
- #endif
- TEST_F(BluetoothTest, MAYBE_RegisterLocalGattServices) {
- InitWithFakeAdapter();
- base::WeakPtr<BluetoothLocalGattService> service =
- BluetoothLocalGattService::Create(
- adapter_.get(), BluetoothUUID(kTestUUIDGenericAttribute), true,
- nullptr, nullptr);
- base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic1 =
- BluetoothLocalGattCharacteristic::Create(
- BluetoothUUID(kTestUUIDGenericAttribute),
- BluetoothLocalGattCharacteristic::Properties(),
- BluetoothLocalGattCharacteristic::Permissions(), service.get());
- base::WeakPtr<BluetoothLocalGattCharacteristic> characteristic2 =
- BluetoothLocalGattCharacteristic::Create(
- BluetoothUUID(kTestUUIDGenericAttribute),
- BluetoothLocalGattCharacteristic::Properties(),
- BluetoothLocalGattCharacteristic::Permissions(), service.get());
- base::WeakPtr<BluetoothLocalGattDescriptor> descriptor =
- BluetoothLocalGattDescriptor::Create(
- BluetoothUUID(kTestUUIDGenericAttribute),
- BluetoothLocalGattCharacteristic::Permissions(),
- characteristic1.get());
- service->Register(GetCallback(Call::EXPECTED),
- GetGattErrorCallback(Call::NOT_EXPECTED));
- service->Register(GetCallback(Call::NOT_EXPECTED),
- GetGattErrorCallback(Call::EXPECTED));
- service->Unregister(GetCallback(Call::EXPECTED),
- GetGattErrorCallback(Call::NOT_EXPECTED));
- service->Unregister(GetCallback(Call::NOT_EXPECTED),
- GetGattErrorCallback(Call::EXPECTED));
- }
- // This test should only be enabled for platforms that uses the
- // BluetoothAdapter#RemoveOutdatedDevices function to purge outdated
- // devices.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_EnsureUpdatedTimestamps EnsureUpdatedTimestamps
- #else
- #define MAYBE_EnsureUpdatedTimestamps DISABLED_EnsureUpdatedTimestamps
- #endif
- TEST_F(BluetoothTest, MAYBE_EnsureUpdatedTimestamps) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- // Test that the timestamp of a device is updated during multiple
- // discovery sessions.
- StartLowEnergyDiscoverySession();
- BluetoothDevice* device = SimulateLowEnergyDevice(1);
- EXPECT_EQ(1, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- base::Time first_timestamp = device->GetLastUpdateTime();
- // Do a new discovery and check that the timestamp is updated.
- observer.Reset();
- StartLowEnergyDiscoverySession();
- SimulateLowEnergyDevice(1);
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- base::Time second_timestamp = device->GetLastUpdateTime();
- EXPECT_TRUE(second_timestamp > first_timestamp);
- // Check that timestamp doesn't change when there is no discovery.
- base::Time third_timestamp = device->GetLastUpdateTime();
- EXPECT_TRUE(second_timestamp == third_timestamp);
- }
- // This test should only be enabled for platforms that uses the
- // BluetoothAdapter#RemoveOutdatedDevices function to purge outdated
- // devices.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_RemoveOutdatedDevices RemoveOutdatedDevices
- #else
- #define MAYBE_RemoveOutdatedDevices DISABLED_RemoveOutdatedDevices
- #endif
- TEST_F(BluetoothTest, MAYBE_RemoveOutdatedDevices) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- StartLowEnergyDiscoverySession();
- BluetoothDevice* device1 = SimulateLowEnergyDevice(1);
- BluetoothDevice* device2 = SimulateLowEnergyDevice(4);
- EXPECT_EQ(2u, adapter_->GetDevices().size());
- device1->SetAsExpiredForTesting();
- // Check that the outdated device is removed.
- RemoveTimedOutDevices();
- EXPECT_EQ(1, observer.device_removed_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- EXPECT_EQ(adapter_->GetDevices()[0]->GetAddress(), device2->GetAddress());
- }
- // This test should only be enabled for platforms that uses the
- // BluetoothAdapter#RemoveOutdatedDevices function to purge outdated
- // devices.
- #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
- #define MAYBE_RemoveOutdatedDeviceGattConnect RemoveOutdatedDeviceGattConnect
- #else
- #define MAYBE_RemoveOutdatedDeviceGattConnect \
- DISABLED_RemoveOutdatedDeviceGattConnect
- #endif
- TEST_F(BluetoothTest, MAYBE_RemoveOutdatedDeviceGattConnect) {
- // Test that a device with GATT connection isn't removed.
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- StartLowEnergyDiscoverySession();
- BluetoothDevice* device = SimulateLowEnergyDevice(1);
- device->SetAsExpiredForTesting();
- device->CreateGattConnection(
- GetGattConnectionCallback(Call::EXPECTED, Result::SUCCESS));
- SimulateGattConnection(device);
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- RemoveTimedOutDevices();
- EXPECT_EQ(0, observer.device_removed_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- }
- #if BUILDFLAG(IS_MAC)
- // Simulate two devices being connected before calling
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() with no service filter.
- TEST_F(BluetoothTest, DiscoverConnectedLowEnergyDeviceWithNoFilter) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::GENERIC_DEVICE);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::HEART_RATE_DEVICE);
- BluetoothDiscoveryFilter discovery_filter(BLUETOOTH_TRANSPORT_LE);
- std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet> result =
- adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_EQ(2u, result.size());
- for (const auto& pair : result) {
- EXPECT_TRUE(adapter_->GetDevice(pair.first->GetAddress()));
- EXPECT_TRUE(pair.second.empty());
- }
- EXPECT_EQ(BluetoothDevice::UUIDSet({BluetoothUUID(kTestUUIDGenericAccess)}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(2, observer.device_added_count());
- EXPECT_EQ(2u, adapter_->GetDevices().size());
- }
- #endif // BUILDFLAG(IS_MAC)
- #if BUILDFLAG(IS_MAC)
- // Simulate two devices being connected before calling
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() with one service filter.
- TEST_F(BluetoothTest, DiscoverConnectedLowEnergyDeviceWithFilter) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::GENERIC_DEVICE);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::HEART_RATE_DEVICE);
- BluetoothDiscoveryFilter discovery_filter(BLUETOOTH_TRANSPORT_LE);
- BluetoothUUID heart_service_uuid = BluetoothUUID(kTestUUIDHeartRate);
- AddDeviceFilterWithUUID(&discovery_filter, heart_service_uuid);
- std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet> result =
- adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_EQ(1u, result.size());
- for (const auto& pair : result) {
- EXPECT_EQ(kTestDeviceAddress2, pair.first->GetAddress());
- EXPECT_TRUE(adapter_->GetDevice(pair.first->GetAddress()));
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}), pair.second);
- }
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(1, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- }
- #endif // BUILDFLAG(IS_MAC)
- #if BUILDFLAG(IS_MAC)
- // Simulate two devices being connected before calling
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() with one service filter
- // that doesn't match.
- TEST_F(BluetoothTest, DiscoverConnectedLowEnergyDeviceWithWrongFilter) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::GENERIC_DEVICE);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::HEART_RATE_DEVICE);
- BluetoothDiscoveryFilter discovery_filter(BLUETOOTH_TRANSPORT_LE);
- AddDeviceFilterWithUUID(&discovery_filter, BluetoothUUID(kTestUUIDLinkLoss));
- std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet> result =
- adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_TRUE(result.empty());
- EXPECT_EQ(
- BluetoothDevice::UUIDSet({device::BluetoothUUID(kTestUUIDLinkLoss)}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(0u, adapter_->GetDevices().size());
- }
- #endif // BUILDFLAG(IS_MAC)
- #if BUILDFLAG(IS_MAC)
- // Simulate two devices being connected before calling
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() with two service filters
- // that both match.
- TEST_F(BluetoothTest, DiscoverConnectedLowEnergyDeviceWithTwoFilters) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::GENERIC_DEVICE);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::HEART_RATE_DEVICE);
- BluetoothDiscoveryFilter discovery_filter(BLUETOOTH_TRANSPORT_LE);
- BluetoothUUID heart_service_uuid = BluetoothUUID(kTestUUIDHeartRate);
- AddDeviceFilterWithUUID(&discovery_filter, heart_service_uuid);
- BluetoothUUID generic_service_uuid = BluetoothUUID(kTestUUIDGenericAccess);
- AddDeviceFilterWithUUID(&discovery_filter, generic_service_uuid);
- std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet> result =
- adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_EQ(2u, result.size());
- for (const auto& pair : result) {
- EXPECT_TRUE(adapter_->GetDevice(pair.first->GetAddress()));
- if (pair.first->GetAddress() == kTestDeviceAddress2) {
- EXPECT_EQ(
- BluetoothDevice::UUIDSet({heart_service_uuid, generic_service_uuid}),
- pair.second);
- } else if (pair.first->GetAddress() == kTestDeviceAddress1) {
- EXPECT_EQ(BluetoothDevice::UUIDSet({generic_service_uuid}), pair.second);
- } else {
- // Unknown device.
- EXPECT_TRUE(false);
- }
- }
- EXPECT_EQ(
- BluetoothDevice::UUIDSet({generic_service_uuid, heart_service_uuid}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(2, observer.device_added_count());
- EXPECT_EQ(2u, adapter_->GetDevices().size());
- }
- #endif // BUILDFLAG(IS_MAC)
- #if BUILDFLAG(IS_MAC)
- // Simulate two devices being connected before calling
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() with one service filter
- // that one match device, and then
- // RetrieveGattConnectedDevicesWithDiscoveryFilter() again.
- TEST_F(BluetoothTest, DiscoverConnectedLowEnergyDeviceTwice) {
- if (!PlatformSupportsLowEnergy()) {
- LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
- return;
- }
- InitWithFakeAdapter();
- TestBluetoothAdapterObserver observer(adapter_);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::GENERIC_DEVICE);
- SimulateConnectedLowEnergyDevice(ConnectedDeviceType::HEART_RATE_DEVICE);
- BluetoothDiscoveryFilter discovery_filter(BLUETOOTH_TRANSPORT_LE);
- BluetoothUUID heart_service_uuid = BluetoothUUID(kTestUUIDHeartRate);
- AddDeviceFilterWithUUID(&discovery_filter, heart_service_uuid);
- std::unordered_map<BluetoothDevice*, BluetoothDevice::UUIDSet> result =
- adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_EQ(1u, result.size());
- for (const auto& pair : result) {
- EXPECT_EQ(kTestDeviceAddress2, pair.first->GetAddress());
- EXPECT_TRUE(adapter_->GetDevice(pair.first->GetAddress()));
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}), pair.second);
- }
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(1, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- observer.Reset();
- ResetRetrieveConnectedPeripheralServiceUUIDs();
- result = adapter_->RetrieveGattConnectedDevicesWithDiscoveryFilter(
- discovery_filter);
- EXPECT_EQ(1u, result.size());
- for (const auto& pair : result) {
- EXPECT_EQ(kTestDeviceAddress2, pair.first->GetAddress());
- EXPECT_TRUE(adapter_->GetDevice(pair.first->GetAddress()));
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}), pair.second);
- }
- EXPECT_EQ(BluetoothDevice::UUIDSet({heart_service_uuid}),
- RetrieveConnectedPeripheralServiceUUIDs());
- EXPECT_EQ(0, observer.device_added_count());
- EXPECT_EQ(1u, adapter_->GetDevices().size());
- }
- #endif // BUILDFLAG(IS_MAC)
- #if BUILDFLAG(IS_WIN)
- INSTANTIATE_TEST_SUITE_P(All,
- BluetoothTestWinrt,
- ::testing::ValuesIn(kBluetoothTestWinrtParamAll));
- INSTANTIATE_TEST_SUITE_P(
- All,
- BluetoothTestWinrtOnly,
- ::testing::ValuesIn(kBluetoothTestWinrtParamWinrtOnly));
- #endif // BUILDFLAG(IS_WIN)
- } // namespace device
|