Home | History | Annotate | Download | only in bluetooth
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "base/bind.h"
      8 #include "base/memory/ref_counted.h"
      9 #include "base/strings/string_number_conversions.h"
     10 #include "base/test/test_simple_task_runner.h"
     11 #include "device/bluetooth/bluetooth_adapter.h"
     12 #include "device/bluetooth/bluetooth_adapter_win.h"
     13 #include "device/bluetooth/bluetooth_device.h"
     14 #include "device/bluetooth/bluetooth_task_manager_win.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 namespace {
     18 
     19 const char kAdapterAddress[] = "A1:B2:C3:D4:E5:F6";
     20 const char kAdapterName[] = "Bluetooth Adapter Name";
     21 
     22 const char kTestAudioSdpName[] = "Audio";
     23 const char kTestAudioSdpName2[] = "Audio2";
     24 const char kTestAudioSdpBytes[] =
     25     "35510900000a00010001090001350319110a09000435103506190100090019350619001909"
     26     "010209000535031910020900093508350619110d090102090100250c417564696f20536f75"
     27     "726365090311090001";
     28 const device::BluetoothUUID kTestAudioSdpUuid("110a");
     29 
     30 void MakeDeviceState(const std::string& name,
     31                      const std::string& address,
     32                      device::BluetoothTaskManagerWin::DeviceState* state) {
     33   state->name = name;
     34   state->address = address;
     35   state->bluetooth_class = 0;
     36   state->authenticated = false;
     37   state->connected = false;
     38 }
     39 
     40 class AdapterObserver : public device::BluetoothAdapter::Observer {
     41  public:
     42   AdapterObserver() { ResetCounters(); }
     43 
     44   void ResetCounters() {
     45     num_present_changed_ = 0;
     46     num_powered_changed_ = 0;
     47     num_discovering_changed_ = 0;
     48     num_device_added_ = 0;
     49     num_device_removed_ = 0;
     50     num_device_changed_ = 0;
     51   }
     52 
     53   virtual void AdapterPresentChanged(
     54       device::BluetoothAdapter* adapter, bool present) OVERRIDE {
     55     num_present_changed_++;
     56   }
     57 
     58   virtual void AdapterPoweredChanged(
     59       device::BluetoothAdapter* adapter, bool powered) OVERRIDE {
     60     num_powered_changed_++;
     61   }
     62 
     63   virtual void AdapterDiscoveringChanged(
     64       device::BluetoothAdapter* adapter, bool discovering) OVERRIDE {
     65     num_discovering_changed_++;
     66   }
     67 
     68   virtual void DeviceAdded(
     69       device::BluetoothAdapter* adapter,
     70       device::BluetoothDevice* device) OVERRIDE {
     71     num_device_added_++;
     72   }
     73 
     74   virtual void DeviceRemoved(device::BluetoothAdapter* adapter,
     75                              device::BluetoothDevice* device) OVERRIDE {
     76     num_device_removed_++;
     77   }
     78 
     79   virtual void DeviceChanged(device::BluetoothAdapter* adapter,
     80                              device::BluetoothDevice* device) OVERRIDE {
     81     num_device_changed_++;
     82   }
     83 
     84   int num_present_changed() const { return num_present_changed_; }
     85 
     86   int num_powered_changed() const { return num_powered_changed_; }
     87 
     88   int num_discovering_changed() const { return num_discovering_changed_; }
     89 
     90   int num_device_added() const { return num_device_added_; }
     91 
     92   int num_device_removed() const { return num_device_removed_; }
     93 
     94   int num_device_changed() const { return num_device_changed_; }
     95 
     96  private:
     97   int num_present_changed_;
     98   int num_powered_changed_;
     99   int num_discovering_changed_;
    100   int num_device_added_;
    101   int num_device_removed_;
    102   int num_device_changed_;
    103 };
    104 
    105 }  // namespace
    106 
    107 namespace device {
    108 
    109 class BluetoothAdapterWinTest : public testing::Test {
    110  public:
    111   BluetoothAdapterWinTest()
    112       : ui_task_runner_(new base::TestSimpleTaskRunner()),
    113         bluetooth_task_runner_(new base::TestSimpleTaskRunner()),
    114         adapter_(new BluetoothAdapterWin(
    115           base::Bind(&BluetoothAdapterWinTest::RunInitCallback,
    116                      base::Unretained(this)))),
    117         adapter_win_(static_cast<BluetoothAdapterWin*>(adapter_.get())),
    118         init_callback_called_(false) {
    119     adapter_win_->InitForTest(ui_task_runner_, bluetooth_task_runner_);
    120   }
    121 
    122   virtual void SetUp() OVERRIDE {
    123     adapter_win_->AddObserver(&adapter_observer_);
    124     num_start_discovery_callbacks_ = 0;
    125     num_start_discovery_error_callbacks_ = 0;
    126     num_stop_discovery_callbacks_ = 0;
    127     num_stop_discovery_error_callbacks_ = 0;
    128   }
    129 
    130   virtual void TearDown() OVERRIDE {
    131     adapter_win_->RemoveObserver(&adapter_observer_);
    132   }
    133 
    134   void RunInitCallback() {
    135     init_callback_called_ = true;
    136   }
    137 
    138   void IncrementNumStartDiscoveryCallbacks() {
    139     num_start_discovery_callbacks_++;
    140   }
    141 
    142   void IncrementNumStartDiscoveryErrorCallbacks() {
    143     num_start_discovery_error_callbacks_++;
    144   }
    145 
    146   void IncrementNumStopDiscoveryCallbacks() {
    147     num_stop_discovery_callbacks_++;
    148   }
    149 
    150   void IncrementNumStopDiscoveryErrorCallbacks() {
    151     num_stop_discovery_error_callbacks_++;
    152   }
    153 
    154   void CallAddDiscoverySession(
    155       const base::Closure& callback,
    156       const BluetoothAdapter::ErrorCallback& error_callback) {
    157     adapter_win_->AddDiscoverySession(callback, error_callback);
    158   }
    159 
    160   void CallRemoveDiscoverySession(
    161       const base::Closure& callback,
    162       const BluetoothAdapter::ErrorCallback& error_callback) {
    163     adapter_win_->RemoveDiscoverySession(callback, error_callback);
    164   }
    165 
    166  protected:
    167   scoped_refptr<base::TestSimpleTaskRunner> ui_task_runner_;
    168   scoped_refptr<base::TestSimpleTaskRunner> bluetooth_task_runner_;
    169   scoped_refptr<BluetoothAdapter> adapter_;
    170   BluetoothAdapterWin* adapter_win_;
    171   AdapterObserver adapter_observer_;
    172   bool init_callback_called_;
    173   int num_start_discovery_callbacks_;
    174   int num_start_discovery_error_callbacks_;
    175   int num_stop_discovery_callbacks_;
    176   int num_stop_discovery_error_callbacks_;
    177 };
    178 
    179 TEST_F(BluetoothAdapterWinTest, AdapterNotPresent) {
    180   BluetoothTaskManagerWin::AdapterState state;
    181   adapter_win_->AdapterStateChanged(state);
    182   EXPECT_FALSE(adapter_win_->IsPresent());
    183 }
    184 
    185 TEST_F(BluetoothAdapterWinTest, AdapterPresent) {
    186   BluetoothTaskManagerWin::AdapterState state;
    187   state.address = kAdapterAddress;
    188   state.name = kAdapterName;
    189   adapter_win_->AdapterStateChanged(state);
    190   EXPECT_TRUE(adapter_win_->IsPresent());
    191 }
    192 
    193 TEST_F(BluetoothAdapterWinTest, AdapterPresentChanged) {
    194   BluetoothTaskManagerWin::AdapterState state;
    195   state.address = kAdapterAddress;
    196   state.name = kAdapterName;
    197   adapter_win_->AdapterStateChanged(state);
    198   EXPECT_EQ(1, adapter_observer_.num_present_changed());
    199   adapter_win_->AdapterStateChanged(state);
    200   EXPECT_EQ(1, adapter_observer_.num_present_changed());
    201   BluetoothTaskManagerWin::AdapterState empty_state;
    202   adapter_win_->AdapterStateChanged(empty_state);
    203   EXPECT_EQ(2, adapter_observer_.num_present_changed());
    204 }
    205 
    206 TEST_F(BluetoothAdapterWinTest, AdapterPoweredChanged) {
    207   BluetoothTaskManagerWin::AdapterState state;
    208   state.powered = true;
    209   adapter_win_->AdapterStateChanged(state);
    210   EXPECT_EQ(1, adapter_observer_.num_powered_changed());
    211   adapter_win_->AdapterStateChanged(state);
    212   EXPECT_EQ(1, adapter_observer_.num_powered_changed());
    213   state.powered = false;
    214   adapter_win_->AdapterStateChanged(state);
    215   EXPECT_EQ(2, adapter_observer_.num_powered_changed());
    216 }
    217 
    218 TEST_F(BluetoothAdapterWinTest, AdapterInitialized) {
    219   EXPECT_FALSE(adapter_win_->IsInitialized());
    220   EXPECT_FALSE(init_callback_called_);
    221   BluetoothTaskManagerWin::AdapterState state;
    222   adapter_win_->AdapterStateChanged(state);
    223   EXPECT_TRUE(adapter_win_->IsInitialized());
    224   EXPECT_TRUE(init_callback_called_);
    225 }
    226 
    227 TEST_F(BluetoothAdapterWinTest, SingleStartDiscovery) {
    228   bluetooth_task_runner_->ClearPendingTasks();
    229   CallAddDiscoverySession(
    230       base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    231                  base::Unretained(this)),
    232       BluetoothAdapter::ErrorCallback());
    233   EXPECT_TRUE(ui_task_runner_->GetPendingTasks().empty());
    234   EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    235   EXPECT_FALSE(adapter_->IsDiscovering());
    236   EXPECT_EQ(0, num_start_discovery_callbacks_);
    237   adapter_win_->DiscoveryStarted(true);
    238   ui_task_runner_->RunPendingTasks();
    239   EXPECT_TRUE(adapter_->IsDiscovering());
    240   EXPECT_EQ(1, num_start_discovery_callbacks_);
    241   EXPECT_EQ(1, adapter_observer_.num_discovering_changed());
    242 }
    243 
    244 TEST_F(BluetoothAdapterWinTest, SingleStartDiscoveryFailure) {
    245   CallAddDiscoverySession(
    246       base::Closure(),
    247       base::Bind(
    248           &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks,
    249           base::Unretained(this)));
    250   adapter_win_->DiscoveryStarted(false);
    251   ui_task_runner_->RunPendingTasks();
    252   EXPECT_FALSE(adapter_->IsDiscovering());
    253   EXPECT_EQ(1, num_start_discovery_error_callbacks_);
    254   EXPECT_EQ(0, adapter_observer_.num_discovering_changed());
    255 }
    256 
    257 TEST_F(BluetoothAdapterWinTest, MultipleStartDiscoveries) {
    258   bluetooth_task_runner_->ClearPendingTasks();
    259   int num_discoveries = 5;
    260   for (int i = 0; i < num_discoveries; i++) {
    261     CallAddDiscoverySession(
    262         base::Bind(
    263             &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    264             base::Unretained(this)),
    265         BluetoothAdapter::ErrorCallback());
    266     EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    267   }
    268   EXPECT_TRUE(ui_task_runner_->GetPendingTasks().empty());
    269   EXPECT_FALSE(adapter_->IsDiscovering());
    270   EXPECT_EQ(0, num_start_discovery_callbacks_);
    271   adapter_win_->DiscoveryStarted(true);
    272   ui_task_runner_->RunPendingTasks();
    273   EXPECT_TRUE(adapter_->IsDiscovering());
    274   EXPECT_EQ(num_discoveries, num_start_discovery_callbacks_);
    275   EXPECT_EQ(1, adapter_observer_.num_discovering_changed());
    276 }
    277 
    278 TEST_F(BluetoothAdapterWinTest, MultipleStartDiscoveriesFailure) {
    279   int num_discoveries = 5;
    280   for (int i = 0; i < num_discoveries; i++) {
    281     CallAddDiscoverySession(
    282         base::Closure(),
    283         base::Bind(
    284             &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks,
    285             base::Unretained(this)));
    286   }
    287   adapter_win_->DiscoveryStarted(false);
    288   ui_task_runner_->RunPendingTasks();
    289   EXPECT_FALSE(adapter_->IsDiscovering());
    290   EXPECT_EQ(num_discoveries, num_start_discovery_error_callbacks_);
    291   EXPECT_EQ(0, adapter_observer_.num_discovering_changed());
    292 }
    293 
    294 TEST_F(BluetoothAdapterWinTest, MultipleStartDiscoveriesAfterDiscovering) {
    295   CallAddDiscoverySession(
    296       base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    297                  base::Unretained(this)),
    298       BluetoothAdapter::ErrorCallback());
    299   adapter_win_->DiscoveryStarted(true);
    300   ui_task_runner_->RunPendingTasks();
    301   EXPECT_TRUE(adapter_->IsDiscovering());
    302   EXPECT_EQ(1, num_start_discovery_callbacks_);
    303 
    304   bluetooth_task_runner_->ClearPendingTasks();
    305   for (int i = 0; i < 5; i++) {
    306     int num_start_discovery_callbacks = num_start_discovery_callbacks_;
    307     CallAddDiscoverySession(
    308         base::Bind(
    309            &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    310            base::Unretained(this)),
    311         BluetoothAdapter::ErrorCallback());
    312     EXPECT_TRUE(adapter_->IsDiscovering());
    313     EXPECT_TRUE(bluetooth_task_runner_->GetPendingTasks().empty());
    314     EXPECT_TRUE(ui_task_runner_->GetPendingTasks().empty());
    315     EXPECT_EQ(num_start_discovery_callbacks + 1,
    316               num_start_discovery_callbacks_);
    317   }
    318   EXPECT_EQ(1, adapter_observer_.num_discovering_changed());
    319 }
    320 
    321 TEST_F(BluetoothAdapterWinTest, StartDiscoveryAfterDiscoveringFailure) {
    322   CallAddDiscoverySession(
    323       base::Closure(),
    324       base::Bind(
    325           &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks,
    326           base::Unretained(this)));
    327   adapter_win_->DiscoveryStarted(false);
    328   ui_task_runner_->RunPendingTasks();
    329   EXPECT_FALSE(adapter_->IsDiscovering());
    330   EXPECT_EQ(1, num_start_discovery_error_callbacks_);
    331 
    332   CallAddDiscoverySession(
    333       base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    334                  base::Unretained(this)),
    335       BluetoothAdapter::ErrorCallback());
    336   adapter_win_->DiscoveryStarted(true);
    337   ui_task_runner_->RunPendingTasks();
    338   EXPECT_TRUE(adapter_->IsDiscovering());
    339   EXPECT_EQ(1, num_start_discovery_callbacks_);
    340 }
    341 
    342 TEST_F(BluetoothAdapterWinTest, SingleStopDiscovery) {
    343   CallAddDiscoverySession(
    344       base::Closure(), BluetoothAdapter::ErrorCallback());
    345   adapter_win_->DiscoveryStarted(true);
    346   ui_task_runner_->ClearPendingTasks();
    347   CallRemoveDiscoverySession(
    348       base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    349                  base::Unretained(this)),
    350       BluetoothAdapter::ErrorCallback());
    351   EXPECT_TRUE(adapter_->IsDiscovering());
    352   EXPECT_EQ(0, num_stop_discovery_callbacks_);
    353   bluetooth_task_runner_->ClearPendingTasks();
    354   adapter_win_->DiscoveryStopped();
    355   ui_task_runner_->RunPendingTasks();
    356   EXPECT_FALSE(adapter_->IsDiscovering());
    357   EXPECT_EQ(1, num_stop_discovery_callbacks_);
    358   EXPECT_TRUE(bluetooth_task_runner_->GetPendingTasks().empty());
    359   EXPECT_EQ(2, adapter_observer_.num_discovering_changed());
    360 }
    361 
    362 TEST_F(BluetoothAdapterWinTest, MultipleStopDiscoveries) {
    363   int num_discoveries = 5;
    364   for (int i = 0; i < num_discoveries; i++) {
    365     CallAddDiscoverySession(
    366         base::Closure(), BluetoothAdapter::ErrorCallback());
    367   }
    368   adapter_win_->DiscoveryStarted(true);
    369   ui_task_runner_->ClearPendingTasks();
    370   bluetooth_task_runner_->ClearPendingTasks();
    371   for (int i = 0; i < num_discoveries - 1; i++) {
    372     CallRemoveDiscoverySession(
    373         base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    374                    base::Unretained(this)),
    375         BluetoothAdapter::ErrorCallback());
    376     EXPECT_TRUE(bluetooth_task_runner_->GetPendingTasks().empty());
    377     ui_task_runner_->RunPendingTasks();
    378     EXPECT_EQ(i + 1, num_stop_discovery_callbacks_);
    379   }
    380   CallRemoveDiscoverySession(
    381       base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    382                  base::Unretained(this)),
    383       BluetoothAdapter::ErrorCallback());
    384   EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    385   EXPECT_TRUE(adapter_->IsDiscovering());
    386   adapter_win_->DiscoveryStopped();
    387   ui_task_runner_->RunPendingTasks();
    388   EXPECT_FALSE(adapter_->IsDiscovering());
    389   EXPECT_EQ(num_discoveries, num_stop_discovery_callbacks_);
    390   EXPECT_EQ(2, adapter_observer_.num_discovering_changed());
    391 }
    392 
    393 TEST_F(BluetoothAdapterWinTest,
    394        StartDiscoveryAndStartDiscoveryAndStopDiscoveries) {
    395   CallAddDiscoverySession(
    396       base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    397                  base::Unretained(this)),
    398       BluetoothAdapter::ErrorCallback());
    399   adapter_win_->DiscoveryStarted(true);
    400   CallAddDiscoverySession(
    401       base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    402                  base::Unretained(this)),
    403       BluetoothAdapter::ErrorCallback());
    404   ui_task_runner_->ClearPendingTasks();
    405   bluetooth_task_runner_->ClearPendingTasks();
    406   CallRemoveDiscoverySession(
    407       base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    408                  base::Unretained(this)),
    409       BluetoothAdapter::ErrorCallback());
    410   EXPECT_TRUE(bluetooth_task_runner_->GetPendingTasks().empty());
    411   CallRemoveDiscoverySession(
    412       base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    413                  base::Unretained(this)),
    414       BluetoothAdapter::ErrorCallback());
    415   EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    416 }
    417 
    418 TEST_F(BluetoothAdapterWinTest,
    419        StartDiscoveryAndStopDiscoveryAndStartDiscovery) {
    420   CallAddDiscoverySession(
    421       base::Closure(), BluetoothAdapter::ErrorCallback());
    422   adapter_win_->DiscoveryStarted(true);
    423   EXPECT_TRUE(adapter_->IsDiscovering());
    424   CallRemoveDiscoverySession(
    425       base::Closure(), BluetoothAdapter::ErrorCallback());
    426   adapter_win_->DiscoveryStopped();
    427   EXPECT_FALSE(adapter_->IsDiscovering());
    428   CallAddDiscoverySession(
    429       base::Closure(), BluetoothAdapter::ErrorCallback());
    430   adapter_win_->DiscoveryStarted(true);
    431   EXPECT_TRUE(adapter_->IsDiscovering());
    432 }
    433 
    434 TEST_F(BluetoothAdapterWinTest, StartDiscoveryBeforeDiscoveryStopped) {
    435   CallAddDiscoverySession(
    436       base::Closure(), BluetoothAdapter::ErrorCallback());
    437   adapter_win_->DiscoveryStarted(true);
    438   CallRemoveDiscoverySession(
    439       base::Closure(), BluetoothAdapter::ErrorCallback());
    440   CallAddDiscoverySession(
    441       base::Closure(), BluetoothAdapter::ErrorCallback());
    442   bluetooth_task_runner_->ClearPendingTasks();
    443   adapter_win_->DiscoveryStopped();
    444   EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    445 }
    446 
    447 TEST_F(BluetoothAdapterWinTest, StopDiscoveryWithoutStartDiscovery) {
    448   CallRemoveDiscoverySession(
    449       base::Closure(),
    450       base::Bind(
    451           &BluetoothAdapterWinTest::IncrementNumStopDiscoveryErrorCallbacks,
    452           base::Unretained(this)));
    453   EXPECT_EQ(1, num_stop_discovery_error_callbacks_);
    454 }
    455 
    456 TEST_F(BluetoothAdapterWinTest, StopDiscoveryBeforeDiscoveryStarted) {
    457   CallAddDiscoverySession(
    458       base::Closure(), BluetoothAdapter::ErrorCallback());
    459   CallRemoveDiscoverySession(
    460       base::Closure(), BluetoothAdapter::ErrorCallback());
    461   bluetooth_task_runner_->ClearPendingTasks();
    462   adapter_win_->DiscoveryStarted(true);
    463   EXPECT_EQ(1, bluetooth_task_runner_->GetPendingTasks().size());
    464 }
    465 
    466 TEST_F(BluetoothAdapterWinTest, StartAndStopBeforeDiscoveryStarted) {
    467   int num_expected_start_discoveries = 3;
    468   int num_expected_stop_discoveries = 2;
    469   for (int i = 0; i < num_expected_start_discoveries; i++) {
    470     CallAddDiscoverySession(
    471         base::Bind(
    472             &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks,
    473             base::Unretained(this)),
    474         BluetoothAdapter::ErrorCallback());
    475   }
    476   for (int i = 0; i < num_expected_stop_discoveries; i++) {
    477     CallRemoveDiscoverySession(
    478         base::Bind(
    479             &BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    480             base::Unretained(this)),
    481         BluetoothAdapter::ErrorCallback());
    482   }
    483   bluetooth_task_runner_->ClearPendingTasks();
    484   adapter_win_->DiscoveryStarted(true);
    485   EXPECT_TRUE(bluetooth_task_runner_->GetPendingTasks().empty());
    486   ui_task_runner_->RunPendingTasks();
    487   EXPECT_EQ(num_expected_start_discoveries, num_start_discovery_callbacks_);
    488   EXPECT_EQ(num_expected_stop_discoveries, num_stop_discovery_callbacks_);
    489 }
    490 
    491 TEST_F(BluetoothAdapterWinTest, StopDiscoveryBeforeDiscoveryStartedAndFailed) {
    492   CallAddDiscoverySession(
    493       base::Closure(),
    494       base::Bind(
    495           &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks,
    496           base::Unretained(this)));
    497   CallRemoveDiscoverySession(
    498       base::Bind(
    499           &BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks,
    500           base::Unretained(this)),
    501       BluetoothAdapter::ErrorCallback());
    502   ui_task_runner_->ClearPendingTasks();
    503   adapter_win_->DiscoveryStarted(false);
    504   ui_task_runner_->RunPendingTasks();
    505   EXPECT_EQ(1, num_start_discovery_error_callbacks_);
    506   EXPECT_EQ(1, num_stop_discovery_callbacks_);
    507   EXPECT_EQ(0, adapter_observer_.num_discovering_changed());
    508 }
    509 
    510 TEST_F(BluetoothAdapterWinTest, DevicesPolled) {
    511   BluetoothTaskManagerWin::DeviceState* android_phone_state =
    512       new BluetoothTaskManagerWin::DeviceState();
    513   MakeDeviceState("phone", "A1:B2:C3:D4:E5:E0", android_phone_state);
    514   BluetoothTaskManagerWin::DeviceState* laptop_state =
    515       new BluetoothTaskManagerWin::DeviceState();
    516   MakeDeviceState("laptop", "A1:B2:C3:D4:E5:E1", laptop_state);
    517   BluetoothTaskManagerWin::DeviceState* iphone_state =
    518       new BluetoothTaskManagerWin::DeviceState();
    519   MakeDeviceState("phone", "A1:B2:C3:D4:E5:E2", iphone_state);
    520   ScopedVector<BluetoothTaskManagerWin::DeviceState> devices;
    521   devices.push_back(android_phone_state);
    522   devices.push_back(laptop_state);
    523   devices.push_back(iphone_state);
    524 
    525   // Add 3 devices
    526   adapter_observer_.ResetCounters();
    527   adapter_win_->DevicesPolled(devices);
    528   EXPECT_EQ(3, adapter_observer_.num_device_added());
    529   EXPECT_EQ(0, adapter_observer_.num_device_removed());
    530   EXPECT_EQ(0, adapter_observer_.num_device_changed());
    531 
    532   // Change a device name
    533   android_phone_state->name = "phone2";
    534   adapter_observer_.ResetCounters();
    535   adapter_win_->DevicesPolled(devices);
    536   EXPECT_EQ(0, adapter_observer_.num_device_added());
    537   EXPECT_EQ(0, adapter_observer_.num_device_removed());
    538   EXPECT_EQ(1, adapter_observer_.num_device_changed());
    539 
    540   // Change a device address
    541   android_phone_state->address = "A1:B2:C3:D4:E5:E6";
    542   adapter_observer_.ResetCounters();
    543   adapter_win_->DevicesPolled(devices);
    544   EXPECT_EQ(1, adapter_observer_.num_device_added());
    545   EXPECT_EQ(1, adapter_observer_.num_device_removed());
    546   EXPECT_EQ(0, adapter_observer_.num_device_changed());
    547 
    548   // Remove a device
    549   devices.erase(devices.begin());
    550   adapter_observer_.ResetCounters();
    551   adapter_win_->DevicesPolled(devices);
    552   EXPECT_EQ(0, adapter_observer_.num_device_added());
    553   EXPECT_EQ(1, adapter_observer_.num_device_removed());
    554   EXPECT_EQ(0, adapter_observer_.num_device_changed());
    555 
    556   // Add a service
    557   BluetoothTaskManagerWin::ServiceRecordState* audio_state =
    558       new BluetoothTaskManagerWin::ServiceRecordState();
    559   audio_state->name = kTestAudioSdpName;
    560   base::HexStringToBytes(kTestAudioSdpBytes, &audio_state->sdp_bytes);
    561   laptop_state->service_record_states.push_back(audio_state);
    562   adapter_observer_.ResetCounters();
    563   adapter_win_->DevicesPolled(devices);
    564   EXPECT_EQ(0, adapter_observer_.num_device_added());
    565   EXPECT_EQ(0, adapter_observer_.num_device_removed());
    566   EXPECT_EQ(1, adapter_observer_.num_device_changed());
    567 
    568   // Change a service
    569   audio_state->name = kTestAudioSdpName2;
    570   adapter_observer_.ResetCounters();
    571   adapter_win_->DevicesPolled(devices);
    572   EXPECT_EQ(0, adapter_observer_.num_device_added());
    573   EXPECT_EQ(0, adapter_observer_.num_device_removed());
    574   EXPECT_EQ(1, adapter_observer_.num_device_changed());
    575 
    576   // Remove a service
    577   laptop_state->service_record_states.clear();
    578   adapter_observer_.ResetCounters();
    579   adapter_win_->DevicesPolled(devices);
    580   EXPECT_EQ(0, adapter_observer_.num_device_added());
    581   EXPECT_EQ(0, adapter_observer_.num_device_removed());
    582   EXPECT_EQ(1, adapter_observer_.num_device_changed());
    583 }
    584 
    585 }  // namespace device
    586