Commit 5fec41e6 authored by Ovidio Henriquez's avatar Ovidio Henriquez Committed by Commit Bot

bluetooth: Migrate getPrimaryServices tests

This change migrates the server/getPrimaryService(s) tests to wpt/.

BUG=509038

Change-Id: I9f3adb19f0b6edec2ba45eec7e331b75b3aae57c
Reviewed-on: https://chromium-review.googlesource.com/834201Reviewed-by: default avatarReilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarConley Owens <cco3@chromium.org>
Commit-Queue: Ovidio Henriquez <odejesush@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532063}
parent 31246f47
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return getHealthThermometerDevice({
filters: [{services: ['health_thermometer']}],
optionalServices: ['generic_access']})
.then(({device}) => {
return Promise.all([
device.gatt.getPrimaryService(generic_access.alias),
device.gatt.getPrimaryService(generic_access.name),
device.gatt.getPrimaryService(generic_access.uuid)])
.then(services => {
services.forEach(service => {
assert_equals(service.uuid, generic_access.uuid,
'Service UUID should be the same as requested UUID.');
assert_true(service.isPrimary,
'getPrimaryService should return a primary service.');
assert_equals(service.device, device,
'Service device should be the same as device.');
});
});
});
}, 'Request for service. Should return right service');
</script>
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
"use strict";
const test_desc = 'Two iframes in the same origin should be able to access ' +
"each other\'s services";
const iframe1 = document.createElement('iframe');
const iframe2 = document.createElement('iframe');
function add_iframe(iframe) {
let promise = new Promise(resolve =>
iframe.addEventListener('load', resolve));
iframe.src =
'../../../resources/bluetooth/health-thermometer-two-iframes.html';
document.body.appendChild(iframe);
return promise;
}
function send_message(iframe, command, arg, assert_func) {
let promise = new Promise((resolve, reject) => {
window.onmessage = messageEvent => {
try {
assert_func(messageEvent.data);
} catch (e) {
reject(e);
}
resolve();
}
});
callWithTrustedClick(() =>
iframe.contentWindow.postMessage(`${command} ${arg}`, '*'));
return promise;
}
bluetooth_test(() => getHealthThermometerDevice()
// 1. Add the first iframe.
.then(() => add_iframe(iframe1))
// 2. Connect with the first iframe, requesting the health thermometer
// service.
.then(() => send_message(iframe1, 'RequestAndConnect', 'health_thermometer',
msg => assert_equals(msg, 'SUCCESS')))
// 3. Access the health thermometer service with the first iframe
// (successfully).
.then(() => send_message(iframe1, 'GetService', 'health_thermometer',
msg => assert_equals(msg, 'SUCCESS')))
// 4. Access the generic access service with the first iframe
// (unsuccessfully).
.then(() => send_message(iframe1, 'GetService', 'generic_access', msg => {
let split_msg = msg.split(': ');
assert_equals(split_msg[0], 'FAIL');
assert_equals(split_msg[1], 'SecurityError');
}))
// 5. Add the second iframe.
.then(() => add_iframe(iframe2))
// 6. Connect with the second iframe, requesting the generic access service.
.then(() => send_message(iframe2, 'RequestAndConnect', 'generic_access',
msg => assert_equals(msg, 'SUCCESS')))
// 7. Access the health thermometer service with the second iframe
// (successfully). Both iframes should have access to both services at this
// point since they have the same origin.
.then(() => send_message(iframe2, 'GetService', 'health_thermometer',
msg => assert_equals(msg, 'SUCCESS')))
// 8. Access the generic access service with the second iframe
// (unsuccessfully).
.then(() => send_message(iframe2, 'GetService', 'generic_access',
msg => assert_equals(msg, 'SUCCESS')))
// 9. Access the generic access service with the first iframe
// (successfully).
.then(() => send_message(iframe1, 'GetService', 'generic_access',
msg => assert_equals(msg, 'SUCCESS'))), test_desc);
</script>
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return getHIDDevice({
filters: [{services: ['device_information']}],
optionalServices: ['human_interface_device']})
.then(({device}) => assert_promise_rejects_with_message(
device.gatt.getPrimaryServices('human_interface_device'),
new DOMException('Origin is not allowed to access the service. ' +
'Tip: Add the service UUID to \'optionalServices\' ' +
'in requestDevice() options. https://goo.gl/HxfxSQ',
'SecurityError')));
}, 'Request for services. Does not return blocklisted service.');
</script>
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return getConnectedHealthThermometerDevice({
filters: [{services: ['health_thermometer']}]
})
.then(({device, fake_peripheral, fake_health_thermometer}) => {
return fake_peripheral.addFakeService({uuid: 'health_thermometer'})
.then(fake_service => Promise.all([
fake_service.addFakeCharacteristic({
uuid: 'temperature_measurement', properties: ['indicate']}),
fake_service.addFakeCharacteristic({
uuid: 'temperature_measurement', properties: ['indicate']})
]))
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({
code: HCI_SUCCESS}))
.then(() => device.gatt.getPrimaryServices('health_thermometer'))
.then(services => Promise.all([
services[0].getCharacteristics(),
services[1].getCharacteristics()]))
.then(([characteristics1, characteristics2]) => {
if (characteristics1.length === 2)
assert_equals(characteristics2.length, 3);
else if (characteristics2.length === 2)
assert_equals(characteristics1.length, 3);
else
assert_unreached('Invalid lengths.');
});
});
}, 'Find correct services with UUID.');
</script>
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script>
<script>
'use strict';
bluetooth_test(() => {
return getEmptyHealthThermometerDevice()
.then(({device}) => assert_promise_rejects_with_message(
device.gatt.getPrimaryServices(),
new DOMException('No Services found in device.', 'NotFoundError')));
}, 'Request for services in a device with no services. Reject with ' +
'NotFoundError.');
</script>
<!DOCTYPE html> <!DOCTYPE html>
<script> <script>
let device; let device, gatt;
function requestDeviceWithOptionsAndConnect(options) { function requestDeviceWithOptionsAndConnect(options) {
return navigator.bluetooth.requestDevice(options) return navigator.bluetooth.requestDevice(options)
.then(device => device.gatt.connect()); .then(device => device.gatt.connect());
} }
window.onmessage = messageEvent => { window.addEventListener('message', (messageEvent) => {
switch (messageEvent.data.type) { switch (messageEvent.data.type) {
case 'RequestAndConnect': case 'RequestAndConnect':
requestDeviceWithOptionsAndConnect(messageEvent.data.options) requestDeviceWithOptionsAndConnect(messageEvent.data.options)
.then(gatt => { .then(_ => {
gatt = _;
device = gatt.device; device = gatt.device;
parent.postMessage('Connected', '*'); parent.postMessage('Connected', '*');
}).catch(err => { }).catch(err => {
...@@ -26,9 +27,18 @@ window.onmessage = messageEvent => { ...@@ -26,9 +27,18 @@ window.onmessage = messageEvent => {
parent.postMessage(`FAIL: ${err}`, '*'); parent.postMessage(`FAIL: ${err}`, '*');
}); });
break; break;
case 'GetService':
if (typeof gatt === 'undefined') {
parent.postMessage('FAIL: no GATT server', '*');
break;
}
gatt.getPrimaryService(messageEvent.data.options)
.then(() => parent.postMessage('ServiceReceived', '*'))
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
break;
default: default:
parent.postMessage(`FAIL: Bad message type: ${messageEvent.data.type}`, parent.postMessage(`FAIL: Bad message type: ${messageEvent.data.type}`,
'*'); '*');
} }
}; });
</script> </script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<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>
'use strict';
const test_desc = 'Request for service. Should return right service';
let device;
bluetooth_test(() => getHealthThermometerDevice({
filters: [{services: ['health_thermometer']}],
optionalServices: ['generic_access']
})
.then(_ => ({device} = _))
.then(() => Promise.all([
device.gatt.getPrimaryService(generic_access.alias),
device.gatt.getPrimaryService(generic_access.name),
device.gatt.getPrimaryService(generic_access.uuid)]))
.then(services => {
services.forEach(service => {
assert_equals(service.uuid, generic_access.uuid,
'Service UUID should be the same as requested UUID.');
assert_true(service.isPrimary,
'getPrimaryService should return a primary service.');
assert_equals(service.device, device,
'Service device should be the same as device.');
})
}), test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<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>
"use strict";
const test_desc = 'Two iframes in the same origin should be able to access ' +
'each other\'s services';
const iframe1 = document.createElement('iframe');
const iframe2 = document.createElement('iframe');
function add_iframe(iframe) {
let promise = new Promise(resolve => iframe.addEventListener('load', resolve));
iframe.src = '/bluetooth/resources/health-thermometer-iframe.html';
document.body.appendChild(iframe);
return promise;
}
function send_message(iframe, command, arg, assert_func) {
let promise = new Promise((resolve, reject) => {
window.addEventListener('message', (messageEvent) => {
try {
assert_func(messageEvent.data);
} catch (e) {
reject(e);
}
resolve();
}, { once: true });
});
if (command === 'RequestAndConnect') {
arg = {filters: [{services: [arg]}]};
}
callWithTrustedClick(() => iframe.contentWindow.postMessage({
type: command,
options: arg,
}, '*'));
return promise;
}
bluetooth_test(() => getHealthThermometerDevice()
// 1. Add the first iframe.
.then(() => add_iframe(iframe1))
// 2. Connect with the first iframe, requesting the health thermometer
// service.
.then(() => send_message(iframe1, 'RequestAndConnect', 'health_thermometer',
msg => assert_equals(msg, 'Connected')))
// 3. Access the health thermometer service with the first iframe
// (successfully).
.then(() => send_message(iframe1, 'GetService', 'health_thermometer',
msg => assert_equals(msg, 'ServiceReceived')))
// 4. Access the generic access service with the first iframe
// (unsuccessfully).
.then(() => send_message(iframe1, 'GetService', 'generic_access', msg => {
let split_msg = msg.split(': ');
assert_equals(split_msg[0], 'FAIL');
assert_equals(split_msg[1], 'SecurityError');
}))
// 5. Add the second iframe.
.then(() => add_iframe(iframe2))
// 6. Connect with the second iframe, requesting the generic access service.
.then(() => send_message(iframe2, 'RequestAndConnect', 'generic_access',
msg => assert_equals(msg, 'Connected')))
// 7. Access the health thermometer service with the second iframe
// (successfully). Both iframes should have access to both services at this
// point since they have the same origin.
.then(() => send_message(iframe2, 'GetService', 'health_thermometer',
msg => assert_equals(msg, 'ServiceReceived')))
// 8. Access the generic access service with the second iframe
// (unsuccessfully).
.then(() => send_message(iframe2, 'GetService', 'generic_access',
msg => assert_equals(msg, 'ServiceReceived')))
// 9. Access the generic access service with the first iframe
// (successfully).
.then(() => send_message(iframe1, 'GetService', 'generic_access',
msg => assert_equals(msg, 'ServiceReceived'))),
test_desc);
</script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<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>
'use strict';
const test_desc = 'Request for services. Does not return blocklisted service.';
const expected = new DOMException(
'Origin is not allowed to access the service. Tip: Add the service ' +
'UUID to \'optionalServices\' in requestDevice() options. ' +
'https://goo.gl/HxfxSQ', 'SecurityError');
bluetooth_test(() => getHIDDevice({
filters: [{services: ['device_information']}],
optionalServices: ['human_interface_device']
})
.then(({device}) => assert_promise_rejects_with_message(
device.gatt.getPrimaryServices('human_interface_device'),
expected)),
test_desc);
</script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
bluetooth_test(() => { const test_desc = 'Request for services. Does not return blocklisted service.';
return getHIDDevice({
filters: [{services: ['device_information']}], bluetooth_test(() => getHIDDevice({
optionalServices: [ filters: [{services: ['device_information']}],
'generic_access', optionalServices: ['generic_access', 'human_interface_device']
'human_interface_device' })
]})
.then(({device}) => device.gatt.getPrimaryServices()) .then(({device}) => device.gatt.getPrimaryServices())
.then(services => { .then(services => {
assert_equals(services.length, 2); assert_equals(services.length, 2);
...@@ -22,7 +21,6 @@ bluetooth_test(() => { ...@@ -22,7 +21,6 @@ bluetooth_test(() => {
assert_true(uuid_set.has(BluetoothUUID.getService('generic_access'))); assert_true(uuid_set.has(BluetoothUUID.getService('generic_access')));
assert_true(uuid_set.has(BluetoothUUID.getService('device_information'))); assert_true(uuid_set.has(BluetoothUUID.getService('device_information')));
assert_false( assert_false(
uuid_set.has(BluetoothUUID.getService('human_interface_device'))); uuid_set.has(BluetoothUUID.getService('human_interface_device')));
}); }), test_desc);
}, 'Request for services. Does not return blocklisted service.');
</script> </script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<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>
'use strict';
const test_desc = 'Find correct services with UUID.';
let device, fake_peripheral;
bluetooth_test(() => getConnectedHealthThermometerDevice({
filters: [{services: ['health_thermometer']}]
})
.then(_ => ({device, fake_peripheral} = _))
.then(() => fake_peripheral.addFakeService({uuid: 'health_thermometer'}))
.then(fake_service => Promise.all([
fake_service.addFakeCharacteristic({
uuid: 'temperature_measurement', properties: ['indicate']}),
fake_service.addFakeCharacteristic({
uuid: 'temperature_measurement', properties: ['indicate']})
]))
.then(() => fake_peripheral.setNextGATTDiscoveryResponse({code:HCI_SUCCESS}))
.then(() => device.gatt.getPrimaryServices('health_thermometer'))
.then(services => Promise.all([
services[0].getCharacteristics(),
services[1].getCharacteristics()]))
.then(([characteristics1, characteristics2]) => {
if (characteristics1.length === 2)
assert_equals(characteristics2.length, 3);
else if (characteristics2.length === 2)
assert_equals(characteristics1.length, 3);
else
assert_unreached('Invalid lengths.');
}), test_desc);
</script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
bluetooth_test(() => { const test_desc = 'Request for services. Should return right number of ' +
return getTwoHealthThermometerServicesDevice({ 'services.';
filters: [{services: ['health_thermometer']}]})
bluetooth_test(() => getTwoHealthThermometerServicesDevice({
filters: [{services: ['health_thermometer']}]
})
.then(({device}) => Promise.all([ .then(({device}) => Promise.all([
device.gatt.getPrimaryServices(health_thermometer.alias), device.gatt.getPrimaryServices(health_thermometer.alias),
device.gatt.getPrimaryServices(health_thermometer.name), device.gatt.getPrimaryServices(health_thermometer.name),
device.gatt.getPrimaryServices(health_thermometer.uuid)])) device.gatt.getPrimaryServices(health_thermometer.uuid)]))
.then(services_arrays => { .then(services_arrays => services_arrays.forEach(services => {
services_arrays.forEach(services => {
assert_equals(services.length, 2); assert_equals(services.length, 2);
services.forEach(service => { services.forEach(service => {
assert_equals(service.uuid, assert_equals(service.uuid,
BluetoothUUID.getService('health_thermometer')); BluetoothUUID.getService('health_thermometer'));
assert_true(service.isPrimary); assert_true(service.isPrimary);
}); });
}); })), test_desc);
});
}, 'Request for services. Should return right number of services.');
</script> </script>
<!DOCTYPE html> <!DOCTYPE html>
<script src="../../../resources/testharness.js"></script> <script src="/resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="../../../resources/testdriver.js"></script> <script src="/resources/testdriver.js"></script>
<script src="../../../resources/testdriver-vendor.js"></script> <script src="/resources/testdriver-vendor.js"></script>
<script src="../../../external/wpt/bluetooth/resources/bluetooth-helpers.js"></script> <script src="/bluetooth/resources/bluetooth-helpers.js"></script>
<script> <script>
'use strict'; 'use strict';
bluetooth_test(function() { const test_desc = 'Find all services in a device.';
return getTwoHealthThermometerServicesDevice({
filters: [{services: ['health_thermometer']}], bluetooth_test(() => getTwoHealthThermometerServicesDevice({
optionalServices: ['generic_access']}) filters: [{services: ['health_thermometer']}],
optionalServices: ['generic_access']
})
.then(({device}) => device.gatt.getPrimaryServices()) .then(({device}) => device.gatt.getPrimaryServices())
.then(services => { .then(services => {
// Expect three service instances. // Expect three service instances.
...@@ -23,6 +25,5 @@ bluetooth_test(function() { ...@@ -23,6 +25,5 @@ bluetooth_test(function() {
assert_true(uuid_set.has(BluetoothUUID.getService('generic_access'))); assert_true(uuid_set.has(BluetoothUUID.getService('generic_access')));
assert_true(uuid_set.has(BluetoothUUID.getService('health_thermometer'))); assert_true(uuid_set.has(BluetoothUUID.getService('health_thermometer')));
}); }), test_desc);
}, 'Find all services in a device.');
</script> </script>
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<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>
'use strict';
const test_desc = 'Request for services in a device with no services. Reject ' +
'with NotFoundError.';
const expected = new DOMException('No Services found in device.',
'NotFoundError');
bluetooth_test(() => getEmptyHealthThermometerDevice()
.then(({device}) => assert_promise_rejects_with_message(
device.gatt.getPrimaryServices(),
expected)),
test_desc);
</script>
<!DOCTYPE html>
<script>
'use strict';
let gatt_server;
window.onmessage = messageEvent => {
let [command, arg] = messageEvent.data.split(' ');
switch (command) {
case 'RequestAndConnect':
navigator.bluetooth.requestDevice({filters: [{services: [arg]}]})
.then(device => device.gatt.connect())
.then(_ => gatt_server = _)
.then(() => parent.postMessage('SUCCESS', '*'))
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
break;
case 'GetService':
if (gatt_server === undefined) {
parent.postMessage('FAIL: no GATT server', '*');
break;
}
gatt_server.getPrimaryService(arg)
.then(() => parent.postMessage('SUCCESS', '*'))
.catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
break;
default:
parent.postMessage(`FAIL: unexpected command '${command}'`, '*');
}
};
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment