gecko/dom/bluetooth2/tests/marionette/test_dom_BluetoothAdapter_discovery_API2.js

125 lines
4.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
///////////////////////////////////////////////////////////////////////////////
// Test Purpose:
// To verify the discovery process of BluetoothAdapter.
// Testers have to put the B2G devices in an environment which is surrounded
// by N discoverable remote devices. To pass this test, the number N has to be
// greater or equals than EXPECTED_NUMBER_OF_REMOTE_DEVICES.
//
// Test Procedure:
// [0] Set Bluetooth permission and enable default adapter.
// [1] Start discovery and verify the correctness.
// [2] Attach event handler for 'ondevicefound'.
// [3] Stop discovery and verify the correctness.
// [4] Mark the BluetoothDiscoveryHandle from [1] as expired.
// [5] Start discovery and verify the correctness.
// [6] Wait for 'devicefound' events.
// [7] Stop discovery and verify the correctness.
// [8] Call 'startDiscovery' twice continuously.
// [9] Call 'stopDiscovery' twice continuously.
// [10] Clean up the event handler of [2].
//
// Test Coverage:
// - BluetoothAdapter.discovering
// - BluetoothAdapter.startDiscovery()
// - BluetoothAdapter.stopDiscovery()
// - BluetoothAdapter.onattributechanged()
// - BluetoothDiscoveryHandle.ondevicefound()
//
///////////////////////////////////////////////////////////////////////////////
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
const EXPECTED_NUMBER_OF_REMOTE_DEVICES = 2;
startBluetoothTest(true, function testCaseMain(aAdapter) {
log("Checking adapter attributes ...");
is(aAdapter.state, "enabled", "adapter.state");
isnot(aAdapter.address, "", "adapter.address");
// Since adapter has just been re-enabled, these properties should be 'false'.
is(aAdapter.discovering, false, "adapter.discovering");
is(aAdapter.discoverable, false, "adapter.discoverable");
log("adapter.address: " + aAdapter.address);
log("adapter.name: " + aAdapter.name);
let discoveryHandle = null;
return Promise.resolve()
.then(function() {
log("[1] Start discovery and verify the correctness ... ");
let promises = [];
promises.push(waitForAdapterAttributeChanged(aAdapter, "discovering", true));
promises.push(aAdapter.startDiscovery());
return Promise.all(promises);
})
.then(function(aResults) {
log("[2] Attach event handler for 'ondevicefound' ... ");
discoveryHandle = aResults[1];
isHandleExpired = false;
discoveryHandle.ondevicefound = function onDeviceFound(aEvent) {
if (isHandleExpired) {
ok(false, "Expired BluetoothDiscoveryHandle received an event.");
}
};
})
.then(function() {
log("[3] Stop discovery and and verify the correctness ... ");
let promises = [];
if (aAdapter.discovering) {
promises.push(waitForAdapterAttributeChanged(aAdapter, "discovering", false));
}
promises.push(aAdapter.stopDiscovery());
return Promise.all(promises);
})
.then(function() {
log("[4] Mark the BluetoothDiscoveryHandle from [1] as expired ... ");
isHandleExpired = true;
})
.then(function() {
log("[5] Start discovery and verify the correctness ... ");
let promises = [];
promises.push(waitForAdapterAttributeChanged(aAdapter, "discovering", true));
promises.push(aAdapter.startDiscovery());
return Promise.all(promises);
})
.then(function(aResults) {
log("[6] Wait for 'devicefound' events ... ");
return waitForDevicesFound(aResults[1], EXPECTED_NUMBER_OF_REMOTE_DEVICES);
})
.then(function() {
log("[7] Stop discovery and and verify the correctness ... ");
let promises = [];
if (aAdapter.discovering) {
promises.push(waitForAdapterAttributeChanged(aAdapter, "discovering", false));
}
promises.push(aAdapter.stopDiscovery());
return Promise.all(promises);
})
.then(function() {
log("[8] Call 'startDiscovery' twice continuously ... ");
return aAdapter.startDiscovery()
.then(() => aAdapter.startDiscovery())
.then(() => ok(false, "Call startDiscovery() when adapter is discovering. - Fail"),
() => ok(true, "Call startDiscovery() when adapter is discovering. - Success"));
})
.then(function() {
log("[9] Call 'stopDiscovery' twice continuously ... ");
return aAdapter.stopDiscovery()
.then(() => aAdapter.stopDiscovery())
.then(() => ok(true, "Call stopDiscovery() when adapter isn't discovering. - Success"),
() => ok(false, "Call stopDiscovery() when adapter isn't discovering. - Fail"));
})
.then(function() {
log("[10] Clean up the event handler of [2] ... ");
if (discoveryHandle) {
discoveryHandle.ondevicefound = null;
}
});
});