232 lines
6.9 KiB
JavaScript
232 lines
6.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
const { Service } = ChromeUtils.importESModule(
|
|
"resource://services-sync/service.sys.mjs"
|
|
);
|
|
|
|
function PetrolEngine() {}
|
|
PetrolEngine.prototype.name = "petrol";
|
|
PetrolEngine.prototype.finalize = async function () {};
|
|
|
|
function DieselEngine() {}
|
|
DieselEngine.prototype.name = "diesel";
|
|
DieselEngine.prototype.finalize = async function () {};
|
|
|
|
function DummyEngine() {}
|
|
DummyEngine.prototype.name = "dummy";
|
|
DummyEngine.prototype.finalize = async function () {};
|
|
|
|
class ActualEngine extends SyncEngine {
|
|
constructor(service) {
|
|
super("Actual", service);
|
|
}
|
|
}
|
|
|
|
add_task(async function test_basics() {
|
|
_("We start out with a clean slate");
|
|
|
|
let manager = new EngineManager(Service);
|
|
|
|
let engines = await manager.getAll();
|
|
Assert.equal(engines.length, 0);
|
|
Assert.equal(await manager.get("dummy"), undefined);
|
|
|
|
_("Register an engine");
|
|
await manager.register(DummyEngine);
|
|
let dummy = await manager.get("dummy");
|
|
Assert.ok(dummy instanceof DummyEngine);
|
|
|
|
engines = await manager.getAll();
|
|
Assert.equal(engines.length, 1);
|
|
Assert.equal(engines[0], dummy);
|
|
|
|
_("Register an already registered engine is ignored");
|
|
await manager.register(DummyEngine);
|
|
Assert.equal(await manager.get("dummy"), dummy);
|
|
|
|
_("Register multiple engines in one go");
|
|
await manager.register([PetrolEngine, DieselEngine]);
|
|
let petrol = await manager.get("petrol");
|
|
let diesel = await manager.get("diesel");
|
|
Assert.ok(petrol instanceof PetrolEngine);
|
|
Assert.ok(diesel instanceof DieselEngine);
|
|
|
|
engines = await manager.getAll();
|
|
Assert.equal(engines.length, 3);
|
|
Assert.notEqual(engines.indexOf(petrol), -1);
|
|
Assert.notEqual(engines.indexOf(diesel), -1);
|
|
|
|
_("Retrieve multiple engines in one go");
|
|
engines = await manager.get(["dummy", "diesel"]);
|
|
Assert.equal(engines.length, 2);
|
|
Assert.notEqual(engines.indexOf(dummy), -1);
|
|
Assert.notEqual(engines.indexOf(diesel), -1);
|
|
|
|
_("getEnabled() only returns enabled engines");
|
|
engines = await manager.getEnabled();
|
|
Assert.equal(engines.length, 0);
|
|
|
|
petrol.enabled = true;
|
|
engines = await manager.getEnabled();
|
|
Assert.equal(engines.length, 1);
|
|
Assert.equal(engines[0], petrol);
|
|
|
|
dummy.enabled = true;
|
|
diesel.enabled = true;
|
|
engines = await manager.getEnabled();
|
|
Assert.equal(engines.length, 3);
|
|
|
|
_("getEnabled() returns enabled engines in sorted order");
|
|
petrol.syncPriority = 1;
|
|
dummy.syncPriority = 2;
|
|
diesel.syncPriority = 3;
|
|
|
|
engines = await manager.getEnabled();
|
|
|
|
Assert.deepEqual(engines, [petrol, dummy, diesel]);
|
|
|
|
_("Changing the priorities should change the order in getEnabled()");
|
|
|
|
dummy.syncPriority = 4;
|
|
|
|
engines = await manager.getEnabled();
|
|
|
|
Assert.deepEqual(engines, [petrol, diesel, dummy]);
|
|
|
|
_("Unregister an engine by name");
|
|
await manager.unregister("dummy");
|
|
Assert.equal(await manager.get("dummy"), undefined);
|
|
engines = await manager.getAll();
|
|
Assert.equal(engines.length, 2);
|
|
Assert.equal(engines.indexOf(dummy), -1);
|
|
|
|
_("Unregister an engine by value");
|
|
// manager.unregister() checks for instanceof Engine, so let's make one:
|
|
await manager.register(ActualEngine);
|
|
let actual = await manager.get("actual");
|
|
Assert.ok(actual instanceof ActualEngine);
|
|
Assert.ok(actual instanceof SyncEngine);
|
|
|
|
await manager.unregister(actual);
|
|
Assert.equal(await manager.get("actual"), undefined);
|
|
});
|
|
|
|
class AutoEngine {
|
|
constructor(type) {
|
|
this.name = "automobile";
|
|
this.type = type;
|
|
this.initializeCalled = false;
|
|
this.finalizeCalled = false;
|
|
this.isActive = false;
|
|
}
|
|
|
|
async initialize() {
|
|
Assert.ok(!this.initializeCalled);
|
|
Assert.equal(AutoEngine.current, undefined);
|
|
this.initializeCalled = true;
|
|
this.isActive = true;
|
|
AutoEngine.current = this;
|
|
}
|
|
|
|
async finalize() {
|
|
Assert.equal(AutoEngine.current, this);
|
|
Assert.ok(!this.finalizeCalled);
|
|
Assert.ok(this.isActive);
|
|
this.finalizeCalled = true;
|
|
this.isActive = false;
|
|
AutoEngine.current = undefined;
|
|
}
|
|
}
|
|
|
|
class GasolineEngine extends AutoEngine {
|
|
constructor() {
|
|
super("gasoline");
|
|
}
|
|
}
|
|
|
|
class ElectricEngine extends AutoEngine {
|
|
constructor() {
|
|
super("electric");
|
|
}
|
|
}
|
|
|
|
add_task(async function test_alternates() {
|
|
let manager = new EngineManager(Service);
|
|
let engines = await manager.getAll();
|
|
Assert.equal(engines.length, 0);
|
|
|
|
const prefName = "services.sync.engines.automobile.electric";
|
|
Services.prefs.clearUserPref(prefName);
|
|
|
|
await manager.registerAlternatives(
|
|
"automobile",
|
|
prefName,
|
|
ElectricEngine,
|
|
GasolineEngine
|
|
);
|
|
|
|
let gasEngine = manager.get("automobile");
|
|
Assert.equal(gasEngine.type, "gasoline");
|
|
|
|
Assert.ok(gasEngine.isActive);
|
|
Assert.ok(gasEngine.initializeCalled);
|
|
Assert.ok(!gasEngine.finalizeCalled);
|
|
Assert.equal(AutoEngine.current, gasEngine);
|
|
|
|
_("Check that setting the controlling pref to false makes no difference");
|
|
Services.prefs.setBoolPref(prefName, false);
|
|
Assert.equal(manager.get("automobile"), gasEngine);
|
|
Assert.ok(gasEngine.isActive);
|
|
Assert.ok(gasEngine.initializeCalled);
|
|
Assert.ok(!gasEngine.finalizeCalled);
|
|
|
|
_("Even after the call to switchAlternatives");
|
|
await manager.switchAlternatives();
|
|
Assert.equal(manager.get("automobile"), gasEngine);
|
|
Assert.ok(gasEngine.isActive);
|
|
Assert.ok(gasEngine.initializeCalled);
|
|
Assert.ok(!gasEngine.finalizeCalled);
|
|
|
|
_("Set the pref to true, we still shouldn't switch yet");
|
|
Services.prefs.setBoolPref(prefName, true);
|
|
Assert.equal(manager.get("automobile"), gasEngine);
|
|
Assert.ok(gasEngine.isActive);
|
|
Assert.ok(gasEngine.initializeCalled);
|
|
Assert.ok(!gasEngine.finalizeCalled);
|
|
|
|
_("Now we expect to switch from gas to electric");
|
|
await manager.switchAlternatives();
|
|
let elecEngine = manager.get("automobile");
|
|
Assert.equal(elecEngine.type, "electric");
|
|
Assert.ok(elecEngine.isActive);
|
|
Assert.ok(elecEngine.initializeCalled);
|
|
Assert.ok(!elecEngine.finalizeCalled);
|
|
Assert.equal(AutoEngine.current, elecEngine);
|
|
|
|
Assert.ok(!gasEngine.isActive);
|
|
Assert.ok(gasEngine.finalizeCalled);
|
|
|
|
_("Switch back, and ensure we get a new instance that got initialized again");
|
|
Services.prefs.setBoolPref(prefName, false);
|
|
await manager.switchAlternatives();
|
|
|
|
// First make sure we deactivated the electric engine as we should
|
|
Assert.ok(!elecEngine.isActive);
|
|
Assert.ok(elecEngine.initializeCalled);
|
|
Assert.ok(elecEngine.finalizeCalled);
|
|
|
|
let newGasEngine = manager.get("automobile");
|
|
Assert.notEqual(newGasEngine, gasEngine);
|
|
Assert.equal(newGasEngine.type, "gasoline");
|
|
|
|
Assert.ok(newGasEngine.isActive);
|
|
Assert.ok(newGasEngine.initializeCalled);
|
|
Assert.ok(!newGasEngine.finalizeCalled);
|
|
|
|
_("Make sure unregister removes the alt info too");
|
|
await manager.unregister("automobile");
|
|
Assert.equal(manager.get("automobile"), null);
|
|
Assert.ok(newGasEngine.finalizeCalled);
|
|
Assert.deepEqual(Object.keys(manager._altEngineInfo), []);
|
|
});
|