# Web Bluetooth API Tests The Web Bluetooth API enables sites to connect to and interact with Bluetooth Low Energy devices. Please check the [Web Bluetooth specification] for more details. Web Bluetooth testing relies on the [FakeBluetooth][Web Bluetooth 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-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]: https://docs.google.com/document/d/1Nhv_oVDCodd1pEH_jj9k8gF4rPGb_84VYaZ9IG8M_WY/ [#485]: https://github.com/WebBluetoothCG/web-bluetooth/issues/485 [Testing Web Bluetooth specification]: https://WebBluetoothCG.github.io/web-bluetooth/tests.html ## Generated Tests Several Web Bluetooth tests share common test logic. For these tests, the `script-tests` directory contains templates that are used by the `generate.py` script to create several tests from these templates. The templates are JavaScript files that contain a `CALLS()` keyword with functions delimited by a `|` character. A test will be created for each function in the `CALLS()` by `generate.py`. Note that for each subdirectory in `script-tests` there is a matching directory under `bluetooth`. The generator will expand `CALLS` functions into the corresponding directory. ### Example The `./script-tests/server/get-same-object.js` contains the following code: ```js gattServer.CALLS([ getPrimaryService('heart_rate')| getPrimaryServices()| getPrimaryServices('heart_rate')[UUID]]), ``` The functions in `CALLS()` will be expanded to generate 3 test files prefixed with `gen-`: ``` bluetooth/server/getPrimaryService/gen-get-same-object.html bluetooth/server/getPrimaryServices/gen-get-same-object.html bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.html ``` ### Generate Tests To generate the tests in `script-tests`, run the following command from the source root: ```sh $ python bluetooth/generate.py ``` To check that generated tests are correct and that there are no obsolete tests, or tests for which a template does not exist anymore, run: ```sh $ python bluetooth/generate_test.py ``` More details can be found in `generate.py` and `generate_test.py`. ## Chromium Implementation The Chromium implementation is provided by `../resources/chromium/web-bluetooth-test.js` using [MojoJS]. The Chromium implementation is not included in stable Chrome builds since it would add too much to the binary size. On Chromium infrastructure, it is run using the `content_shell` executable. In the future, Chromium `src/device/bluetooth` may be refactored into a Mojo service. At this point, it would be possible to add the necessary testing hooks into stable Chrome without substantially increasing the binary size, similar to WebUSB. These Bluetooth tests are upstreamed here because other browsers can reuse them by implementing the [Web Bluetooth Testing] API, even if only on their internal infrastructure. For more implementation details, see the [Web Bluetooth Service README]. [MojoJS]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/testing/web_platform_tests.md#mojojs [Web Bluetooth Service README]: https://chromium.googlesource.com/chromium/src.git/+/main/content/browser/bluetooth/README.md # Resources and Documentation For any issues pertaining to the specification, please file a [GitHub] issue. For issues pertaining to an implementation of Web Bluetooth, please file an issue with the implementor's bug tracker. * [Web Bluetooth specification] * [Web Bluetooth Testing] * [Testing Web Bluetooth specification] [GitHub]: https://github.com/WebBluetoothCG/web-bluetooth ## Chromium Mailing list: web-bluetooth@chromium.org Bug tracker: [Blink>Bluetooth] * [Web Bluetooth Service README] [Blink>Bluetooth]: https://bugs.chromium.org/p/chromium/issues/list?q=component%3ABlink%3EBluetooth&can=2