Bug 1631973 [wpt PR 23157] - bluetooth: Split bluetooth-helpers.js, a=testonly

Automatic update from web-platform-tests
bluetooth: Split bluetooth-helpers.js

This change splits the bluetooth-helpers.js files in two. The new
bluetooth-test.js file contains methods for setting up the web tests and
for asserting conditions. The bluetooth-helpers.js file now contains
helper methods that set up fake Bluetooth devices for use in the Web
Bluetooth tests.

I added JsDoc style comments to the helper methods to make it clear
what kinds of objects are expected as parameters and what the methods
will return. I also reordered the bluetooth-helpers.js methods so that
they are defined before they are used.

Bug: 1070816
Change-Id: Ib5215555be2b24b11f8dea9098d83ad69719a284
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2149909
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Reviewed-by: James Hollyer <jameshollyer@google.com>
Commit-Queue: Ovidio de Jesús Ruiz-Henríquez <odejesush@chromium.org>
Cr-Commit-Position: refs/heads/master@{#762594}

--

wpt-commits: 6f8f0b30a4af91762427b4ff528ed344d5636c6d
wpt-pr: 23157
This commit is contained in:
Ovidio Henriquez 2020-04-28 11:44:08 +00:00
Родитель 0645c77ff9
Коммит 2d61799f08
171 изменённых файлов: 1717 добавлений и 1197 удалений

Просмотреть файл

@ -10,10 +10,11 @@ Testing] test API which must be provided by browsers under test.
TODO([#485]): Update the links to [FakeBluetooth][Web Bluetooth Testing] to
point to the [Testing Web Bluetooth specification].
In this test suite `resources/bluetooth-helpers.js` detects and triggers
the API to be loaded as needed. This file also contains several helper methods
that are used in the tests to set up fake Bluetooth devices and to assert that
specific Bluetooth events happened.
In this test suite `resources/bluetooth-test.js` detects and triggers
the API to be loaded as needed. This file also contains test helper methods,
such as for asserting that Bluetooth events are fired in a specific order.
The `resources/bluetooth-fake-devices.js` contains several helper methods that set
up fake Bluetooth devices.
[Web Bluetooth specification]: https://WebBluetoothCG.github.io/web-bluetooth
[Web Bluetooth Testing]:
@ -115,4 +116,4 @@ Bug tracker: [Blink>Bluetooth]
* [Web Bluetooth Service README]
[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2
[Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false if the system does ' +
'not have an adapter.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true after adapter is ' +
'inserted into a system with a platform that supports Bluetooth LE.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
'radio is powered off, but the platform that supports Bluetooth LE.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with true if the Bluetooth ' +
'radio is powered on and the platform supports Bluetooth LE.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() is not affected by the powered state of ' +
'the adapter.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false after the powered ' +
'on adapter is removed.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getAvailability() resolves with false if called from a ' +
'unique origin';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'HeartRate device properties';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getDescriptor should return the same object.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
// TODO(https://crbug.com/672127) Use this test case to test the rest of
// characteristic functions.

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls to getDescriptors should return the same object.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
// TODO(https://crbug.com/672127) Use this test case to test the rest of
// characteristic functions.

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
// TODO(https://crbug.com/672127) Use this test case to test the rest of
// characteristic functions.

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic is removed. Reject with InvalidStateError.';
const expected = new DOMException(

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service is removed. Reject with InvalidStateError.';
const expected =

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Add multiple event listeners then readValue().';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
const expected = new DOMException(

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Reading a characteristic should fire an event.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A read request succeeds and returns the characteristic\'s ' +
'value.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
const test_desc = 'Succesful read should update characteristic.value';
const EXPECTED_VALUE = [0, 1, 2];

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
const expected =

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Same parent service returned from multiple characteristics.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = '[SameObject] test for BluetoothRemoteGATTCharacteristic ' +
'service.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'writeValue() fails when passed a detached buffer';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';
const expected = new DOMException(

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';
const expected =

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A regular write request to a writable characteristic ' +
'should succeed.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = `A read request succeeds and returns the descriptor's value.`;

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'writeValue() fails when passed a detached buffer';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Service gets removed. Reject with InvalidStateError.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device disconnecting while connected should fire the ' +
'gattserverdisconnected event.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device disconnecting after the BluetoothDevice object ' +
'has been GC\'ed should not access freed memory.';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'If a site disconnects from a device while the platform is ' +
'disconnecting that device, only one gattserverdisconnected event should ' +

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'A device that reconnects during the ' +
'gattserverdisconnected event should still receive ' +

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.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.';
@ -68,4 +69,4 @@ bluetooth_test(async () => {
} catch (err) {
assert_unreached(`${err.name}: ${err.message}`);
}
}, test_desc);
}, test_desc);

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'getDevices() resolves with empty array if no device ' +
'permissions have been granted.';
@ -11,4 +12,4 @@ bluetooth_test(async () => {
assert_equals(
0, devices.length, 'getDevices() should resolve with an empty array');
}, test_desc);
}, test_desc);

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
'use strict';
const test_desc = 'multiple calls to getDevices() resolves with the same' +
'BluetoothDevice objects for each granted Bluetooth device.';
@ -19,4 +20,4 @@ bluetooth_test(async () => {
firstDevices[0], secondDevices[0],
'getDevices() should produce the same BluetoothDevice objects for a ' +
'given Bluetooth device.');
}, test_desc);
}, test_desc);

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc_idl = 'BluetoothDevice IDL test.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Device with empty name and no UUIDs nearby. Should be ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
const test_desc =
'A device with name and no UUIDs nearby. Should be found if ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice called with acceptAllDevices: true and ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice called with acceptAllDevices: true and with ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with SecurityError if requesting a blocklisted ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Blocklisted UUID in optionalServices is removed and ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name between 29 and 248 bytes is valid.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A filter must restrict the devices in some way.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'An empty |filters| member should result in a TypeError';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice with empty namePrefix. ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Services member must contain at least one service.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'RequestDeviceOptions should have exactly one of ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Unicode string with utf8 representation longer than 248 ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name longer than 248 must reject.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Unicode string with utf8 representation longer than 248 ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name prefix longer than 248 must reject.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A unicode device name of 248 bytes is valid.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device name of 248 bytes is valid.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A unicode device namePrefix of 248 bytes is valid.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A device namePrefix of 248 bytes is valid.';

Просмотреть файл

@ -4,7 +4,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice() requires an argument.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A name containing unicode characters whose utf8 length ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'A namePrefix containing unicode characters whose utf8 ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Invalid optional service must reject the promise.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Invalid service must reject the promise.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Discover a device using alias, name, or UUID.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'requestDevice calls do not consume user gestures.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Matches a filter if all present members match.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if Bluetooth is not supported.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'An empty name device can be obtained by empty name filter.'

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Requires a user gesture.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Reject with NotFoundError if there is no BT radio present.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Concurrent requestDevice calls in iframes work.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Returned device should always be the same.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Simple filter selects matching device.';

Просмотреть файл

@ -0,0 +1,991 @@
'use strict';
/* Bluetooth Constants */
/**
* HCI Error Codes.
* Used for simulateGATT{Dis}ConnectionResponse. For a complete list of
* possible error codes see BT 4.2 Vol 2 Part D 1.3 List Of Error Codes.
*/
const HCI_SUCCESS = 0x0000;
const HCI_CONNECTION_TIMEOUT = 0x0008;
/**
* GATT Error codes.
* Used for GATT operations responses. BT 4.2 Vol 3 Part F 3.4.1.1 Error
* Response
*/
const GATT_SUCCESS = 0x0000;
const GATT_INVALID_HANDLE = 0x0001;
/* Bluetooth UUID Constants */
/* Service UUIDs */
var blocklist_test_service_uuid = '611c954a-263b-4f4a-aab6-01ddb953f985';
var request_disconnection_service_uuid = '01d7d889-7451-419f-aeb8-d65e7b9277af';
/* Characteristic UUIDs */
var blocklist_exclude_reads_characteristic_uuid =
'bad1c9a2-9a5b-4015-8b60-1579bbbf2135';
var request_disconnection_characteristic_uuid =
'01d7d88a-7451-419f-aeb8-d65e7b9277af';
/* Descriptor UUIDs */
var blocklist_test_descriptor_uuid = 'bad2ddcf-60db-45cd-bef9-fd72b153cf7c';
var blocklist_exclude_reads_descriptor_uuid =
'bad3ec61-3cc3-4954-9702-7977df514114';
/**
* Helper objects that associate Bluetooth names, aliases, and UUIDs. These are
* useful for tests that check that the same result is produces when using all
* three methods of referring to a Bluetooth UUID.
*/
var generic_access = {
alias: 0x1800,
name: 'generic_access',
uuid: '00001800-0000-1000-8000-00805f9b34fb'
};
var device_name = {
alias: 0x2a00,
name: 'gap.device_name',
uuid: '00002a00-0000-1000-8000-00805f9b34fb'
};
var reconnection_address = {
alias: 0x2a03,
name: 'gap.reconnection_address',
uuid: '00002a03-0000-1000-8000-00805f9b34fb'
};
var heart_rate = {
alias: 0x180d,
name: 'heart_rate',
uuid: '0000180d-0000-1000-8000-00805f9b34fb'
};
var health_thermometer = {
alias: 0x1809,
name: 'health_thermometer',
uuid: '00001809-0000-1000-8000-00805f9b34fb'
};
var body_sensor_location = {
alias: 0x2a38,
name: 'body_sensor_location',
uuid: '00002a38-0000-1000-8000-00805f9b34fb'
};
var glucose = {
alias: 0x1808,
name: 'glucose',
uuid: '00001808-0000-1000-8000-00805f9b34fb'
};
var battery_service = {
alias: 0x180f,
name: 'battery_service',
uuid: '0000180f-0000-1000-8000-00805f9b34fb'
};
var battery_level = {
alias: 0x2A19,
name: 'battery_level',
uuid: '00002a19-0000-1000-8000-00805f9b34fb'
};
var user_description = {
alias: 0x2901,
name: 'gatt.characteristic_user_description',
uuid: '00002901-0000-1000-8000-00805f9b34fb'
};
var client_characteristic_configuration = {
alias: 0x2902,
name: 'gatt.client_characteristic_configuration',
uuid: '00002902-0000-1000-8000-00805f9b34fb'
};
var measurement_interval = {
alias: 0x2a21,
name: 'measurement_interval',
uuid: '00002a21-0000-1000-8000-00805f9b34fb'
};
/**
* An advertisement packet object that simulates a device.
* @type {ScanResult}
*/
const health_thermometer_ad_packet = {
deviceAddress: '09:09:09:09:09:09',
rssi: -10,
scanRecord: {
name: 'Health Thermometer',
uuids: [health_thermometer.uuid],
},
};
/** Bluetooth Helpers */
/**
* Helper class to create a BluetoothCharacteristicProperties object using an
* array of strings corresponding to the property bit to set.
*/
class TestCharacteristicProperties {
/** @param {Array<string>} properties */
constructor(properties) {
this.broadcast = false;
this.read = false;
this.writeWithoutResponse = false;
this.write = false;
this.notify = false;
this.indicate = false;
this.authenticatedSignedWrites = false;
this.reliableWrite = false;
this.writableAuxiliaries = false;
properties.forEach(val => {
if (this.hasOwnProperty(val))
this[val] = true;
else
throw `Invalid member '${val}'`;
});
}
}
/**
* Produces an array of BluetoothLEScanFilterInit objects containing the list of
* services in |services| and various permutations of the other
* BluetoothLEScanFilterInit properties. This method is used to test that the
* |services| are valid so the other properties do not matter.
* @param {BluetoothServiceUUID} services
* @returns {Array<RequestDeviceOptions>} A list of options containing
* |services| and various permutations of other options.
*/
function generateRequestDeviceArgsWithServices(services = ['heart_rate']) {
return [
{filters: [{services: services}]},
{filters: [{services: services, name: 'Name'}]},
{filters: [{services: services, namePrefix: 'Pre'}]},
{filters: [{services: services, name: 'Name', namePrefix: 'Pre'}]},
{filters: [{services: services}], optionalServices: ['heart_rate']}, {
filters: [{services: services, name: 'Name'}],
optionalServices: ['heart_rate']
},
{
filters: [{services: services, namePrefix: 'Pre'}],
optionalServices: ['heart_rate']
},
{
filters: [{services: services, name: 'Name', namePrefix: 'Pre'}],
optionalServices: ['heart_rate']
}
];
}
/**
* Causes |fake_peripheral| to disconnect and returns a promise that resolves
* once `gattserverdisconnected` has been fired on |device|.
* @param {BluetoothDevice} device The device to check if the
* `gattserverdisconnected` promise was fired.
* @param {FakePeripheral} fake_peripheral The device fake that represents
* |device|.
* @returns {Promise<Array<Object>>} A promise that resolves when the device has
* successfully disconnected.
*/
function simulateGATTDisconnectionAndWait(device, fake_peripheral) {
return Promise.all([
eventPromise(device, 'gattserverdisconnected'),
fake_peripheral.simulateGATTDisconnection(),
]);
}
/**
* Returns an array containing two FakePeripherals corresponding
* to the simulated devices.
* @returns {Promise<Array<FakePeripheral>>} The fake devices are initialized as
* Health Thermometer and Heart Rate devices.
*/
function setUpHealthThermometerAndHeartRateDevices() {
return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
.then(fake_central => Promise.all([
fake_central.simulatePreconnectedPeripheral({
address: '09:09:09:09:09:09',
name: 'Health Thermometer',
knownServiceUUIDs: ['generic_access', 'health_thermometer'],
}),
fake_central.simulatePreconnectedPeripheral({
address: '08:08:08:08:08:08',
name: 'Heart Rate',
knownServiceUUIDs: ['generic_access', 'heart_rate'],
})
]));
}
/**
* Simulates a pre-connected device with |address|, |name| and
* |knownServiceUUIDs|.
* @param {string} address The device MAC address.
* @param {string} name The device name.
* @param {Array<string>} knownServiceUUIDs An array of GATT service UUIDs to
* set up the fake with.
* @returns {Promise<FakePeripheral>} The fake devices are initialized with the
* parameter values.
*/
function setUpPreconnectedDevice({
address = '00:00:00:00:00:00',
name = 'LE Device',
knownServiceUUIDs = []
}) {
return navigator.bluetooth.test.simulateCentral({state: 'powered-on'})
.then(fake_central => fake_central.simulatePreconnectedPeripheral({
address: address,
name: name,
knownServiceUUIDs: knownServiceUUIDs,
}));
}
/** Blocklisted GATT Device Helper Methods */
/**
* Returns an object containing a BluetoothDevice discovered using |options|,
* its corresponding FakePeripheral and FakeRemoteGATTServices.
* The simulated device is called 'Blocklist Device' and it has one known
* service UUID |blocklist_test_service_uuid|. The |blocklist_test_service_uuid|
* service contains two characteristics:
* - |blocklist_exclude_reads_characteristic_uuid| (read, write)
* - 'gap.peripheral_privacy_flag' (read, write)
* The 'gap.peripheral_privacy_flag' characteristic contains three descriptors:
* - |blocklist_test_descriptor_uuid|
* - |blocklist_exclude_reads_descriptor_uuid|
* - 'gatt.client_characteristic_configuration'
* These are special UUIDs that have been added to the blocklist found at
* https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
* There are also test UUIDs that have been added to the test environment which
* other implementations should add as test UUIDs as well.
* The device has been connected to and its attributes are ready to be
* discovered.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor}>} An
* object containing the BluetoothDevice object and its corresponding
* GATT fake objects.
*/
function getBlocklistDevice(options = {
filters: [{services: [blocklist_test_service_uuid]}]
}) {
let device, fake_peripheral, fake_blocklist_test_service,
fake_blocklist_exclude_reads_characteristic,
fake_blocklist_exclude_writes_characteristic, fake_blocklist_descriptor,
fake_blocklist_exclude_reads_descriptor,
fake_blocklist_exclude_writes_descriptor;
return setUpPreconnectedDevice({
address: '11:11:11:11:11:11',
name: 'Blocklist Device',
knownServiceUUIDs: ['generic_access', blocklist_test_service_uuid],
})
.then(_ => fake_peripheral = _)
.then(() => requestDeviceWithTrustedClick(options))
.then(_ => device = _)
.then(() => fake_peripheral.setNextGATTConnectionResponse({
code: HCI_SUCCESS,
}))
.then(() => device.gatt.connect())
.then(() => fake_peripheral.addFakeService({
uuid: blocklist_test_service_uuid,
}))
.then(_ => fake_blocklist_test_service = _)
.then(() => fake_blocklist_test_service.addFakeCharacteristic({
uuid: blocklist_exclude_reads_characteristic_uuid,
properties: ['read', 'write'],
}))
.then(_ => fake_blocklist_exclude_reads_characteristic = _)
.then(() => fake_blocklist_test_service.addFakeCharacteristic({
uuid: 'gap.peripheral_privacy_flag',
properties: ['read', 'write'],
}))
.then(_ => fake_blocklist_exclude_writes_characteristic = _)
.then(
() => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
{uuid: blocklist_test_descriptor_uuid}))
.then(_ => fake_blocklist_descriptor = _)
.then(
() => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
{uuid: blocklist_exclude_reads_descriptor_uuid}))
.then(_ => fake_blocklist_exclude_reads_descriptor = _)
.then(
() => fake_blocklist_exclude_writes_characteristic.addFakeDescriptor(
{uuid: 'gatt.client_characteristic_configuration'}))
.then(_ => fake_blocklist_exclude_writes_descriptor = _)
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS,
}))
.then(() => ({
device,
fake_peripheral,
fake_blocklist_test_service,
fake_blocklist_exclude_reads_characteristic,
fake_blocklist_exclude_writes_characteristic,
fake_blocklist_descriptor,
fake_blocklist_exclude_reads_descriptor,
fake_blocklist_exclude_writes_descriptor,
}));
}
/**
* Returns an object containing a Blocklist Test BluetoothRemoveGattService and
* its corresponding FakeRemoteGATTService.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
* service: BluetoothRemoteGATTService,
* fake_service: FakeBluetoothRemoteGATTService}>} An object containing the
* BluetoothDevice object and its corresponding GATT fake objects.
*/
function getBlocklistTestService() {
let result;
return getBlocklistDevice()
.then(_ => result = _)
.then(
() =>
result.device.gatt.getPrimaryService(blocklist_test_service_uuid))
.then(service => Object.assign(result, {
service,
fake_service: result.fake_blocklist_test_service,
}));
}
/**
* Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
* that excludes reads and its corresponding FakeRemoteGATTCharacteristic.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
* service: BluetoothRemoteGATTService,
* fake_service: FakeBluetoothRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object
* containing the BluetoothDevice object and its corresponding GATT fake
* objects.
*/
function getBlocklistExcludeReadsCharacteristic() {
let result, fake_characteristic;
return getBlocklistTestService()
.then(_ => result = _)
.then(
() => result.service.getCharacteristic(
blocklist_exclude_reads_characteristic_uuid))
.then(characteristic => Object.assign(result, {
characteristic,
fake_characteristic: result.fake_blocklist_exclude_reads_characteristic
}));
}
/**
* Returns an object containing a blocklisted BluetoothRemoteGATTCharacteristic
* that excludes writes and its corresponding FakeRemoteGATTCharacteristic.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
* service: BluetoothRemoteGATTService,
* fake_service: FakeBluetoothRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeBluetoothRemoteGATTCharacteristic}>} An object
* containing the BluetoothDevice object and its corresponding GATT fake
* objects.
*/
function getBlocklistExcludeWritesCharacteristic() {
let result, fake_characteristic;
return getBlocklistTestService()
.then(_ => result = _)
.then(
() => result.service.getCharacteristic('gap.peripheral_privacy_flag'))
.then(characteristic => Object.assign(result, {
characteristic,
fake_characteristic: result.fake_blocklist_exclude_writes_characteristic
}));
}
/**
* Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
* excludes reads and its corresponding FakeRemoteGATTDescriptor.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
* service: BluetoothRemoteGATTService,
* fake_service: FakeBluetoothRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeBluetoothRemoteGATTCharacteristic,
* descriptor: BluetoothRemoteGATTDescriptor,
* fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object
* containing the BluetoothDevice object and its corresponding GATT fake
* objects.
*/
function getBlocklistExcludeReadsDescriptor() {
let result;
return getBlocklistExcludeWritesCharacteristic()
.then(_ => result = _)
.then(
() => result.characteristic.getDescriptor(
blocklist_exclude_reads_descriptor_uuid))
.then(descriptor => Object.assign(result, {
descriptor,
fake_descriptor: result.fake_blocklist_exclude_reads_descriptor
}));
}
/**
* Returns an object containing a blocklisted BluetoothRemoteGATTDescriptor that
* excludes writes and its corresponding FakeRemoteGATTDescriptor.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_blocklist_test_service: FakeRemoteGATTService,
* fake_blocklist_exclude_reads_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_exclude_writes_characteristic:
* FakeRemoteGATTCharacteristic,
* fake_blocklist_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_reads_descriptor: FakeRemoteGATTDescriptor,
* fake_blocklist_exclude_writes_descriptor: FakeRemoteGATTDescriptor,
* service: BluetoothRemoteGATTService,
* fake_service: FakeBluetoothRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeBluetoothRemoteGATTCharacteristic,
* descriptor: BluetoothRemoteGATTDescriptor,
* fake_descriptor: FakeBluetoothRemoteGATTDescriptor}>} An object
* containing the BluetoothDevice object and its corresponding GATT fake
* objects.
*/
function getBlocklistExcludeWritesDescriptor() {
let result;
return getBlocklistExcludeWritesCharacteristic()
.then(_ => result = _)
.then(
() => result.characteristic.getDescriptor(
'gatt.client_characteristic_configuration'))
.then(descriptor => Object.assign(result, {
descriptor: descriptor,
fake_descriptor: result.fake_blocklist_exclude_writes_descriptor,
}));
}
/** Bluetooth HID Device Helper Methods */
/**
* Similar to getHealthThermometerDevice except the GATT discovery
* response has not been set yet so more attributes can still be added.
* TODO(crbug.com/719816): Add descriptors.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
* containing a requested BluetoothDevice and its fake counter part.
*/
function getConnectedHIDDevice(options) {
let device, fake_peripheral;
return setUpPreconnectedDevice({
address: '10:10:10:10:10:10',
name: 'HID Device',
knownServiceUUIDs: [
'generic_access',
'device_information',
'human_interface_device',
],
})
.then(_ => (fake_peripheral = _))
.then(() => requestDeviceWithTrustedClick(options))
.then(_ => (device = _))
.then(() => fake_peripheral.setNextGATTConnectionResponse({
code: HCI_SUCCESS,
}))
.then(() => device.gatt.connect())
.then(() => fake_peripheral.addFakeService({
uuid: 'generic_access',
}))
.then(() => fake_peripheral.addFakeService({
uuid: 'device_information',
}))
// Blocklisted Characteristic:
// https://github.com/WebBluetoothCG/registries/blob/master/gatt_blocklist.txt
.then(dev_info => dev_info.addFakeCharacteristic({
uuid: 'serial_number_string',
properties: ['read'],
}))
.then(() => fake_peripheral.addFakeService({
uuid: 'human_interface_device',
}))
.then(() => ({device, fake_peripheral}));
}
/**
* Returns a BluetoothDevice discovered using |options| and its
* corresponding FakePeripheral.
* The simulated device is called 'HID Device' it has three known service
* UUIDs: 'generic_access', 'device_information', 'human_interface_device'.
* The primary service with 'device_information' UUID has a characteristics
* with UUID 'serial_number_string'. The device has been connected to and its
* attributes are ready to be discovered.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
* containing a requested BluetoothDevice and its fake counter part.
*/
function getHIDDevice(options) {
let device, fake_peripheral;
return getConnectedHIDDevice(options)
.then(_ => ({device, fake_peripheral} = _))
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS,
}))
.then(() => ({device, fake_peripheral}));
}
/** Health Thermometer Bluetooth Device Helper Methods */
/**
* Returns a FakePeripheral that corresponds to a simulated pre-connected device
* called 'Health Thermometer'. The device has two known serviceUUIDs:
* 'generic_access' and 'health_thermometer'.
* @returns {FakePeripheral} The device fake initialized as a Health
* Thermometer device.
*/
function setUpHealthThermometerDevice() {
return setUpPreconnectedDevice({
address: '09:09:09:09:09:09',
name: 'Health Thermometer',
knownServiceUUIDs: ['generic_access', 'health_thermometer'],
});
}
/**
* Returns the same fake peripheral as setUpHealthThermometerDevice() except
* that connecting to the peripheral will succeed.
* @returns {Promise<FakePeripheral>} The device fake initialized as a
* connectable Health Thermometer device.
*/
function setUpConnectableHealthThermometerDevice() {
let fake_peripheral;
return setUpHealthThermometerDevice()
.then(_ => fake_peripheral = _)
.then(() => fake_peripheral.setNextGATTConnectionResponse({
code: HCI_SUCCESS,
}))
.then(() => fake_peripheral);
}
/**
* Populates a fake_peripheral with various fakes appropriate for a health
* thermometer. This resolves to an associative array composed of the fakes,
* including the |fake_peripheral|.
* @param {FakePeripheral} fake_peripheral The Bluetooth fake to populate GATT
* services, characteristics, and descriptors on.
* @returns {Promise<{fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic}>} The FakePeripheral
* passed into this method along with the fake GATT services, characteristics,
* and descriptors added to it.
*/
function populateHealthThermometerFakes(fake_peripheral) {
let fake_generic_access, fake_health_thermometer, fake_measurement_interval,
fake_user_description, fake_cccd, fake_temperature_measurement,
fake_temperature_type;
return fake_peripheral.addFakeService({uuid: 'generic_access'})
.then(_ => fake_generic_access = _)
.then(() => fake_peripheral.addFakeService({
uuid: 'health_thermometer',
}))
.then(_ => fake_health_thermometer = _)
.then(() => fake_health_thermometer.addFakeCharacteristic({
uuid: 'measurement_interval',
properties: ['read', 'write', 'indicate'],
}))
.then(_ => fake_measurement_interval = _)
.then(() => fake_measurement_interval.addFakeDescriptor({
uuid: 'gatt.characteristic_user_description',
}))
.then(_ => fake_user_description = _)
.then(() => fake_measurement_interval.addFakeDescriptor({
uuid: 'gatt.client_characteristic_configuration',
}))
.then(_ => fake_cccd = _)
.then(() => fake_health_thermometer.addFakeCharacteristic({
uuid: 'temperature_measurement',
properties: ['indicate'],
}))
.then(_ => fake_temperature_measurement = _)
.then(() => fake_health_thermometer.addFakeCharacteristic({
uuid: 'temperature_type',
properties: ['read'],
}))
.then(_ => fake_temperature_type = _)
.then(() => ({
fake_peripheral,
fake_generic_access,
fake_health_thermometer,
fake_measurement_interval,
fake_cccd,
fake_user_description,
fake_temperature_measurement,
fake_temperature_type,
}));
}
/**
* Returns the same device and fake peripheral as getHealthThermometerDevice()
* after another frame (an iframe we insert) discovered the device,
* connected to it and discovered its services.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getHealthThermometerDeviceWithServicesDiscovered(options) {
let device, fake_peripheral, fakes;
let iframe = document.createElement('iframe');
return setUpConnectableHealthThermometerDevice()
.then(_ => fake_peripheral = _)
.then(() => populateHealthThermometerFakes(fake_peripheral))
.then(_ => fakes = _)
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS,
}))
.then(
() => new Promise(resolve => {
let src = '/bluetooth/resources/health-thermometer-iframe.html';
// TODO(509038): Can be removed once LayoutTests/bluetooth/* that
// use health-thermometer-iframe.html have been moved to
// LayoutTests/external/wpt/bluetooth/*
if (window.location.pathname.includes('/LayoutTests/')) {
src =
'../../../external/wpt/bluetooth/resources/health-thermometer-iframe.html';
}
iframe.src = src;
document.body.appendChild(iframe);
iframe.addEventListener('load', resolve);
}))
.then(() => new Promise((resolve, reject) => {
callWithTrustedClick(() => {
iframe.contentWindow.postMessage(
{type: 'DiscoverServices', options: options}, '*');
});
function messageHandler(messageEvent) {
if (messageEvent.data == 'DiscoveryComplete') {
window.removeEventListener('message', messageHandler);
resolve();
} else {
reject(new Error(`Unexpected message: ${messageEvent.data}`));
}
}
window.addEventListener('message', messageHandler);
}))
.then(() => requestDeviceWithTrustedClick(options))
.then(_ => device = _)
.then(device => device.gatt.connect())
.then(_ => Object.assign({device}, fakes));
}
/**
* Similar to getHealthThermometerDevice() except the device
* is not connected and thus its services have not been
* discovered.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
* containing a requested BluetoothDevice and its fake counter part.
*/
function getDiscoveredHealthThermometerDevice(options = {
filters: [{services: ['health_thermometer']}]
}) {
return setUpHealthThermometerDevice().then(fake_peripheral => {
return requestDeviceWithTrustedClick(options).then(
device => ({device: device, fake_peripheral: fake_peripheral}));
});
}
/**
* Similar to getHealthThermometerDevice() except the device has no services,
* characteristics, or descriptors.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {device: BluetoothDevice, fake_peripheral: FakePeripheral} An object
* containing a requested BluetoothDevice and its fake counter part.
*/
function getEmptyHealthThermometerDevice(options) {
return getDiscoveredHealthThermometerDevice(options).then(
({device, fake_peripheral}) => {
return fake_peripheral
.setNextGATTConnectionResponse({code: HCI_SUCCESS})
.then(() => device.gatt.connect())
.then(
() => fake_peripheral.setNextGATTDiscoveryResponse(
{code: HCI_SUCCESS}))
.then(() => ({device: device, fake_peripheral: fake_peripheral}));
});
}
/**
* Similar to getHealthThermometerService() except the service has no
* characteristics or included services.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {service: BluetoothRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService} An object containing the
* health themometer service object and its corresponding fake.
*/
function getEmptyHealthThermometerService(options) {
let device;
let fake_peripheral;
let fake_health_thermometer;
return getDiscoveredHealthThermometerDevice(options)
.then(result => ({device, fake_peripheral} = result))
.then(
() => fake_peripheral.setNextGATTConnectionResponse(
{code: HCI_SUCCESS}))
.then(() => device.gatt.connect())
.then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
.then(s => fake_health_thermometer = s)
.then(
() =>
fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
.then(() => device.gatt.getPrimaryService('health_thermometer'))
.then(service => ({
service: service,
fake_health_thermometer: fake_health_thermometer,
}));
}
/**
* Similar to getHealthThermometerDevice except the GATT discovery
* response has not been set yet so more attributes can still be added.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getConnectedHealthThermometerDevice(options) {
let device, fake_peripheral, fakes;
return getDiscoveredHealthThermometerDevice(options)
.then(_ => ({device, fake_peripheral} = _))
.then(() => fake_peripheral.setNextGATTConnectionResponse({
code: HCI_SUCCESS,
}))
.then(() => populateHealthThermometerFakes(fake_peripheral))
.then(_ => fakes = _)
.then(() => device.gatt.connect())
.then(() => Object.assign({device}, fakes));
}
/**
* Returns an object containing a BluetoothDevice discovered using |options|,
* its corresponding FakePeripheral and FakeRemoteGATTServices.
* The simulated device is called 'Health Thermometer' it has two known service
* UUIDs: 'generic_access' and 'health_thermometer' which correspond to two
* services with the same UUIDs. The 'health thermometer' service contains three
* characteristics:
* - 'temperature_measurement' (indicate),
* - 'temperature_type' (read),
* - 'measurement_interval' (read, write, indicate)
* The 'measurement_interval' characteristic contains a
* 'gatt.client_characteristic_configuration' descriptor and a
* 'characteristic_user_description' descriptor.
* The device has been connected to and its attributes are ready to be
* discovered.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getHealthThermometerDevice(options) {
let result;
return getConnectedHealthThermometerDevice(options)
.then(_ => result = _)
.then(() => result.fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS,
}))
.then(() => result);
}
/**
* Similar to getHealthThermometerDevice except that the peripheral has two
* 'health_thermometer' services.
* @param {RequestDeviceOptions} options The options for requesting a Bluetooth
* Device.
* @returns {Promise<{device: BluetoothDevice, fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService, fake_health_thermometer1:
* FakeRemoteGATTService, fake_health_thermometer2: FakeRemoteGATTService}>} An
* object containing a requested Bluetooth device and two fake health
* thermometer GATT services.
*/
function getTwoHealthThermometerServicesDevice(options) {
let device;
let fake_peripheral;
let fake_generic_access;
let fake_health_thermometer1;
let fake_health_thermometer2;
return getConnectedHealthThermometerDevice(options)
.then(result => {
({
device,
fake_peripheral,
fake_generic_access,
fake_health_thermometer: fake_health_thermometer1,
} = result);
})
.then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
.then(s => fake_health_thermometer2 = s)
.then(
() =>
fake_peripheral.setNextGATTDiscoveryResponse({code: HCI_SUCCESS}))
.then(() => ({
device: device,
fake_peripheral: fake_peripheral,
fake_generic_access: fake_generic_access,
fake_health_thermometer1: fake_health_thermometer1,
fake_health_thermometer2: fake_health_thermometer2
}));
}
/**
* Returns an object containing a Health Thermometer BluetoothRemoteGattService
* and its corresponding FakeRemoteGATTService.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic,
* service: BluetoothRemoteGATTService,
* fake_service: FakeRemoteGATTService}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getHealthThermometerService() {
let result;
return getHealthThermometerDevice()
.then(r => result = r)
.then(() => result.device.gatt.getPrimaryService('health_thermometer'))
.then(service => Object.assign(result, {
service,
fake_service: result.fake_health_thermometer,
}));
}
/**
* Returns an object containing a Measurement Interval
* BluetoothRemoteGATTCharacteristic and its corresponding
* FakeRemoteGATTCharacteristic.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic,
* service: BluetoothRemoteGATTService,
* fake_service: FakeRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeRemoteGATTCharacteristic}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getMeasurementIntervalCharacteristic() {
let result;
return getHealthThermometerService()
.then(r => result = r)
.then(() => result.service.getCharacteristic('measurement_interval'))
.then(characteristic => Object.assign(result, {
characteristic,
fake_characteristic: result.fake_measurement_interval,
}));
}
/**
* Returns an object containing a User Description
* BluetoothRemoteGATTDescriptor and its corresponding
* FakeRemoteGATTDescriptor.
* @returns {Promise<{device: BluetoothDevice, fakes: {
* fake_peripheral: FakePeripheral,
* fake_generic_access: FakeRemoteGATTService,
* fake_health_thermometer: FakeRemoteGATTService,
* fake_measurement_interval: FakeRemoteGATTCharacteristic,
* fake_cccd: FakeRemoteGATTDescriptor,
* fake_user_description: FakeRemoteGATTDescriptor,
* fake_temperature_measurement: FakeRemoteGATTCharacteristic,
* fake_temperature_type: FakeRemoteGATTCharacteristic,
* service: BluetoothRemoteGATTService,
* fake_service: FakeRemoteGATTService,
* characteristic: BluetoothRemoteGATTCharacteristic,
* fake_characteristic: FakeRemoteGATTCharacteristic
* descriptor: BluetoothRemoteGATTDescriptor,
* fake_descriptor: FakeRemoteGATTDescriptor}}>} An object
* containing a requested BluetoothDevice and all of the GATT fake
* objects.
*/
function getUserDescriptionDescriptor() {
let result;
return getMeasurementIntervalCharacteristic()
.then(r => result = r)
.then(
() => result.characteristic.getDescriptor(
'gatt.characteristic_user_description'))
.then(descriptor => Object.assign(result, {
descriptor,
fake_descriptor: result.fake_user_description,
}));
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -39,4 +39,4 @@ function verifyBluetoothAdvertisingEvent(e) {
assert_equals(data[0], e.serviceData.get(health_uuid).getUint8(0))
assert_equals(data[1], e.serviceData.get(health_uuid).getUint8(1))
assert_equals(data[2], e.serviceData.get(health_uuid).getUint8(2))
}
}

Просмотреть файл

@ -0,0 +1,384 @@
'use strict';
/**
* Test Setup Helpers
*/
/**
* Loads a script by creating a <script> element pointing to |path|.
* @param {string} path The path of the script to load.
* @returns {Promise<void>} Resolves when the script has finished loading.
*/
function loadScript(path) {
let script = document.createElement('script');
let promise = new Promise(resolve => script.onload = resolve);
script.src = path;
script.async = false;
document.head.appendChild(script);
return promise;
}
/**
* Loads the scripts in |paths|.
* @param {string[]} paths
* @returns {Promise<void>} A promise chain that resolves when all scripts have
* finished loading.
*/
function loadScripts(paths) {
let chain = Promise.resolve();
for (let path of paths) {
chain = chain.then(() => loadScript(path));
}
return chain;
}
/**
* Performs the Chromium specific setup necessary to run the tests in the
* Chromium browser. This test file is shared between Web Platform Tests and
* Blink Web Tests, so this method figures out the correct paths to use for
* loading scripts.
*
* TODO(https://crbug.com/569709): Update this description when all Web
* Bluetooth Blink Web Tests have been migrated into this repository.
* @returns {Promise<void>} Resolves when Chromium specific setup is complete.
*/
function performChromiumSetup() {
// Make sure we are actually on Chromium with Mojo enabled.
if (typeof Mojo === 'undefined') {
return;
}
// Load the Chromium-specific resources.
let prefix = '/resources/chromium';
let genPrefix = '/gen';
let extra = [];
const pathname = window.location.pathname;
if (pathname.includes('/LayoutTests/') || pathname.includes('/web_tests/')) {
let root = pathname.match(/.*(?:LayoutTests|web_tests)/);
prefix = `${root}/external/wpt/resources/chromium`;
extra = [
`${root}/resources/bluetooth/bluetooth-fake-adapter.js`,
];
genPrefix = 'file:///gen';
} else if (window.location.pathname.startsWith('/bluetooth/https/')) {
extra = [
'/js-test-resources/bluetooth/bluetooth-fake-adapter.js',
];
}
return loadScripts([
`${genPrefix}/layout_test_data/mojo/public/js/mojo_bindings.js`,
`${genPrefix}/content/test/data/mojo_web_test_helper_test.mojom.js`,
`${genPrefix}/device/bluetooth/public/mojom/uuid.mojom.js`,
`${genPrefix}/url/mojom/origin.mojom.js`,
`${genPrefix}/device/bluetooth/public/mojom/test/fake_bluetooth.mojom.js`,
`${genPrefix}/content/shell/common/web_test/fake_bluetooth_chooser.mojom.js`,
`${prefix}/web-bluetooth-test.js`,
].concat(extra))
// Call setBluetoothFakeAdapter() to clean up any fake adapters left over
// by legacy tests.
// Legacy tests that use setBluetoothFakeAdapter() sometimes fail to clean
// their fake adapter. This is not a problem for these tests because the
// next setBluetoothFakeAdapter() will clean it up anyway but it is a
// problem for the new tests that do not use setBluetoothFakeAdapter().
// TODO(https://crbug.com/569709): Remove once setBluetoothFakeAdapter is
// no longer used.
.then(
() => typeof setBluetoothFakeAdapter === 'undefined' ?
undefined :
setBluetoothFakeAdapter(''));
}
/**
* These tests rely on the User Agent providing an implementation of the Web
* Bluetooth Testing API.
* https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/edit?ts=59b6d823#heading=h.7nki9mck5t64
* @param {function{*}: Promise<*>} test_function The Web Bluetooth test to run.
* @param {string} name The name or description of the test.
* @param {object} properties An object containing extra options for the test.
* @returns {Promise<void>} Resolves if Web Bluetooth test ran successfully, or
* rejects if the test failed.
*/
function bluetooth_test(test_function, name, properties) {
Promise.resolve().then(
() => promise_test(
t => Promise
.resolve()
// Trigger Chromium-specific setup.
.then(performChromiumSetup)
.then(() => test_function(t))
.then(() => navigator.bluetooth.test.allResponsesConsumed())
.then(consumed => assert_true(consumed)),
name, properties));
}
/**
* Test Helpers
*/
/**
* Waits until the document has finished loading.
* @returns {Promise<void>} Resolves if the document is already completely
* loaded or when the 'onload' event is fired.
*/
function waitForDocumentReady() {
return new Promise(resolve => {
if (document.readyState === 'complete') {
resolve();
}
window.addEventListener('load', () => {
resolve();
}, {once: true});
});
}
/**
* Simulates a user activation prior to running |callback|.
* @param {Function} callback The function to run after the user activation.
* @returns {Promise<*>} Resolves when the user activation has been simulated
* with the result of |callback|.
*/
function callWithTrustedClick(callback) {
return waitForDocumentReady().then(() => new Promise(resolve => {
let button =
document.createElement('button');
button.textContent =
'click to continue test';
button.style.display = 'block';
button.style.fontSize = '20px';
button.style.padding = '10px';
button.onclick = () => {
document.body.removeChild(button);
resolve(callback());
};
document.body.appendChild(button);
test_driver.click(button);
}));
}
/**
* Calls requestDevice() in a context that's 'allowed to show a popup'.
* @returns {Promise<BluetoothDevice>} Resolves with a Bluetooth device if
* successful or rejects with an error.
*/
function requestDeviceWithTrustedClick() {
let args = arguments;
return callWithTrustedClick(
() => navigator.bluetooth.requestDevice.apply(navigator.bluetooth, args));
}
/**
* Calls requestLEScan() in a context that's 'allowed to show a popup'.
* @returns {Promise<BluetoothLEScan>} Resolves with the properties of the scan
* if successful or rejects with an error.
*/
function requestLEScanWithTrustedClick() {
let args = arguments;
return callWithTrustedClick(
() => navigator.bluetooth.requestLEScan.apply(navigator.bluetooth, args));
}
/**
* Function to test that a promise rejects with the expected error type and
* message.
* @param {Promise} promise
* @param {object} expected
* @param {string} description
* @returns {Promise<void>} Resolves if |promise| rejected with |expected|
* error.
*/
function assert_promise_rejects_with_message(promise, expected, description) {
return promise.then(
() => {
assert_unreached('Promise should have rejected: ' + description);
},
error => {
assert_equals(error.name, expected.name, 'Unexpected Error Name:');
if (expected.message) {
assert_equals(
error.message, expected.message, 'Unexpected Error Message:');
}
});
}
/**
* Runs the garbage collection.
* @returns {Promise<void>} Resolves when garbage collection has finished.
*/
function runGarbageCollection() {
// Run gc() as a promise.
return new Promise(function(resolve, reject) {
GCController.collect();
step_timeout(resolve, 0);
});
}
/**
* Helper class that can be created to check that an event has fired.
*/
class EventCatcher {
/**
* @param {EventTarget} object The object to listen for events on.
* @param {string} event The type of event to listen for.
*/
constructor(object, event) {
/** @type {boolean} */
this.eventFired = false;
/** @type {function()} */
let event_listener = () => {
object.removeEventListener(event, event_listener);
this.eventFired = true;
};
object.addEventListener(event, event_listener);
}
}
/**
* Notifies when the event |type| has fired.
* @param {EventTarget} target The object to listen for the event.
* @param {string} type The type of event to listen for.
* @param {object} options Characteristics about the event listener.
* @returns {Promise<Event>} Resolves when an event of |type| has fired.
*/
function eventPromise(target, type, options) {
return new Promise(resolve => {
let wrapper = function(event) {
target.removeEventListener(type, wrapper);
resolve(event);
};
target.addEventListener(type, wrapper, options);
});
}
/**
* The action that should occur first in assert_promise_event_order_().
* @enum {string}
*/
const ShouldBeFirst = {
EVENT: 'event',
PROMISE_RESOLUTION: 'promiseresolved',
};
/**
* Helper function to assert that events are fired and a promise resolved
* in the correct order.
* 'event' should be passed as |should_be_first| to indicate that the events
* should be fired first, otherwise 'promiseresolved' should be passed.
* Attaches |num_listeners| |event| listeners to |object|. If all events have
* been fired and the promise resolved in the correct order, returns a promise
* that fulfills with the result of |object|.|func()| and |event.target.value|
* of each of event listeners. Otherwise throws an error.
* @param {ShouldBeFirst} should_be_first Indicates whether |func| should
* resolve before |event| is fired.
* @param {EventTarget} object The target object to add event listeners to.
* @param {function(*): Promise<*>} func The function to test the resolution
* order for.
* @param {string} event The event type to listen for.
* @param {number} num_listeners The number of events to listen for.
* @returns {Promise<*>} The return value of |func|.
*/
function assert_promise_event_order_(
should_be_first, object, func, event, num_listeners) {
let order = [];
let event_promises = [];
for (let i = 0; i < num_listeners; i++) {
event_promises.push(new Promise(resolve => {
let event_listener = (e) => {
object.removeEventListener(event, event_listener);
order.push(ShouldBeFirst.EVENT);
resolve(e.target.value);
};
object.addEventListener(event, event_listener);
}));
}
let func_promise = object[func]().then(result => {
order.push(ShouldBeFirst.PROMISE_RESOLUTION);
return result;
});
return Promise.all([func_promise, ...event_promises]).then((result) => {
if (should_be_first !== order[0]) {
throw should_be_first === ShouldBeFirst.PROMISE_RESOLUTION ?
`'${event}' was fired before promise resolved.` :
`Promise resolved before '${event}' was fired.`;
}
if (order[0] !== ShouldBeFirst.PROMISE_RESOLUTION &&
order[order.length - 1] !== ShouldBeFirst.PROMISE_RESOLUTION) {
throw 'Promise resolved in between event listeners.';
}
return result;
});
}
/**
* Asserts that the promise returned by |func| resolves before events of type
* |event| are fired |num_listeners| times on |object|. See
* assert_promise_event_order_ above for more details.
* @param {EventTarget} object The target object to add event listeners to.
* @param {function(*): Promise<*>} func The function whose promise should
* resolve first.
* @param {string} event The event type to listen for.
* @param {number} num_listeners The number of events to listen for.
* @returns {Promise<*>} The return value of |func|.
*/
function assert_promise_resolves_before_event(
object, func, event, num_listeners = 1) {
return assert_promise_event_order_(
ShouldBeFirst.PROMISE_RESOLUTION, object, func, event, num_listeners);
}
/**
* Asserts that the promise returned by |func| resolves after events of type
* |event| are fired |num_listeners| times on |object|. See
* assert_promise_event_order_ above for more details.
* @param {EventTarget} object The target object to add event listeners to.
* @param {function(*): Promise<*>} func The function whose promise should
* resolve first.
* @param {string} event The event type to listen for.
* @param {number} num_listeners The number of events to listen for.
* @returns {Promise<*>} The return value of |func|.
*/
function assert_promise_resolves_after_event(
object, func, event, num_listeners = 1) {
return assert_promise_event_order_(
ShouldBeFirst.EVENT, object, func, event, num_listeners);
}
/**
* Returns a promise that resolves after 100ms unless the the event is fired on
* the object in which case the promise rejects.
* @param {EventTarget} object The target object to listen for events.
* @param {string} event_name The event type to listen for.
* @returns {Promise<void>} Resolves if no events were fired.
*/
function assert_no_events(object, event_name) {
return new Promise((resolve, reject) => {
let event_listener = (e) => {
object.removeEventListener(event_name, event_listener);
assert_unreached('Object should not fire an event.');
};
object.addEventListener(event_name, event_listener);
// TODO: Remove timeout.
// http://crbug.com/543884
step_timeout(() => {
object.removeEventListener(event_name, event_listener);
resolve();
}, 100);
});
}
/**
* Asserts that |properties| contains the same properties in
* |expected_properties| with equivalent values.
* @param {object} properties Actual object to compare.
* @param {object} expected_properties Expected object to compare with.
*/
function assert_properties_equal(properties, expected_properties) {
for (let key in expected_properties) {
assert_equals(properties[key], expected_properties[key]);
}
}

Просмотреть файл

@ -1,5 +1,6 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
TEST

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Device will connect';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Garbage Collection ran during a connect call that ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Multiple connects should return the same gatt object.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = '[SameObject] test for BluetoothRemoteGATTServer\'s device.';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Connect + Disconnect twice still results in ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<script>
'use strict';
const test_desc = 'Calling disconnect twice in a row still results in ' +

Просмотреть файл

@ -3,7 +3,8 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script src="/bluetooth/resources/bluetooth-test.js"></script>
<script src="/bluetooth/resources/bluetooth-fake-devices.js"></script>
<body>
<script>
'use strict';

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called before getPrimaryService. ' +

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryService ' +

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'disconnect() called during a getPrimaryService call that ' +

Просмотреть файл

@ -1,6 +1,7 @@
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/bluetooth/resources/bluetooth-helpers.js
// META: script=/bluetooth/resources/bluetooth-test.js
// META: script=/bluetooth/resources/bluetooth-fake-devices.js
// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py
'use strict';
const test_desc = 'Calls on services after we disconnect and connect again. ' +

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше