diff options
Diffstat (limited to 'testing/web-platform/tests/bluetooth/getDevices/granted-devices-with-services.https.window.js')
-rw-r--r-- | testing/web-platform/tests/bluetooth/getDevices/granted-devices-with-services.https.window.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/testing/web-platform/tests/bluetooth/getDevices/granted-devices-with-services.https.window.js b/testing/web-platform/tests/bluetooth/getDevices/granted-devices-with-services.https.window.js new file mode 100644 index 0000000000..3228543617 --- /dev/null +++ b/testing/web-platform/tests/bluetooth/getDevices/granted-devices-with-services.https.window.js @@ -0,0 +1,72 @@ +// 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); |