OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #import <IOBluetooth/IOBluetoothUtilities.h> |
| 6 #import <IOBluetooth/objc/IOBluetoothDevice.h> |
| 7 |
5 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
6 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
| 10 #include "device/bluetooth/bluetooth_adapter.h" |
7 #include "device/bluetooth/bluetooth_adapter_mac.h" | 11 #include "device/bluetooth/bluetooth_adapter_mac.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
9 | 13 |
| 14 @interface TestIOBluetoothDevice : IOBluetoothDevice { |
| 15 @private |
| 16 NSString* name_; |
| 17 NSString* address_; |
| 18 BOOL paired_; |
| 19 } |
| 20 |
| 21 + (TestIOBluetoothDevice*)deviceWithName:(NSString*)name |
| 22 address:(NSString*)address |
| 23 paired:(BOOL)paired; |
| 24 - (id)initWithName:(NSString*)name |
| 25 address:(NSString*)address |
| 26 paired:(BOOL)paired; |
| 27 |
| 28 @property (copy) NSString* name; |
| 29 @property (nonatomic, copy) NSString* address; |
| 30 @property (nonatomic, assign, getter=isPaired) BOOL paired; |
| 31 |
| 32 @end |
| 33 |
| 34 @implementation TestIOBluetoothDevice |
| 35 |
| 36 @synthesize name = name_; |
| 37 @synthesize address = address_; |
| 38 @synthesize paired = paired_; |
| 39 |
| 40 + (TestIOBluetoothDevice*)deviceWithName:(NSString*)name |
| 41 address:(NSString*)address |
| 42 paired:(BOOL)paired { |
| 43 return [[[TestIOBluetoothDevice alloc] initWithName:name |
| 44 address:address |
| 45 paired:paired] autorelease]; |
| 46 } |
| 47 |
| 48 - (id)initWithName:(NSString*)name |
| 49 address:(NSString*)address |
| 50 paired:(BOOL)paired { |
| 51 if (self = [super init]) { |
| 52 [self setName:name]; |
| 53 [self setAddress:address]; |
| 54 [self setPaired:paired]; |
| 55 } |
| 56 |
| 57 return self; |
| 58 } |
| 59 |
| 60 - (void)dealloc { |
| 61 [self setName:nil]; |
| 62 [self setAddress:nil]; |
| 63 [super dealloc]; |
| 64 } |
| 65 |
| 66 - (NSString*)addressString { |
| 67 return [self address]; |
| 68 } |
| 69 |
| 70 @end |
| 71 |
| 72 namespace { |
| 73 |
| 74 class AdapterObserver : public device::BluetoothAdapter::Observer { |
| 75 public: |
| 76 AdapterObserver() { |
| 77 Clear(); |
| 78 } |
| 79 |
| 80 void Clear() { |
| 81 num_device_added_ = 0; |
| 82 num_device_changed_ = 0; |
| 83 num_device_removed_ = 0; |
| 84 } |
| 85 |
| 86 virtual void DeviceAdded( |
| 87 device::BluetoothAdapter* adapter, |
| 88 device::BluetoothDevice* device) OVERRIDE { |
| 89 num_device_added_++; |
| 90 } |
| 91 |
| 92 virtual void DeviceChanged( |
| 93 device::BluetoothAdapter* adapter, |
| 94 device::BluetoothDevice* device) OVERRIDE { |
| 95 num_device_changed_++; |
| 96 } |
| 97 |
| 98 virtual void DeviceRemoved( |
| 99 device::BluetoothAdapter* adapter, |
| 100 device::BluetoothDevice* device) OVERRIDE { |
| 101 num_device_removed_++; |
| 102 } |
| 103 |
| 104 int num_device_added() const { |
| 105 return num_device_added_; |
| 106 } |
| 107 |
| 108 int num_device_changed() const { |
| 109 return num_device_changed_; |
| 110 } |
| 111 |
| 112 int num_device_removed() const { |
| 113 return num_device_removed_; |
| 114 } |
| 115 |
| 116 private: |
| 117 int num_device_added_; |
| 118 int num_device_changed_; |
| 119 int num_device_removed_; |
| 120 }; |
| 121 |
| 122 } // namespace |
| 123 |
10 namespace device { | 124 namespace device { |
11 | 125 |
12 class BluetoothAdapterMacTest : public testing::Test { | 126 class BluetoothAdapterMacTest : public testing::Test { |
13 public: | 127 public: |
14 BluetoothAdapterMacTest() | 128 BluetoothAdapterMacTest() |
15 : ui_task_runner_(new base::TestSimpleTaskRunner()), | 129 : ui_task_runner_(new base::TestSimpleTaskRunner()), |
16 adapter_(new BluetoothAdapterMac()), | 130 adapter_(new BluetoothAdapterMac()), |
17 adapter_mac_(static_cast<BluetoothAdapterMac*>(adapter_.get())) { | 131 adapter_mac_(static_cast<BluetoothAdapterMac*>(adapter_.get())) { |
18 adapter_mac_->TrackTestAdapter(ui_task_runner_); | 132 adapter_mac_->TrackTestAdapter(ui_task_runner_); |
| 133 adapter_mac_->RemoveUnpairedDevices([NSArray array]); |
| 134 adapter_observer_.Clear(); |
19 } | 135 } |
20 | 136 |
21 virtual void SetUp() OVERRIDE { | 137 virtual void SetUp() OVERRIDE { |
| 138 adapter_mac_->AddObserver(&adapter_observer_); |
22 } | 139 } |
23 | 140 |
24 virtual void TearDown() OVERRIDE { | 141 virtual void TearDown() OVERRIDE { |
| 142 adapter_mac_->RemoveObserver(&adapter_observer_); |
| 143 } |
| 144 |
| 145 void UpdateDevices(NSArray* devices) { |
| 146 adapter_mac_->UpdateDevices(devices); |
| 147 } |
| 148 |
| 149 void RemoveUnpairedDevices(NSArray* devices) { |
| 150 adapter_mac_->RemoveUnpairedDevices(devices); |
25 } | 151 } |
26 | 152 |
27 protected: | 153 protected: |
28 scoped_refptr<base::TestSimpleTaskRunner> ui_task_runner_; | 154 scoped_refptr<base::TestSimpleTaskRunner> ui_task_runner_; |
29 scoped_refptr<BluetoothAdapter> adapter_; | 155 scoped_refptr<BluetoothAdapter> adapter_; |
30 BluetoothAdapterMac* adapter_mac_; | 156 BluetoothAdapterMac* adapter_mac_; |
| 157 AdapterObserver adapter_observer_; |
31 }; | 158 }; |
32 | 159 |
33 TEST_F(BluetoothAdapterMacTest, Poll) { | 160 TEST_F(BluetoothAdapterMacTest, Poll) { |
34 EXPECT_FALSE(ui_task_runner_->GetPendingTasks().empty()); | 161 EXPECT_FALSE(ui_task_runner_->GetPendingTasks().empty()); |
35 } | 162 } |
36 | 163 |
| 164 TEST_F(BluetoothAdapterMacTest, UpdateDevices) { |
| 165 TestIOBluetoothDevice* android_device = |
| 166 [TestIOBluetoothDevice deviceWithName:@"android" |
| 167 address:@"11:22:33:44:55:66" |
| 168 paired:false]; |
| 169 TestIOBluetoothDevice* laptop_device = |
| 170 [TestIOBluetoothDevice deviceWithName:@"laptop" |
| 171 address:@"77:88:99:aa:bb:cc" |
| 172 paired:false]; |
| 173 TestIOBluetoothDevice* iphone_device = |
| 174 [TestIOBluetoothDevice deviceWithName:@"iphone" |
| 175 address:@"dd:ee:ff:11:22:33" |
| 176 paired:false]; |
| 177 NSMutableArray* devices = [NSMutableArray arrayWithCapacity:3]; |
| 178 [devices addObject:android_device]; |
| 179 [devices addObject:laptop_device]; |
| 180 [devices addObject:iphone_device]; |
| 181 UpdateDevices(devices); |
| 182 EXPECT_EQ(3, adapter_observer_.num_device_added()); |
| 183 adapter_observer_.Clear(); |
| 184 |
| 185 UpdateDevices(devices); |
| 186 EXPECT_EQ(0, adapter_observer_.num_device_added()); |
| 187 EXPECT_EQ(0, adapter_observer_.num_device_changed()); |
| 188 |
| 189 [iphone_device setName:@"apple phone"]; |
| 190 UpdateDevices(devices); |
| 191 EXPECT_EQ(0, adapter_observer_.num_device_added()); |
| 192 EXPECT_EQ(1, adapter_observer_.num_device_changed()); |
| 193 adapter_observer_.Clear(); |
| 194 } |
| 195 |
| 196 TEST_F(BluetoothAdapterMacTest, RemoveUnpairedDevices) { |
| 197 TestIOBluetoothDevice* android_device = |
| 198 [TestIOBluetoothDevice deviceWithName:@"android" |
| 199 address:@"11:22:33:44:55:66" |
| 200 paired:true]; |
| 201 TestIOBluetoothDevice* laptop_device = |
| 202 [TestIOBluetoothDevice deviceWithName:@"laptop" |
| 203 address:@"77:88:99:aa:bb:cc" |
| 204 paired:false]; |
| 205 NSMutableArray* devices = [NSMutableArray arrayWithCapacity:2]; |
| 206 [devices addObject:android_device]; |
| 207 [devices addObject:laptop_device]; |
| 208 UpdateDevices(devices); |
| 209 adapter_observer_.Clear(); |
| 210 |
| 211 RemoveUnpairedDevices([NSArray arrayWithObject:android_device]); |
| 212 EXPECT_EQ(0, adapter_observer_.num_device_removed()); |
| 213 |
| 214 RemoveUnpairedDevices([NSArray array]); |
| 215 EXPECT_EQ(1, adapter_observer_.num_device_removed()); |
| 216 |
| 217 } |
| 218 |
37 } // namespace device | 219 } // namespace device |
OLD | NEW |