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