mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 06:11:37 +00:00
169 lines
5.7 KiB
JavaScript
169 lines
5.7 KiB
JavaScript
var CameraTest = (function() {
|
|
'use strict';
|
|
|
|
/**
|
|
* 'camera.control.test.enabled' is queried in Gecko to enable different
|
|
* test modes in the camera stack. The only currently-supported setting
|
|
* is 'hardware', which wraps the Gonk camera abstraction class in a
|
|
* shim class that supports injecting hardware camera API failures into
|
|
* the execution path.
|
|
*
|
|
* The affected API is specified by the 'camera.control.test.hardware'
|
|
* pref. Currently supported values should be determined by inspecting
|
|
* TestGonkCameraHardware.cpp.
|
|
*
|
|
* Some API calls are simple: e.g. 'start-recording-failure' will cause
|
|
* the DOM-facing startRecording() call to fail. More complex tests like
|
|
* 'take-picture-failure' will cause the takePicture() API to fail, while
|
|
* 'take-picture-process-failure' will simulate a failure of the
|
|
* asynchronous picture-taking process, even if the initial API call
|
|
* path seems to have succeeded.
|
|
*
|
|
* If 'camera.control.test.hardware.gonk.parameters' is set, it will cause
|
|
* the contents of that string to be appended to the string of parameters
|
|
* pulled from the Gonk camera library. This allows tests to inject fake
|
|
* settings/capabilities for features not supported by the emulator. These
|
|
* parameters are one or more semicolon-delimited key=value pairs, e.g. to
|
|
* pretend the emulator supports zoom:
|
|
*
|
|
* zoom-ratios=100,150,200,300,400;max-zoom=4
|
|
*
|
|
* This means (of course) that neither the key not the value tokens can
|
|
* contain either equals signs or semicolons. The test shim doesn't enforce
|
|
* this so that we can test getting junk from the camera library as well.
|
|
*/
|
|
const PREF_TEST_ENABLED = "camera.control.test.enabled";
|
|
const PREF_TEST_HARDWARE = "camera.control.test.hardware";
|
|
const PREF_TEST_EXTRA_PARAMETERS = "camera.control.test.hardware.gonk.parameters";
|
|
const PREF_TEST_FAKE_LOW_MEMORY = "camera.control.test.is_low_memory";
|
|
var oldTestEnabled;
|
|
var oldTestHw;
|
|
var testMode;
|
|
|
|
function testHardwareSetFakeParameters(parameters, callback) {
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_EXTRA_PARAMETERS, parameters]]}, function() {
|
|
var setParams = SpecialPowers.getCharPref(PREF_TEST_EXTRA_PARAMETERS);
|
|
ise(setParams, parameters, "Extra test parameters '" + setParams + "'");
|
|
if (callback) {
|
|
callback(setParams);
|
|
}
|
|
});
|
|
}
|
|
|
|
function testHardwareClearFakeParameters(callback) {
|
|
SpecialPowers.pushPrefEnv({'clear': [[PREF_TEST_EXTRA_PARAMETERS]]}, callback);
|
|
}
|
|
|
|
function testHardwareSetFakeLowMemoryPlatform(callback) {
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_FAKE_LOW_MEMORY, true]]}, function() {
|
|
var setParams = SpecialPowers.getBoolPref(PREF_TEST_FAKE_LOW_MEMORY);
|
|
ise(setParams, true, "Fake low memory platform");
|
|
if (callback) {
|
|
callback(setParams);
|
|
}
|
|
});
|
|
}
|
|
|
|
function testHardwareClearFakeLowMemoryPlatform(callback) {
|
|
SpecialPowers.pushPrefEnv({'clear': [[PREF_TEST_FAKE_LOW_MEMORY]]}, callback);
|
|
}
|
|
|
|
function testHardwareSet(test, callback) {
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_HARDWARE, test]]}, function() {
|
|
var setTest = SpecialPowers.getCharPref(PREF_TEST_HARDWARE);
|
|
ise(setTest, test, "Test subtype set to " + setTest);
|
|
if (callback) {
|
|
callback(setTest);
|
|
}
|
|
});
|
|
}
|
|
|
|
function testHardwareDone(callback) {
|
|
testMode = null;
|
|
if (oldTestHw) {
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_HARDWARE, oldTestHw]]}, callback);
|
|
} else {
|
|
SpecialPowers.pushPrefEnv({'clear': [[PREF_TEST_HARDWARE]]}, callback);
|
|
}
|
|
}
|
|
|
|
function testBegin(mode, callback) {
|
|
SimpleTest.waitForExplicitFinish();
|
|
try {
|
|
oldTestEnabled = SpecialPowers.getCharPref(PREF_TEST_ENABLED);
|
|
} catch(e) { }
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_ENABLED, mode]]}, function() {
|
|
var setMode = SpecialPowers.getCharPref(PREF_TEST_ENABLED);
|
|
ise(setMode, mode, "Test mode set to " + setMode);
|
|
if (setMode === "hardware") {
|
|
try {
|
|
oldTestHw = SpecialPowers.getCharPref(PREF_TEST_HARDWARE);
|
|
} catch(e) { }
|
|
testMode = {
|
|
set: testHardwareSet,
|
|
setFakeParameters: testHardwareSetFakeParameters,
|
|
clearFakeParameters: testHardwareClearFakeParameters,
|
|
setFakeLowMemoryPlatform: testHardwareSetFakeLowMemoryPlatform,
|
|
clearFakeLowMemoryPlatform: testHardwareClearFakeLowMemoryPlatform,
|
|
done: testHardwareDone
|
|
};
|
|
if (callback) {
|
|
callback(testMode);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function testEnd(callback) {
|
|
// A chain of clean-up functions....
|
|
function allCleanedUp() {
|
|
SimpleTest.finish();
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
}
|
|
function cleanUpTestEnabled() {
|
|
var next = allCleanedUp;
|
|
if (oldTestEnabled) {
|
|
SpecialPowers.pushPrefEnv({'set': [[PREF_TEST_ENABLED, oldTestEnabled]]}, next);
|
|
} else {
|
|
SpecialPowers.pushPrefEnv({'clear': [[PREF_TEST_ENABLED]]}, next);
|
|
}
|
|
}
|
|
function cleanUpTest() {
|
|
var next = cleanUpTestEnabled;
|
|
if (testMode) {
|
|
testMode.done(next);
|
|
testMode = null;
|
|
} else {
|
|
next();
|
|
}
|
|
}
|
|
function cleanUpLowMemoryPlatform() {
|
|
var next = cleanUpTest;
|
|
if (testMode) {
|
|
testMode.clearFakeLowMemoryPlatform(next);
|
|
} else {
|
|
next();
|
|
}
|
|
}
|
|
function cleanUpExtraParameters() {
|
|
var next = cleanUpLowMemoryPlatform;
|
|
if (testMode) {
|
|
testMode.clearFakeParameters(next);
|
|
} else {
|
|
next();
|
|
}
|
|
}
|
|
|
|
cleanUpExtraParameters();
|
|
}
|
|
|
|
ise(SpecialPowers.sanityCheck(), "foo", "SpecialPowers passed sanity check");
|
|
return {
|
|
begin: testBegin,
|
|
end: testEnd
|
|
};
|
|
|
|
})();
|