Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: services/sync/tests/unit/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
const { Service } = ChromeUtils.importESModule(
);
const { Status } = ChromeUtils.importESModule(
);
// Tracking info/collections.
var collectionsHelper = track_collections_helper();
var upd = collectionsHelper.with_updated_collection;
function sync_httpd_setup() {
let handlers = {};
handlers["/1.1/johndoe/storage/meta/global"] = new ServerWBO(
"global",
{}
).handler();
handlers["/1.1/johndoe/storage/steam"] = new ServerWBO("steam", {}).handler();
handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler;
delete collectionsHelper.collections.crypto;
delete collectionsHelper.collections.meta;
let cr = new ServerWBO("keys");
handlers["/1.1/johndoe/storage/crypto/keys"] = upd("crypto", cr.handler());
let cl = new ServerCollection();
handlers["/1.1/johndoe/storage/clients"] = upd("clients", cl.handler());
return httpd_setup(handlers);
}
async function setUp(server) {
let engineInfo = await registerRotaryEngine();
await SyncTestingInfrastructure(server, "johndoe", "ilovejane");
return engineInfo;
}
add_task(async function test_tracker_score_updated() {
enableValidationPrefs();
let { engine, tracker } = await registerRotaryEngine();
let scoreUpdated = 0;
function onScoreUpdated() {
scoreUpdated++;
}
Svc.Obs.add("weave:engine:score:updated", onScoreUpdated);
try {
Assert.equal(engine.score, 0);
tracker.score += SCORE_INCREMENT_SMALL;
Assert.equal(engine.score, SCORE_INCREMENT_SMALL);
Assert.equal(scoreUpdated, 1);
} finally {
Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated);
tracker.resetScore();
await tracker.clearChangedIDs();
await Service.engineManager.unregister(engine);
}
});
add_task(async function test_sync_triggered() {
let server = sync_httpd_setup();
let { engine, tracker } = await setUp(server);
await Service.login();
Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD;
Assert.equal(Status.login, LOGIN_SUCCEEDED);
tracker.score += SCORE_INCREMENT_XLARGE;
await promiseOneObserver("weave:service:sync:finish");
await Service.startOver();
await promiseStopServer(server);
await tracker.clearChangedIDs();
await Service.engineManager.unregister(engine);
});
add_task(async function test_clients_engine_sync_triggered() {
enableValidationPrefs();
_("Ensure that client engine score changes trigger a sync.");
// The clients engine is not registered like other engines. Therefore,
// it needs special treatment throughout the code. Here, we verify the
let server = sync_httpd_setup();
let { engine, tracker } = await setUp(server);
await Service.login();
Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD;
Assert.equal(Status.login, LOGIN_SUCCEEDED);
Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE;
await promiseOneObserver("weave:service:sync:finish");
_("Sync due to clients engine change completed.");
await Service.startOver();
await promiseStopServer(server);
await tracker.clearChangedIDs();
await Service.engineManager.unregister(engine);
});
add_task(async function test_incorrect_credentials_sync_not_triggered() {
enableValidationPrefs();
_(
"Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."
);
let server = sync_httpd_setup();
let { engine, tracker } = await setUp(server);
// Ensure we don't actually try to sync.
function onSyncStart() {
do_throw("Should not get here!");
}
Svc.Obs.add("weave:service:sync:start", onSyncStart);
// Faking incorrect credentials to prevent score update.
Status.login = LOGIN_FAILED_LOGIN_REJECTED;
tracker.score += SCORE_INCREMENT_XLARGE;
// First wait >100ms (nsITimers can take up to that much time to fire, so
// we can account for the timer in delayedAutoconnect) and then one event
// loop tick (to account for a possible call to weave:service:sync:start).
await promiseNamedTimer(150, {}, "timer");
await Async.promiseYield();
Svc.Obs.remove("weave:service:sync:start", onSyncStart);
Assert.equal(Status.login, LOGIN_FAILED_LOGIN_REJECTED);
await Service.startOver();
await promiseStopServer(server);
await tracker.clearChangedIDs();
await Service.engineManager.unregister(engine);
});