| 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 |