michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Cu.import("resource://services-sync/engines.js"); michael@0: Cu.import("resource://services-sync/engines/clients.js"); michael@0: Cu.import("resource://services-sync/constants.js"); michael@0: Cu.import("resource://services-sync/service.js"); michael@0: Cu.import("resource://services-sync/status.js"); michael@0: Cu.import("resource://services-sync/util.js"); michael@0: Cu.import("resource://testing-common/services/sync/rotaryengine.js"); michael@0: Cu.import("resource://testing-common/services/sync/utils.js"); michael@0: michael@0: Service.engineManager.clear(); michael@0: Service.engineManager.register(RotaryEngine); michael@0: let engine = Service.engineManager.get("rotary"); michael@0: let tracker = engine._tracker; michael@0: engine.enabled = true; michael@0: michael@0: // Tracking info/collections. michael@0: let collectionsHelper = track_collections_helper(); michael@0: let upd = collectionsHelper.with_updated_collection; michael@0: michael@0: function sync_httpd_setup() { michael@0: let handlers = {}; michael@0: michael@0: handlers["/1.1/johndoe/storage/meta/global"] = michael@0: new ServerWBO("global", {}).handler(); michael@0: handlers["/1.1/johndoe/storage/steam"] = michael@0: new ServerWBO("steam", {}).handler(); michael@0: michael@0: handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler; michael@0: delete collectionsHelper.collections.crypto; michael@0: delete collectionsHelper.collections.meta; michael@0: michael@0: let cr = new ServerWBO("keys"); michael@0: handlers["/1.1/johndoe/storage/crypto/keys"] = michael@0: upd("crypto", cr.handler()); michael@0: michael@0: let cl = new ServerCollection(); michael@0: handlers["/1.1/johndoe/storage/clients"] = michael@0: upd("clients", cl.handler()); michael@0: michael@0: return httpd_setup(handlers); michael@0: } michael@0: michael@0: function setUp(server) { michael@0: new SyncTestingInfrastructure(server, "johndoe", "ilovejane", "sekrit"); michael@0: } michael@0: michael@0: function run_test() { michael@0: initTestLogging("Trace"); michael@0: michael@0: Log.repository.getLogger("Sync.Service").level = Log.Level.Trace; michael@0: michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_tracker_score_updated() { michael@0: let scoreUpdated = 0; michael@0: michael@0: function onScoreUpdated() { michael@0: scoreUpdated++; michael@0: } michael@0: michael@0: Svc.Obs.add("weave:engine:score:updated", onScoreUpdated()); michael@0: michael@0: try { michael@0: do_check_eq(engine.score, 0); michael@0: michael@0: tracker.score += SCORE_INCREMENT_SMALL; michael@0: do_check_eq(engine.score, SCORE_INCREMENT_SMALL); michael@0: michael@0: do_check_eq(scoreUpdated, 1); michael@0: } finally { michael@0: Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated); michael@0: tracker.resetScore(); michael@0: run_next_test(); michael@0: } michael@0: }); michael@0: michael@0: add_test(function test_sync_triggered() { michael@0: let server = sync_httpd_setup(); michael@0: setUp(server); michael@0: michael@0: Service.login(); michael@0: michael@0: Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; michael@0: Svc.Obs.add("weave:service:sync:finish", function onSyncFinish() { michael@0: Svc.Obs.remove("weave:service:sync:finish", onSyncFinish); michael@0: _("Sync completed!"); michael@0: server.stop(run_next_test); michael@0: }); michael@0: michael@0: do_check_eq(Status.login, LOGIN_SUCCEEDED); michael@0: tracker.score += SCORE_INCREMENT_XLARGE; michael@0: }); michael@0: michael@0: add_test(function test_clients_engine_sync_triggered() { michael@0: _("Ensure that client engine score changes trigger a sync."); michael@0: michael@0: // The clients engine is not registered like other engines. Therefore, michael@0: // it needs special treatment throughout the code. Here, we verify the michael@0: // global score tracker gives it that treatment. See bug 676042 for more. michael@0: michael@0: let server = sync_httpd_setup(); michael@0: setUp(server); michael@0: Service.login(); michael@0: michael@0: const TOPIC = "weave:service:sync:finish"; michael@0: Svc.Obs.add(TOPIC, function onSyncFinish() { michael@0: Svc.Obs.remove(TOPIC, onSyncFinish); michael@0: _("Sync due to clients engine change completed."); michael@0: server.stop(run_next_test); michael@0: }); michael@0: michael@0: Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; michael@0: do_check_eq(Status.login, LOGIN_SUCCEEDED); michael@0: Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE; michael@0: }); michael@0: michael@0: add_test(function test_incorrect_credentials_sync_not_triggered() { michael@0: _("Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."); michael@0: let server = sync_httpd_setup(); michael@0: setUp(server); michael@0: michael@0: // Ensure we don't actually try to sync. michael@0: function onSyncStart() { michael@0: do_throw("Should not get here!"); michael@0: } michael@0: Svc.Obs.add("weave:service:sync:start", onSyncStart); michael@0: michael@0: // First wait >100ms (nsITimers can take up to that much time to fire, so michael@0: // we can account for the timer in delayedAutoconnect) and then one event michael@0: // loop tick (to account for a possible call to weave:service:sync:start). michael@0: Utils.namedTimer(function() { michael@0: Utils.nextTick(function() { michael@0: Svc.Obs.remove("weave:service:sync:start", onSyncStart); michael@0: michael@0: do_check_eq(Status.login, LOGIN_FAILED_LOGIN_REJECTED); michael@0: michael@0: Service.startOver(); michael@0: server.stop(run_next_test); michael@0: }); michael@0: }, 150, {}, "timer"); michael@0: michael@0: // Faking incorrect credentials to prevent score update. michael@0: Status.login = LOGIN_FAILED_LOGIN_REJECTED; michael@0: tracker.score += SCORE_INCREMENT_XLARGE; michael@0: });