diff options
Diffstat (limited to 'dom/events/test/marionette')
-rw-r--r-- | dom/events/test/marionette/head.js | 142 | ||||
-rw-r--r-- | dom/events/test/marionette/manifest.ini | 4 | ||||
-rw-r--r-- | dom/events/test/marionette/test_sensor_orientation.js | 53 |
3 files changed, 199 insertions, 0 deletions
diff --git a/dom/events/test/marionette/head.js b/dom/events/test/marionette/head.js new file mode 100644 index 000000000..c2357f898 --- /dev/null +++ b/dom/events/test/marionette/head.js @@ -0,0 +1,142 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +const {Cc: Cc, Ci: Ci, Cr: Cr, Cu: Cu} = SpecialPowers; + +var Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise; + +var _pendingEmulatorCmdCount = 0; + +/** + * Send emulator command with safe guard. + * + * We should only call |finish()| after all emulator command transactions + * end, so here comes with the pending counter. Resolve when the emulator + * gives positive response, and reject otherwise. + * + * Fulfill params: + * result -- an array of emulator response lines. + * Reject params: + * result -- an array of emulator response lines. + * + * @return A deferred promise. + */ +function runEmulatorCmdSafe(aCommand) { + let deferred = Promise.defer(); + + ++_pendingEmulatorCmdCount; + runEmulatorCmd(aCommand, function(aResult) { + --_pendingEmulatorCmdCount; + + ok(true, "Emulator response: " + JSON.stringify(aResult)); + if (Array.isArray(aResult) && + aResult[aResult.length - 1] === "OK") { + deferred.resolve(aResult); + } else { + deferred.reject(aResult); + } + }); + + return deferred.promise; +} + +/** + * Get emulator sensor values of a named sensor. + * + * Fulfill params: + * result -- an array of emulator sensor values. + * Reject params: (none) + * + * @param aSensorName + * A string name of the sensor. Availables are: "acceleration" + * "magnetic-field", "orientation", "temperature", "proximity". + * + * @return A deferred promise. + */ +function getEmulatorSensorValues(aSensorName) { + return runEmulatorCmdSafe("sensor get " + aSensorName) + .then(function(aResult) { + // aResult = ["orientation = 0:0:0", "OK"] + return aResult[0].split(" ")[2].split(":").map(function(aElement) { + return parseInt(aElement, 10); + }); + }); +} + +/** + * Convenient alias function for getting orientation sensor values. + */ +function getEmulatorOrientationValues() { + return getEmulatorSensorValues("orientation"); +} + +/** + * Set emulator orientation sensor values. + * + * Fulfill params: (none) + * Reject params: (none) + * + * @param aAzimuth + * @param aPitch + * @param aRoll + * + * @return A deferred promise. + */ +function setEmulatorOrientationValues(aAzimuth, aPitch, aRoll) { + let cmd = "sensor set orientation " + aAzimuth + ":" + aPitch + ":" + aRoll; + return runEmulatorCmdSafe(cmd); +} + +/** + * Wait for a named window event. + * + * Resolve if that named event occurs. Never reject. + * + * Forfill params: the DOMEvent passed. + * + * @param aEventName + * A string event name. + * + * @return A deferred promise. + */ +function waitForWindowEvent(aEventName) { + let deferred = Promise.defer(); + + window.addEventListener(aEventName, function onevent(aEvent) { + window.removeEventListener(aEventName, onevent); + + ok(true, "Window event '" + aEventName + "' got."); + deferred.resolve(aEvent); + }); + + return deferred.promise; +} + +/** + * Wait for pending emulator transactions and call |finish()|. + */ +function cleanUp() { + // Use ok here so that we have at least one test run. + ok(true, ":: CLEANING UP ::"); + + waitFor(finish, function() { + return _pendingEmulatorCmdCount === 0; + }); +} + +/** + * Basic test routine helper. + * + * This helper does nothing but clean-ups. + * + * @param aTestCaseMain + * A function that takes no parameter. + */ +function startTestBase(aTestCaseMain) { + Promise.resolve() + .then(aTestCaseMain) + .then(cleanUp, function() { + ok(false, 'promise rejects during test.'); + cleanUp(); + }); +} diff --git a/dom/events/test/marionette/manifest.ini b/dom/events/test/marionette/manifest.ini new file mode 100644 index 000000000..b0ec98d99 --- /dev/null +++ b/dom/events/test/marionette/manifest.ini @@ -0,0 +1,4 @@ +[DEFAULT] +run-if = buildapp == 'b2g' + +[test_sensor_orientation.js] diff --git a/dom/events/test/marionette/test_sensor_orientation.js b/dom/events/test/marionette/test_sensor_orientation.js new file mode 100644 index 000000000..70df0ccd3 --- /dev/null +++ b/dom/events/test/marionette/test_sensor_orientation.js @@ -0,0 +1,53 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 120000; +MARIONETTE_HEAD_JS = 'head.js'; + +function doTest(aAzimuth, aPitch, aRoll) { + log("Testing [azimuth, pitch, roll] = " + Array.slice(arguments)); + + return setEmulatorOrientationValues(aAzimuth, aPitch, aRoll) + .then(() => waitForWindowEvent("deviceorientation")) + .then(function(aEvent) { + is(aEvent.alpha, aAzimuth, "azimuth"); + is(aEvent.beta, aPitch, "pitch"); + is(aEvent.gamma, aRoll, "roll"); + }); +} + +function testAllPermutations() { + const angles = [-180, -90, 0, 90, 180]; + let promise = Promise.resolve(); + for (let i = 0; i < angles.length; i++) { + for (let j = 0; j < angles.length; j++) { + for (let k = 0; k < angles.length; k++) { + promise = + promise.then(doTest.bind(null, angles[i], angles[j], angles[k])); + } + } + } + return promise; +} + +startTestBase(function() { + let origValues; + + return Promise.resolve() + + // Retrieve original status. + .then(() => getEmulatorOrientationValues()) + .then(function(aValues) { + origValues = aValues; + is(typeof origValues, "object", "typeof origValues"); + is(origValues.length, 3, "origValues.length"); + }) + + // Test original status + .then(() => doTest.apply(null, origValues)) + + .then(testAllPermutations) + + // Restore original status. + .then(() => setEmulatorOrientationValues.apply(null, origValues)); +}); |