gecko/services/sync/tests/unit/test_declined.js
Richard Newman 2bf76553bf Bug 978876 - Part 1: handle declined engines in desktop Sync meta/global. r=gps
* * *
Bug 978876 - Part 2: refactor out meta/global upload.
2014-03-13 16:37:25 -07:00

154 lines
5.2 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
Cu.import("resource://services-sync/stages/declined.js");
Cu.import("resource://services-sync/stages/enginesync.js");
Cu.import("resource://services-sync/engines.js");
Cu.import("resource://services-sync/service.js");
Cu.import("resource://services-common/observers.js");
function run_test() {
run_next_test();
}
function PetrolEngine() {}
PetrolEngine.prototype.name = "petrol";
function DieselEngine() {}
DieselEngine.prototype.name = "diesel";
function DummyEngine() {}
DummyEngine.prototype.name = "dummy";
function ActualEngine() {}
ActualEngine.prototype = {__proto__: Engine.prototype,
name: 'actual'};
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_test(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);
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, topic, data) {
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_test(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, topic, data) {
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.");
run_next_test();
}
Observers.add("weave:engines:notdeclined", onNotDeclined);
declinedEngines.updateDeclined(meta, manager);
});