/* 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" ); const { Status } = ChromeUtils.importESModule( "resource://services-sync/status.sys.mjs" ); // 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 // global score tracker gives it that treatment. See bug 676042 for more. 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); });