From ce3a6d74e2c67482afd194066a1283241fec56a1 Mon Sep 17 00:00:00 2001 From: Jamin Liu Date: Wed, 2 Apr 2014 08:51:46 -0400 Subject: [PATCH] Bug 860698 - B2G Bluetooth: Add a test case for discover remote device through BluetoothAdapter. r=vyang, r=echou --- dom/bluetooth/tests/marionette/head.js | 132 +++++++++++++++++++++ dom/bluetooth/tests/marionette/manifest.ini | 1 + .../test_dom_BluetoothAdapter_discovery.js | 47 ++++++++ 3 files changed, 180 insertions(+) create mode 100644 dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_discovery.js diff --git a/dom/bluetooth/tests/marionette/head.js b/dom/bluetooth/tests/marionette/head.js index f479922e8834..ae3a46fb1d34 100644 --- a/dom/bluetooth/tests/marionette/head.js +++ b/dom/bluetooth/tests/marionette/head.js @@ -35,6 +35,9 @@ const BDADDR_ANY = "00:00:00:00:00:00"; const BDADDR_ALL = "ff:ff:ff:ff:ff:ff"; const BDADDR_LOCAL = "ff:ff:ff:00:00:00"; +// A user friendly name for remote BT device. +const REMOTE_DEVICE_NAME = "Remote BT Device"; + let Promise = SpecialPowers.Cu.import("resource://gre/modules/Promise.jsm").Promise; @@ -78,6 +81,70 @@ function runEmulatorCmdSafe(aCommand) { } /** + * Add a Bluetooth remote device to scatternet and set its properties. + * + * Use QEMU command 'bt remote add' to add a virtual Bluetooth remote + * and set its properties by setEmulatorDeviceProperty(). + * + * Fulfill params: + * result -- bluetooth address of the remote device. + * Reject params: (none) + * + * @param aProperies + * A javascript object with zero or several properties for initializing + * the remote device. By now, the properies could be 'name' or + * 'discoverable'. It valid to put a null object or a javascript object + * which don't have any properies. + * + * @return A promise object. + */ +function addEmulatorRemoteDevice(aProperties) { + let address; + let promise = runEmulatorCmdSafe("bt remote add") + .then(function(aResults) { + address = aResults[0].toUpperCase(); + }); + + for (let key in aProperties) { + let value = aProperties[key]; + let propertyName = key; + promise = promise.then(function() { + return setEmulatorDeviceProperty(address, propertyName, value); + }); + } + + return promise.then(function() { + return address; + }); +} + +/** + * Remove Bluetooth remote devices in scatternet. + * + * Use QEMU command 'bt remote remove ' to remove a specific virtual + * Bluetooth remote device in scatternet or remove them all by QEMU command + * 'bt remote remove BDADDR_ALL'. + * + * @param aAddress + * The string of Bluetooth address with format xx:xx:xx:xx:xx:xx. + * + * Fulfill params: + * result -- an array of emulator response lines. + * Reject params: (none) + * + * @return A promise object. + */ +function removeEmulatorRemoteDevice(aAddress) { + let cmd = "bt remote remove " + aAddress; + return runEmulatorCmdSafe(cmd) + .then(function(aResults) { + // 'bt remote remove ' returns a list of removed device one at a line. + // The last item is "OK". + return aResults.slice(0, -1); + }); +} + +/** * Set a property for a Bluetooth device. * * Use QEMU command 'bt property ' to set property. @@ -127,6 +194,71 @@ function getEmulatorDeviceProperty(aAddress, aPropertyName) { } /** + * Start dicovering Bluetooth devices. + * + * Allows the device's adapter to start seeking for remote devices. + * + * Fulfill params: (none) + * Reject params: a DOMError + * + * @param aAdapter + * A BluetoothAdapter which is used to interact with local BT dev + * + * @return A deferred promise. + */ +function startDiscovery(aAdapter) { + let deferred = Promise.defer(); + + let request = aAdapter.startDiscovery(); + request.onsuccess = function () { + log(" Start discovery - Success"); + // TODO (bug 892207): Make Bluetooth APIs available for 3rd party apps. + // Currently, discovering state wouldn't change immediately here. + // We would turn on this check when the redesigned API are landed. + // is(aAdapter.discovering, true, "BluetoothAdapter.discovering"); + deferred.resolve(); + } + request.onerror = function (aEvent) { + ok(false, "Start discovery - Fail"); + deferred.reject(aEvent.target.error); + } + + return deferred.promise; +} + +/** + * Stop dicovering Bluetooth devices. + * + * Allows the device's adapter to stop seeking for remote devices. + * + * Fulfill params: (none) + * Reject params: a DOMError + * + * @param aAdapter + * A BluetoothAdapter which is used to interact with local BT device. + * + * @return A deferred promise. + */ +function stopDiscovery(aAdapter) { + let deferred = Promise.defer(); + + let request = aAdapter.stopDiscovery(); + request.onsuccess = function () { + log(" Stop discovery - Success"); + // TODO (bug 892207): Make Bluetooth APIs available for 3rd party apps. + // Currently, discovering state wouldn't change immediately here. + // We would turn on this check when the redesigned API are landed. + // is(aAdapter.discovering, false, "BluetoothAdapter.discovering"); + deferred.resolve(); + } + request.onerror = function (aEvent) { + ok(false, "Stop discovery - Fail"); + deferred.reject(aEvent.target.error); + } + return deferred.promise; +} + +/** * Get mozSettings value specified by @aKey. * * Resolve if that mozSettings value is retrieved successfully, reject diff --git a/dom/bluetooth/tests/marionette/manifest.ini b/dom/bluetooth/tests/marionette/manifest.ini index eeb53be998bf..64819b7b9ce0 100644 --- a/dom/bluetooth/tests/marionette/manifest.ini +++ b/dom/bluetooth/tests/marionette/manifest.ini @@ -7,3 +7,4 @@ qemu = true [test_dom_BluetoothManager_adapteradded.js] [test_dom_BluetoothAdapter_setters.js] [test_dom_BluetoothAdapter_getters.js] +[test_dom_BluetoothAdapter_discovery.js] diff --git a/dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_discovery.js b/dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_discovery.js new file mode 100644 index 000000000000..97ef81eb8e14 --- /dev/null +++ b/dom/bluetooth/tests/marionette/test_dom_BluetoothAdapter_discovery.js @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: sw=2 ts=2 sts=2 et filetype=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 that discovery process of BluetoothAdapter is correct. +// Use B2G emulator commands to add/remote remote devices to simulate +// discovering behavior. +// +// Test Coverage: +// - BluetoothAdapter.startDiscovery() +// - BluetoothAdapter.stopDiscovery() +// - BluetoothAdapter.ondevicefound() +// - BluetoothAdapter.discovering [Temporarily turned off until BT API update] +// +/////////////////////////////////////////////////////////////////////////////// + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = 'head.js'; + +startBluetoothTest(true, function testCaseMain(aAdapter) { + log("Testing the discovery process of BluetoothAdapter ..."); + + // The properties of remote device. + let theProperties = { + "name": REMOTE_DEVICE_NAME, + "discoverable": true + }; + + return Promise.resolve() + .then(() => removeEmulatorRemoteDevice(BDADDR_ALL)) + .then(() => addEmulatorRemoteDevice(/*theProperties*/ null)) + .then(function(aRemoteAddress) { + let promises = []; + promises.push(waitForAdapterEvent(aAdapter, "devicefound")); + promises.push(startDiscovery(aAdapter)); + return Promise.all(promises) + .then(function(aResults) { + is(aResults[0].device.address, aRemoteAddress, "BluetoothDevice.address"); + }); + }) + .then(() => stopDiscovery(aAdapter)) + .then(() => removeEmulatorRemoteDevice(BDADDR_ALL)); +}); -- 2.11.4.GIT