OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 /** | 5 /** |
6 * @fileoverview Tests for chrome://bluetooth-internals | 6 * @fileoverview Tests for chrome://bluetooth-internals |
7 */ | 7 */ |
8 | 8 |
9 /** @const {string} Path to source root. */ | 9 /** @const {string} Path to source root. */ |
10 var ROOT_PATH = '../../../../'; | 10 var ROOT_PATH = '../../../../'; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 setTestAdapter: function(adapterInfo) { | 137 setTestAdapter: function(adapterInfo) { |
138 this.adapterInfo_ = adapterInfo; | 138 this.adapterInfo_ = adapterInfo; |
139 }, | 139 }, |
140 | 140 |
141 setTestDevices: function(devices) { | 141 setTestDevices: function(devices) { |
142 this.devices_ = devices; | 142 this.devices_ = devices; |
143 } | 143 } |
144 }; | 144 }; |
145 | 145 |
146 frameInterfaces.addInterfaceOverrideForTesting( | 146 frameInterfaces.addInterfaceOverrideForTesting( |
147 adapter.AdapterFactory.name, | 147 adapter.AdapterFactory.name, function(handle) { |
148 function(handle) { | 148 var stub = connection.bindHandleToStub( |
149 var stub = connection.bindHandleToStub( | 149 handle, adapter.AdapterFactory); |
150 handle, adapter.AdapterFactory); | |
151 this.adapterFactory = new TestAdapterFactoryProxy(); | |
152 bindings.StubBindings(stub).delegate = this.adapterFactory; | |
153 | 150 |
154 this.setupResolver.resolve(); | 151 this.adapterFactory = new TestAdapterFactoryProxy(); |
155 }.bind(this)); | 152 |
| 153 this.adapterFactory.adapter.proxy.setTestDevices([ |
| 154 this.fakeDeviceInfo1(), |
| 155 this.fakeDeviceInfo2(), |
| 156 ]); |
| 157 this.adapterFactory.adapter.proxy.setTestAdapter( |
| 158 this.fakeAdapterInfo()); |
| 159 |
| 160 bindings.StubBindings(stub).delegate = this.adapterFactory; |
| 161 |
| 162 this.setupResolver.resolve(); |
| 163 }.bind(this)); |
| 164 |
156 }.bind(this)); | 165 }.bind(this)); |
157 }.bind(this); | 166 }.bind(this); |
158 }, | 167 }, |
| 168 |
| 169 /** |
| 170 * Returns a copy of fake adapter info object. |
| 171 * @return {!Object} |
| 172 */ |
| 173 fakeAdapterInfo: function() { |
| 174 return { |
| 175 address: '02:1C:7E:6A:11:5A', |
| 176 discoverable: false, |
| 177 discovering: false, |
| 178 initialized: true, |
| 179 name: 'computer.example.com-0', |
| 180 powered: true, |
| 181 present: true, |
| 182 }; |
| 183 }, |
| 184 |
| 185 /** |
| 186 * Returns a copy of a fake device info object (variant 1). |
| 187 * @return {!Object} |
| 188 */ |
| 189 fakeDeviceInfo1: function() { |
| 190 return { |
| 191 address: "AA:AA:84:96:92:84", |
| 192 name: "AAA", |
| 193 name_for_display: "AAA", |
| 194 rssi: {value: -40}, |
| 195 services: [], |
| 196 }; |
| 197 }, |
| 198 |
| 199 /** |
| 200 * Returns a copy of a fake device info object (variant 2). |
| 201 * @return {!Object} |
| 202 */ |
| 203 fakeDeviceInfo2: function() { |
| 204 return { |
| 205 address: "BB:BB:84:96:92:84", |
| 206 name: "BBB", |
| 207 name_for_display: "BBB", |
| 208 rssi: null, |
| 209 services: [], |
| 210 }; |
| 211 }, |
| 212 |
| 213 /** |
| 214 * Returns a copy of fake device info object. The returned device info lack |
| 215 * rssi and services properties. |
| 216 * @return {!Object} |
| 217 */ |
| 218 fakeDeviceInfo3: function() { |
| 219 return { |
| 220 address: "CC:CC:84:96:92:84", |
| 221 name: "CCC", |
| 222 name_for_display: "CCC", |
| 223 }; |
| 224 }, |
159 }; | 225 }; |
160 | 226 |
161 // Times out. See https://crbug.com/667970. | 227 TEST_F('BluetoothInternalsTest', 'Startup_BluetoothInternals', function() { |
162 TEST_F('BluetoothInternalsTest', 'DISABLED_Startup_BluetoothInternals', | 228 var adapterFactory = null; |
163 function() { | 229 var deviceTable = null; |
164 var fakeAdapterInfo = { | |
165 address: '02:1C:7E:6A:11:5A', | |
166 discoverable: false, | |
167 discovering: false, | |
168 initialized: true, | |
169 name: 'computer.example.com-0', | |
170 powered: true, | |
171 present: true, | |
172 }; | |
173 | 230 |
174 var fakeDeviceInfo1 = { | 231 var fakeDeviceInfo1 = this.fakeDeviceInfo1; |
175 address: "AA:AA:84:96:92:84", | 232 var fakeDeviceInfo2 = this.fakeDeviceInfo2; |
176 name: "AAA", | 233 var fakeDeviceInfo3 = this.fakeDeviceInfo3; |
177 name_for_display: "AAA", | |
178 rssi: {value: -40}, | |
179 services: [] | |
180 }; | |
181 | |
182 var fakeDeviceInfo2 = { | |
183 address: "BB:BB:84:96:92:84", | |
184 name: "BBB", | |
185 name_for_display: "BBB", | |
186 rssi: null, | |
187 services: [] | |
188 }; | |
189 | |
190 var fakeDeviceInfo3 = { | |
191 address: "CC:CC:84:96:92:84", | |
192 name: "CCC", | |
193 name_for_display: "CCC", | |
194 }; | |
195 | |
196 var adapterFactory = null; | |
197 | 234 |
198 // Before tests are run, make sure setup completes. | 235 // Before tests are run, make sure setup completes. |
199 var setupPromise = this.setupResolver.promise.then(function() { | 236 var setupPromise = this.setupResolver.promise.then(function() { |
200 adapterFactory = this.adapterFactory; | 237 adapterFactory = this.adapterFactory; |
201 }.bind(this)); | 238 }.bind(this)); |
202 | 239 |
203 | 240 |
204 suite('BluetoothInternalsUITest', function() { | 241 suite('BluetoothInternalsUITest', function() { |
205 var EXPECTED_DEVICES = 2; | 242 var EXPECTED_DEVICES = 2; |
206 | 243 |
207 suiteSetup(function() { | 244 suiteSetup(function() { |
208 return setupPromise.then(function() { | 245 return setupPromise.then(function() { |
209 adapterFactory.adapter.proxy.setTestDevices([ | |
210 fakeDeviceInfo1, | |
211 fakeDeviceInfo2 | |
212 ]); | |
213 adapterFactory.adapter.proxy.setTestAdapter(fakeAdapterInfo); | |
214 | |
215 return Promise.all([ | 246 return Promise.all([ |
216 adapterFactory.whenCalled('getAdapter'), | 247 adapterFactory.whenCalled('getAdapter'), |
217 adapterFactory.adapter.proxy.whenCalled('getInfo'), | 248 adapterFactory.adapter.proxy.whenCalled('getInfo'), |
218 adapterFactory.adapter.proxy.whenCalled('getDevices'), | 249 adapterFactory.adapter.proxy.whenCalled('getDevices'), |
219 adapterFactory.adapter.proxy.whenCalled('setClient'), | 250 adapterFactory.adapter.proxy.whenCalled('setClient'), |
220 ]); | 251 ]); |
221 }); | 252 }); |
222 }); | 253 }); |
223 | 254 |
224 setup(function() { | 255 setup(function() { |
| 256 deviceTable = document.querySelector('#devices table'); |
225 devices.splice(0, devices.length); | 257 devices.splice(0, devices.length); |
226 adapterBroker.adapterClient_.deviceAdded(fakeDeviceInfo1); | 258 adapterBroker.adapterClient_.deviceAdded(fakeDeviceInfo1()); |
227 adapterBroker.adapterClient_.deviceAdded(fakeDeviceInfo2); | 259 adapterBroker.adapterClient_.deviceAdded(fakeDeviceInfo2()); |
228 }); | 260 }); |
229 | 261 |
230 teardown(function() { | 262 teardown(function() { |
231 adapterFactory.reset(); | 263 adapterFactory.reset(); |
232 }); | 264 }); |
233 | 265 |
234 /** | 266 /** |
235 * Updates device info and verifies the contents of the device table. | 267 * Updates device info and verifies the contents of the device table. |
236 * @param {!device_collection.DeviceInfo} deviceInfo | 268 * @param {!device_collection.DeviceInfo} deviceInfo |
237 */ | 269 */ |
238 function changeDevice(deviceInfo) { | 270 function changeDevice(deviceInfo) { |
239 var deviceRow = document.querySelector('#' + escapeDeviceAddress( | 271 var deviceRow = deviceTable.querySelector('#' + escapeDeviceAddress( |
240 deviceInfo.address)); | 272 deviceInfo.address)); |
241 var nameForDisplayColumn = deviceRow.children[0]; | 273 var nameForDisplayColumn = deviceRow.children[0]; |
242 var addressColumn = deviceRow.children[1]; | 274 var addressColumn = deviceRow.children[1]; |
243 var rssiColumn = deviceRow.children[2]; | 275 var rssiColumn = deviceRow.children[2]; |
244 var servicesColumn = deviceRow.children[3]; | 276 var servicesColumn = deviceRow.children[3]; |
245 | 277 |
246 expectTrue(!!nameForDisplayColumn); | 278 expectTrue(!!nameForDisplayColumn); |
247 expectTrue(!!addressColumn); | 279 expectTrue(!!addressColumn); |
248 expectTrue(!!rssiColumn); | 280 expectTrue(!!rssiColumn); |
249 expectTrue(!!servicesColumn); | 281 expectTrue(!!servicesColumn); |
(...skipping 23 matching lines...) Expand all Loading... |
273 function escapeDeviceAddress(address) { | 305 function escapeDeviceAddress(address) { |
274 return address.replace(/:/g, '\\:'); | 306 return address.replace(/:/g, '\\:'); |
275 } | 307 } |
276 | 308 |
277 /** | 309 /** |
278 * Expects whether device with |address| is removed. | 310 * Expects whether device with |address| is removed. |
279 * @param {string} address | 311 * @param {string} address |
280 * @param {boolean} expectRemoved | 312 * @param {boolean} expectRemoved |
281 */ | 313 */ |
282 function expectDeviceRemoved(address, expectRemoved) { | 314 function expectDeviceRemoved(address, expectRemoved) { |
283 var removedRow = document.querySelector( | 315 var removedRow = deviceTable.querySelector( |
284 '#' + escapeDeviceAddress(address)); | 316 '#' + escapeDeviceAddress(address)); |
285 | 317 |
286 expectEquals(expectRemoved, removedRow.classList.contains('removed')); | 318 expectEquals(expectRemoved, removedRow.classList.contains('removed')); |
287 } | 319 } |
288 | 320 |
289 /** | 321 /** |
290 * Tests whether a device is added successfully and not duplicated. | 322 * Tests whether a device is added successfully and not duplicated. |
291 */ | 323 */ |
292 test('DeviceAdded', function() { | 324 test('DeviceAdded', function() { |
293 var devices = document.querySelectorAll('#device-table tbody tr'); | 325 var devices = deviceTable.querySelectorAll('tbody tr'); |
294 expectEquals(EXPECTED_DEVICES, devices.length); | 326 expectEquals(EXPECTED_DEVICES, devices.length); |
295 | 327 |
296 // Copy device info because device collection will not copy this object. | 328 // Copy device info because device collection will not copy this object. |
297 var infoCopy = Object.assign({}, fakeDeviceInfo3); | 329 var infoCopy = fakeDeviceInfo3(); |
298 adapterBroker.adapterClient_.deviceAdded(infoCopy); | 330 adapterBroker.adapterClient_.deviceAdded(infoCopy); |
299 | 331 |
300 // Same device shouldn't appear twice. | 332 // Same device shouldn't appear twice. |
301 adapterBroker.adapterClient_.deviceAdded(infoCopy); | 333 adapterBroker.adapterClient_.deviceAdded(infoCopy); |
302 | 334 |
303 devices = document.querySelectorAll('#device-table tbody tr'); | 335 devices = deviceTable.querySelectorAll('tbody tr'); |
304 expectEquals(EXPECTED_DEVICES + 1, devices.length); | 336 expectEquals(EXPECTED_DEVICES + 1, devices.length); |
305 }); | 337 }); |
306 | 338 |
307 /** | 339 /** |
308 * Tests whether a device is marked properly as removed. | 340 * Tests whether a device is marked properly as removed. |
309 */ | 341 */ |
310 test('DeviceSetToRemoved', function() { | 342 test('DeviceSetToRemoved', function() { |
311 var devices = document.querySelectorAll('#device-table tbody tr'); | 343 var devices = deviceTable.querySelectorAll('tbody tr'); |
312 expectEquals(EXPECTED_DEVICES, devices.length); | 344 expectEquals(EXPECTED_DEVICES, devices.length); |
313 adapterBroker.adapterClient_.deviceRemoved(fakeDeviceInfo2); | 345 |
| 346 var fakeDevice = fakeDeviceInfo2(); |
| 347 adapterBroker.adapterClient_.deviceRemoved(fakeDevice); |
314 | 348 |
315 // The number of rows shouldn't change. | 349 // The number of rows shouldn't change. |
316 devices = document.querySelectorAll('#device-table tbody tr'); | 350 devices = deviceTable.querySelectorAll('tbody tr'); |
317 expectEquals(EXPECTED_DEVICES, devices.length); | 351 expectEquals(EXPECTED_DEVICES, devices.length); |
318 | 352 |
319 expectDeviceRemoved(fakeDeviceInfo2.address, true); | 353 expectDeviceRemoved(fakeDevice.address, true); |
320 }); | 354 }); |
321 | 355 |
322 /** | 356 /** |
323 * Tests whether a changed device updates the device table properly. | 357 * Tests whether a changed device updates the device table properly. |
324 */ | 358 */ |
325 test('DeviceChanged', function() { | 359 test('DeviceChanged', function() { |
326 var devices = document.querySelectorAll('#device-table tbody tr'); | 360 var devices = deviceTable.querySelectorAll('tbody tr'); |
327 expectEquals(EXPECTED_DEVICES, devices.length); | 361 expectEquals(EXPECTED_DEVICES, devices.length); |
328 | 362 |
329 // Copy device info because device collection will not copy this object. | 363 // Copy device info because device collection will not copy this object. |
330 var newDeviceInfo = Object.assign({}, fakeDeviceInfo1); | 364 var newDeviceInfo = fakeDeviceInfo1(); |
331 newDeviceInfo.name_for_display = 'DDDD'; | 365 newDeviceInfo.name_for_display = 'DDDD'; |
332 newDeviceInfo.rssi = { value: -20 }; | 366 newDeviceInfo.rssi = { value: -20 }; |
333 newDeviceInfo.services = ['service1', 'service2', 'service3']; | 367 newDeviceInfo.services = ['service1', 'service2', 'service3']; |
334 | 368 |
335 changeDevice(newDeviceInfo); | 369 changeDevice(newDeviceInfo); |
336 }); | 370 }); |
337 | 371 |
338 /** | 372 /** |
339 * Tests the entire device cycle, added -> updated -> removed -> re-added. | 373 * Tests the entire device cycle, added -> updated -> removed -> re-added. |
340 */ | 374 */ |
341 test('DeviceUpdateCycle', function() { | 375 test('DeviceUpdateCycle', function() { |
342 var devices = document.querySelectorAll('#device-table tbody tr'); | 376 var devices = deviceTable.querySelectorAll('tbody tr'); |
343 expectEquals(EXPECTED_DEVICES, devices.length); | 377 expectEquals(EXPECTED_DEVICES, devices.length); |
344 | 378 |
345 // Copy device info because device collection will not copy this object. | 379 // Copy device info because device collection will not copy this object. |
346 var originalDeviceInfo = Object.assign({}, fakeDeviceInfo3); | 380 var originalDeviceInfo = fakeDeviceInfo3(); |
347 adapterBroker.adapterClient_.deviceAdded(originalDeviceInfo); | 381 adapterBroker.adapterClient_.deviceAdded(originalDeviceInfo); |
348 | 382 |
349 var newDeviceInfo = Object.assign({}, fakeDeviceInfo3); | 383 var newDeviceInfo = fakeDeviceInfo3(); |
350 newDeviceInfo.name_for_display = 'DDDD'; | 384 newDeviceInfo.name_for_display = 'DDDD'; |
351 newDeviceInfo.rssi = { value: -20 }; | 385 newDeviceInfo.rssi = { value: -20 }; |
352 newDeviceInfo.services = ['service1', 'service2', 'service3']; | 386 newDeviceInfo.services = ['service1', 'service2', 'service3']; |
353 | 387 |
354 changeDevice(newDeviceInfo); | 388 changeDevice(newDeviceInfo); |
355 changeDevice(originalDeviceInfo); | 389 changeDevice(originalDeviceInfo); |
356 | 390 |
357 adapterBroker.adapterClient_.deviceRemoved(originalDeviceInfo); | 391 adapterBroker.adapterClient_.deviceRemoved(originalDeviceInfo); |
358 expectDeviceRemoved(originalDeviceInfo.address, true); | 392 expectDeviceRemoved(originalDeviceInfo.address, true); |
359 | 393 |
360 adapterBroker.adapterClient_.deviceAdded(originalDeviceInfo); | 394 adapterBroker.adapterClient_.deviceAdded(originalDeviceInfo); |
361 expectDeviceRemoved(originalDeviceInfo.address, false); | 395 expectDeviceRemoved(originalDeviceInfo.address, false); |
362 }); | 396 }); |
363 | 397 |
364 test('DeviceAddedRssiCheck', function() { | 398 test('DeviceAddedRssiCheck', function() { |
365 var devices = document.querySelectorAll('#device-table tbody tr'); | 399 var devices = deviceTable.querySelectorAll('tbody tr'); |
366 expectEquals(EXPECTED_DEVICES, devices.length); | 400 expectEquals(EXPECTED_DEVICES, devices.length); |
367 | 401 |
368 // Copy device info because device collection will not copy this object. | 402 // Copy device info because device collection will not copy this object. |
369 var newDeviceInfo = Object.assign({}, fakeDeviceInfo3); | 403 var newDeviceInfo = fakeDeviceInfo3(); |
370 adapterBroker.adapterClient_.deviceAdded(newDeviceInfo); | 404 adapterBroker.adapterClient_.deviceAdded(newDeviceInfo); |
371 | 405 |
372 var deviceRow = document.querySelector('#' + escapeDeviceAddress( | 406 var deviceRow = deviceTable.querySelector('#' + escapeDeviceAddress( |
373 newDeviceInfo.address)); | 407 newDeviceInfo.address)); |
374 var rssiColumn = deviceRow.children[2]; | 408 var rssiColumn = deviceRow.children[2]; |
375 expectEquals('Unknown', rssiColumn.textContent); | 409 expectEquals('Unknown', rssiColumn.textContent); |
376 | 410 |
377 var newDeviceInfo1 = Object.assign({}, fakeDeviceInfo3); | 411 var newDeviceInfo1 = fakeDeviceInfo3(); |
378 newDeviceInfo1.rssi = {value: -42}; | 412 newDeviceInfo1.rssi = {value: -42}; |
379 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo1); | 413 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo1); |
380 expectEquals('-42', rssiColumn.textContent); | 414 expectEquals('-42', rssiColumn.textContent); |
381 | 415 |
382 // Device table should keep last valid rssi value. | 416 // Device table should keep last valid rssi value. |
383 var newDeviceInfo2 = Object.assign({}, fakeDeviceInfo3); | 417 var newDeviceInfo2 = fakeDeviceInfo3(); |
384 newDeviceInfo2.rssi = null; | 418 newDeviceInfo2.rssi = null; |
385 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo2); | 419 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo2); |
386 expectEquals('-42', rssiColumn.textContent); | 420 expectEquals('-42', rssiColumn.textContent); |
387 | 421 |
388 var newDeviceInfo3 = Object.assign({}, fakeDeviceInfo3); | 422 var newDeviceInfo3 = fakeDeviceInfo3(); |
389 newDeviceInfo3.rssi = {value: -17}; | 423 newDeviceInfo3.rssi = {value: -17}; |
390 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo3); | 424 adapterBroker.adapterClient_.deviceChanged(newDeviceInfo3); |
391 expectEquals('-17', rssiColumn.textContent); | 425 expectEquals('-17', rssiColumn.textContent); |
392 }); | 426 }); |
393 }); | 427 }); |
394 | 428 |
395 // Run all registered tests. | 429 // Run all registered tests. |
396 mocha.run(); | 430 mocha.run(); |
397 }); | 431 }); |
OLD | NEW |