| // META: script=/resources/testdriver.js |
| // META: script=/resources/testdriver-vendor.js |
| // META: script=/bluetooth/resources/bluetooth-test.js |
| // META: script=/bluetooth/resources/bluetooth-fake-devices.js |
| 'use strict'; |
| const test_desc = 'getDevices() resolves with permitted devices that can be ' + |
| 'GATT connected to.'; |
| |
| bluetooth_test(async () => { |
| // Set up two connectable Bluetooth devices with their services discovered. |
| // One device is a Health Thermometer device with the 'health_thermometer' |
| // service while the other is a Heart Rate device with the 'heart_rate' |
| // service. Both devices contain the 'generic_access' service. |
| let fake_peripherals = await setUpHealthThermometerAndHeartRateDevices(); |
| for (let fake_peripheral of fake_peripherals) { |
| await fake_peripheral.setNextGATTConnectionResponse({code: HCI_SUCCESS}); |
| await fake_peripheral.addFakeService({uuid: 'generic_access'}); |
| if (fake_peripheral.address === '09:09:09:09:09:09') |
| await fake_peripheral.addFakeService({uuid: 'health_thermometer'}); |
| else |
| await fake_peripheral.addFakeService({uuid: 'heart_rate'}); |
| await fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}); |
| } |
| |
| // Request the Health Thermometer device with access to its 'generic_access' |
| // service. |
| await requestDeviceWithTrustedClick( |
| {filters: [{name: 'Health Thermometer', services: ['generic_access']}]}); |
| let devices = await navigator.bluetooth.getDevices(); |
| assert_equals( |
| devices.length, 1, |
| `getDevices() should return the 'Health Thermometer' device.`); |
| |
| // Only the 'generic_access' service can be accessed. |
| try { |
| await devices[0].gatt.connect(); |
| await devices[0].gatt.getPrimaryService('generic_access'); |
| assert_promise_rejects_with_message( |
| devices[0].gatt.getPrimaryService('health_thermometer'), |
| {name: 'SecurityError'}); |
| } catch (err) { |
| assert_unreached(`${err.name}: ${err.message}`); |
| } |
| |
| // Request the Heart Rate device with access to both of its services. |
| await requestDeviceWithTrustedClick({ |
| filters: [{name: 'Heart Rate', services: ['generic_access', 'heart_rate']}] |
| }); |
| devices = await navigator.bluetooth.getDevices(); |
| assert_equals( |
| devices.length, 2, |
| `getDevices() should return the 'Health Thermometer' and 'Health ` + |
| `Monitor' devices`); |
| |
| // All of Heart Rate device's services can be accessed, while only the |
| // 'generic_access' service can be accessed on Health Thermometer. |
| try { |
| for (let device of devices) { |
| await device.gatt.connect(); |
| await device.gatt.getPrimaryService('generic_access'); |
| if (device.name === 'Heart Rate') { |
| await device.gatt.getPrimaryService('heart_rate'); |
| } else { |
| assert_promise_rejects_with_message( |
| devices[0].gatt.getPrimaryService('health_thermometer'), |
| {name: 'SecurityError'}); |
| } |
| } |
| } catch (err) { |
| assert_unreached(`${err.name}: ${err.message}`); |
| } |
| }, test_desc); |