зеркало из https://github.com/mozilla/pjs.git
Bug 602871 - XPCShell test harness should ignore system idle time while running tests, r=ted a=tests-only
This commit is contained in:
Родитель
31388ae51b
Коммит
08adb4f504
|
@ -0,0 +1,23 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*/
|
||||||
|
|
||||||
|
function run_test() {
|
||||||
|
print("Init the fake idle service and check its identity.");
|
||||||
|
let fakeIdleService = Components.classes["@mozilla.org/widget/idleservice;1"].
|
||||||
|
getService(Components.interfaces.nsIIdleService);
|
||||||
|
try {
|
||||||
|
fakeIdleService.QueryInterface(Components.interfaces.nsIFactory);
|
||||||
|
} catch (ex) {
|
||||||
|
do_throw("The fake idle service implements nsIFactory.");
|
||||||
|
}
|
||||||
|
// We need at least one PASS, thus sanity check the idle time.
|
||||||
|
do_check_eq(fakeIdleService.idleTime, 0);
|
||||||
|
|
||||||
|
print("Init the real idle service and check its identity.");
|
||||||
|
let realIdleService = do_get_idle();
|
||||||
|
try {
|
||||||
|
realIdleService.QueryInterface(Components.interfaces.nsIFactory);
|
||||||
|
do_throw("The real idle service does not implement nsIFactory.");
|
||||||
|
} catch (ex) {}
|
||||||
|
}
|
|
@ -182,6 +182,102 @@ function _dump_exception_stack(stack) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides idleService with a mock. Idle is commonly used for maintenance
|
||||||
|
* tasks, thus if a test uses a service that requires the idle service, it will
|
||||||
|
* start handling them.
|
||||||
|
* This behaviour would cause random failures and slowdown tests execution,
|
||||||
|
* for example by running database vacuum or cleanups for each test.
|
||||||
|
*
|
||||||
|
* @note Idle service is overridden by default. If a test requires it, it will
|
||||||
|
* have to call do_get_idle() function at least once before use.
|
||||||
|
*/
|
||||||
|
_fakeIdleService = {
|
||||||
|
get registrar() {
|
||||||
|
delete this.registrar;
|
||||||
|
return this.registrar =
|
||||||
|
Components.manager.QueryInterface(Components.interfaces.nsIComponentRegistrar);
|
||||||
|
},
|
||||||
|
contractID: "@mozilla.org/widget/idleservice;1",
|
||||||
|
get CID() this.registrar.contractIDToCID(this.contractID),
|
||||||
|
|
||||||
|
activate: function FIS_activate()
|
||||||
|
{
|
||||||
|
if (!this.originalFactory) {
|
||||||
|
// Save original factory.
|
||||||
|
this.originalFactory =
|
||||||
|
Components.manager.getClassObject(Components.classes[this.contractID],
|
||||||
|
Components.interfaces.nsIFactory);
|
||||||
|
// Unregister original factory.
|
||||||
|
this.registrar.unregisterFactory(this.CID, this.originalFactory);
|
||||||
|
// Replace with the mock.
|
||||||
|
this.registrar.registerFactory(this.CID, "Fake Idle Service",
|
||||||
|
this.contractID, this.factory
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
deactivate: function FIS_deactivate()
|
||||||
|
{
|
||||||
|
if (this.originalFactory) {
|
||||||
|
// Unregister the mock.
|
||||||
|
this.registrar.unregisterFactory(this.CID, this.factory);
|
||||||
|
// Restore original factory.
|
||||||
|
this.registrar.registerFactory(this.CID, "Idle Service",
|
||||||
|
this.contractID, this.originalFactory);
|
||||||
|
delete this.originalFactory;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
factory: {
|
||||||
|
// nsIFactory
|
||||||
|
createInstance: function (aOuter, aIID)
|
||||||
|
{
|
||||||
|
if (aOuter) {
|
||||||
|
throw Components.results.NS_ERROR_NO_AGGREGATION;
|
||||||
|
}
|
||||||
|
return _fakeIdleService.QueryInterface(aIID);
|
||||||
|
},
|
||||||
|
lockFactory: function (aLock) {
|
||||||
|
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
},
|
||||||
|
QueryInterface: function(aIID) {
|
||||||
|
if (aIID.equals(Components.interfaces.nsIFactory) ||
|
||||||
|
aIID.equals(Components.interfaces.nsISupports)) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// nsIIdleService
|
||||||
|
get idleTime() 0,
|
||||||
|
addIdleObserver: function () {},
|
||||||
|
removeIdleObserver: function () {},
|
||||||
|
|
||||||
|
QueryInterface: function(aIID) {
|
||||||
|
// Useful for testing purposes, see test_get_idle.js.
|
||||||
|
if (aIID.equals(Components.interfaces.nsIFactory)) {
|
||||||
|
return this.factory;
|
||||||
|
}
|
||||||
|
if (aIID.equals(Components.interfaces.nsIIdleService) ||
|
||||||
|
aIID.equals(Components.interfaces.nsISupports)) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restores the idle service factory if needed and returns the service's handle.
|
||||||
|
* @return A handle to the idle service.
|
||||||
|
*/
|
||||||
|
function do_get_idle() {
|
||||||
|
_fakeIdleService.deactivate();
|
||||||
|
return Components.classes[_fakeIdleService.contractID]
|
||||||
|
.getService(Components.interfaces.nsIIdleService);
|
||||||
|
}
|
||||||
|
|
||||||
function _execute_test() {
|
function _execute_test() {
|
||||||
// Map resource://test/ to the current working directory.
|
// Map resource://test/ to the current working directory.
|
||||||
let (ios = Components.classes["@mozilla.org/network/io-service;1"]
|
let (ios = Components.classes["@mozilla.org/network/io-service;1"]
|
||||||
|
@ -193,6 +289,10 @@ function _execute_test() {
|
||||||
protocolHandler.setSubstitution("test", curDirURI);
|
protocolHandler.setSubstitution("test", curDirURI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Override idle service by default.
|
||||||
|
// Call do_get_idle() to restore the factory and get the service.
|
||||||
|
_fakeIdleService.activate();
|
||||||
|
|
||||||
// _HEAD_FILES is dynamically defined by <runxpcshelltests.py>.
|
// _HEAD_FILES is dynamically defined by <runxpcshelltests.py>.
|
||||||
_load_files(_HEAD_FILES);
|
_load_files(_HEAD_FILES);
|
||||||
// _TEST_FILE is dynamically defined by <runxpcshelltests.py>.
|
// _TEST_FILE is dynamically defined by <runxpcshelltests.py>.
|
||||||
|
@ -230,6 +330,9 @@ function _execute_test() {
|
||||||
while ((func = _cleanupFunctions.pop()))
|
while ((func = _cleanupFunctions.pop()))
|
||||||
func();
|
func();
|
||||||
|
|
||||||
|
// Restore idle service to avoid leaks.
|
||||||
|
_fakeIdleService.deactivate();
|
||||||
|
|
||||||
if (!_passed)
|
if (!_passed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче