/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const { DeclinedEngines } = ChromeUtils.importESModule(
"resource://services-sync/stages/declined.sys.mjs"
);
const { EngineSynchronizer } = ChromeUtils.importESModule(
"resource://services-sync/stages/enginesync.sys.mjs"
);
const { Service } = ChromeUtils.importESModule(
"resource://services-sync/service.sys.mjs"
);
const { Observers } = ChromeUtils.importESModule(
"resource://services-common/observers.sys.mjs"
);
function PetrolEngine() {}
PetrolEngine.prototype.name =
"petrol";
function DieselEngine() {}
DieselEngine.prototype.name =
"diesel";
function DummyEngine() {}
DummyEngine.prototype.name =
"dummy";
function ActualEngine() {}
ActualEngine.prototype.name =
"actual";
Object.setPrototypeOf(ActualEngine.prototype, SyncEngine.prototype);
function getEngineManager() {
let manager =
new EngineManager(Service);
Service.engineManager = manager;
manager._engines = {
petrol:
new PetrolEngine(),
diesel:
new DieselEngine(),
dummy:
new DummyEngine(),
actual:
new ActualEngine(),
};
return manager;
}
/**
* 'Fetch' a meta/global record that doesn't mention declined.
*
* Push it into the EngineSynchronizer to set enabled; verify that those are
* correct.
*
* Then push it into DeclinedEngines to set declined; verify that none are
* declined, and a notification is sent for our locally disabled-but-not-
* declined engines.
*/
add_task(async
function testOldMeta() {
let meta = {
payload: {
engines: {
petrol: 1,
diesel: 2,
nonlocal: 3,
// Enabled but not supported.
},
},
};
_(
"Record: " + JSON.stringify(meta));
let manager = getEngineManager();
// Update enabled from meta/global.
let engineSync =
new EngineSynchronizer(Service);
await engineSync._updateEnabledFromMeta(meta, 3, manager);
Assert.ok(manager._engines.petrol.enabled,
"'petrol' locally enabled.");
Assert.ok(manager._engines.diesel.enabled,
"'diesel' locally enabled.");
Assert.ok(
!(
"nonlocal" in manager._engines),
"We don't know anything about the 'nonlocal' engine."
);
Assert.ok(!manager._engines.actual.enabled,
"'actual' not locally enabled.");
Assert.ok(!manager.isDeclined(
"actual"),
"'actual' not declined, though.");
let declinedEngines =
new DeclinedEngines(Service);
function onNotDeclined(subject) {
Observers.remove(
"weave:engines:notdeclined", onNotDeclined);
Assert.ok(
subject.undecided.has(
"actual"),
"EngineManager observed that 'actual' was undecided."
);
let declined = manager.getDeclined();
_(
"Declined: " + JSON.stringify(declined));
Assert.ok(!meta.changed,
"No need to upload a new meta/global.");
run_next_test();
}
Observers.add(
"weave:engines:notdeclined", onNotDeclined);
declinedEngines.updateDeclined(meta, manager);
});
/**
* 'Fetch' a meta/global that declines an engine we don't
* recognize. Ensure that we track that declined engine along
* with any we locally declined, and that the meta/global
* record is marked as changed and includes all declined
* engines.
*/
add_task(async
function testDeclinedMeta() {
let meta = {
payload: {
engines: {
petrol: 1,
diesel: 2,
nonlocal: 3,
// Enabled but not supported.
},
declined: [
"nonexistent"],
// Declined and not supported.
},
};
_(
"Record: " + JSON.stringify(meta));
let manager = getEngineManager();
manager._engines.petrol.enabled =
true;
manager._engines.diesel.enabled =
true;
manager._engines.dummy.enabled =
true;
manager._engines.actual.enabled =
false;
// Disabled but not declined.
manager.decline([
"localdecline"]);
// Declined and not supported.
let declinedEngines =
new DeclinedEngines(Service);
function onNotDeclined(subject) {
Observers.remove(
"weave:engines:notdeclined", onNotDeclined);
Assert.ok(
subject.undecided.has(
"actual"),
"EngineManager observed that 'actual' was undecided."
);
let declined = manager.getDeclined();
_(
"Declined: " + JSON.stringify(declined));
Assert.equal(
declined.indexOf(
"actual"),
-1,
"'actual' is locally disabled, but not marked as declined."
);
Assert.equal(
declined.indexOf(
"clients"),
-1,
"'clients' is enabled and not remotely declined."
);
Assert.equal(
declined.indexOf(
"petrol"),
-1,
"'petrol' is enabled and not remotely declined."
);
Assert.equal(
declined.indexOf(
"diesel"),
-1,
"'diesel' is enabled and not remotely declined."
);
Assert.equal(
declined.indexOf(
"dummy"),
-1,
"'dummy' is enabled and not remotely declined."
);
Assert.ok(
0 <= declined.indexOf(
"nonexistent"),
"'nonexistent' was declined on the server."
);
Assert.ok(
0 <= declined.indexOf(
"localdecline"),
"'localdecline' was declined locally."
);
// The meta/global is modified, too.
Assert.ok(
0 <= meta.payload.declined.indexOf(
"nonexistent"),
"meta/global's declined contains 'nonexistent'."
);
Assert.ok(
0 <= meta.payload.declined.indexOf(
"localdecline"),
"meta/global's declined contains 'localdecline'."
);
Assert.strictEqual(
true, meta.changed,
"meta/global was changed.");
}
Observers.add(
"weave:engines:notdeclined", onNotDeclined);
declinedEngines.updateDeclined(meta, manager);
});