1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_score_triggers.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,149 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +Cu.import("resource://services-sync/engines.js"); 1.8 +Cu.import("resource://services-sync/engines/clients.js"); 1.9 +Cu.import("resource://services-sync/constants.js"); 1.10 +Cu.import("resource://services-sync/service.js"); 1.11 +Cu.import("resource://services-sync/status.js"); 1.12 +Cu.import("resource://services-sync/util.js"); 1.13 +Cu.import("resource://testing-common/services/sync/rotaryengine.js"); 1.14 +Cu.import("resource://testing-common/services/sync/utils.js"); 1.15 + 1.16 +Service.engineManager.clear(); 1.17 +Service.engineManager.register(RotaryEngine); 1.18 +let engine = Service.engineManager.get("rotary"); 1.19 +let tracker = engine._tracker; 1.20 +engine.enabled = true; 1.21 + 1.22 +// Tracking info/collections. 1.23 +let collectionsHelper = track_collections_helper(); 1.24 +let upd = collectionsHelper.with_updated_collection; 1.25 + 1.26 +function sync_httpd_setup() { 1.27 + let handlers = {}; 1.28 + 1.29 + handlers["/1.1/johndoe/storage/meta/global"] = 1.30 + new ServerWBO("global", {}).handler(); 1.31 + handlers["/1.1/johndoe/storage/steam"] = 1.32 + new ServerWBO("steam", {}).handler(); 1.33 + 1.34 + handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler; 1.35 + delete collectionsHelper.collections.crypto; 1.36 + delete collectionsHelper.collections.meta; 1.37 + 1.38 + let cr = new ServerWBO("keys"); 1.39 + handlers["/1.1/johndoe/storage/crypto/keys"] = 1.40 + upd("crypto", cr.handler()); 1.41 + 1.42 + let cl = new ServerCollection(); 1.43 + handlers["/1.1/johndoe/storage/clients"] = 1.44 + upd("clients", cl.handler()); 1.45 + 1.46 + return httpd_setup(handlers); 1.47 +} 1.48 + 1.49 +function setUp(server) { 1.50 + new SyncTestingInfrastructure(server, "johndoe", "ilovejane", "sekrit"); 1.51 +} 1.52 + 1.53 +function run_test() { 1.54 + initTestLogging("Trace"); 1.55 + 1.56 + Log.repository.getLogger("Sync.Service").level = Log.Level.Trace; 1.57 + 1.58 + run_next_test(); 1.59 +} 1.60 + 1.61 +add_test(function test_tracker_score_updated() { 1.62 + let scoreUpdated = 0; 1.63 + 1.64 + function onScoreUpdated() { 1.65 + scoreUpdated++; 1.66 + } 1.67 + 1.68 + Svc.Obs.add("weave:engine:score:updated", onScoreUpdated()); 1.69 + 1.70 + try { 1.71 + do_check_eq(engine.score, 0); 1.72 + 1.73 + tracker.score += SCORE_INCREMENT_SMALL; 1.74 + do_check_eq(engine.score, SCORE_INCREMENT_SMALL); 1.75 + 1.76 + do_check_eq(scoreUpdated, 1); 1.77 + } finally { 1.78 + Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated); 1.79 + tracker.resetScore(); 1.80 + run_next_test(); 1.81 + } 1.82 +}); 1.83 + 1.84 +add_test(function test_sync_triggered() { 1.85 + let server = sync_httpd_setup(); 1.86 + setUp(server); 1.87 + 1.88 + Service.login(); 1.89 + 1.90 + Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; 1.91 + Svc.Obs.add("weave:service:sync:finish", function onSyncFinish() { 1.92 + Svc.Obs.remove("weave:service:sync:finish", onSyncFinish); 1.93 + _("Sync completed!"); 1.94 + server.stop(run_next_test); 1.95 + }); 1.96 + 1.97 + do_check_eq(Status.login, LOGIN_SUCCEEDED); 1.98 + tracker.score += SCORE_INCREMENT_XLARGE; 1.99 +}); 1.100 + 1.101 +add_test(function test_clients_engine_sync_triggered() { 1.102 + _("Ensure that client engine score changes trigger a sync."); 1.103 + 1.104 + // The clients engine is not registered like other engines. Therefore, 1.105 + // it needs special treatment throughout the code. Here, we verify the 1.106 + // global score tracker gives it that treatment. See bug 676042 for more. 1.107 + 1.108 + let server = sync_httpd_setup(); 1.109 + setUp(server); 1.110 + Service.login(); 1.111 + 1.112 + const TOPIC = "weave:service:sync:finish"; 1.113 + Svc.Obs.add(TOPIC, function onSyncFinish() { 1.114 + Svc.Obs.remove(TOPIC, onSyncFinish); 1.115 + _("Sync due to clients engine change completed."); 1.116 + server.stop(run_next_test); 1.117 + }); 1.118 + 1.119 + Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; 1.120 + do_check_eq(Status.login, LOGIN_SUCCEEDED); 1.121 + Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE; 1.122 +}); 1.123 + 1.124 +add_test(function test_incorrect_credentials_sync_not_triggered() { 1.125 + _("Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."); 1.126 + let server = sync_httpd_setup(); 1.127 + setUp(server); 1.128 + 1.129 + // Ensure we don't actually try to sync. 1.130 + function onSyncStart() { 1.131 + do_throw("Should not get here!"); 1.132 + } 1.133 + Svc.Obs.add("weave:service:sync:start", onSyncStart); 1.134 + 1.135 + // First wait >100ms (nsITimers can take up to that much time to fire, so 1.136 + // we can account for the timer in delayedAutoconnect) and then one event 1.137 + // loop tick (to account for a possible call to weave:service:sync:start). 1.138 + Utils.namedTimer(function() { 1.139 + Utils.nextTick(function() { 1.140 + Svc.Obs.remove("weave:service:sync:start", onSyncStart); 1.141 + 1.142 + do_check_eq(Status.login, LOGIN_FAILED_LOGIN_REJECTED); 1.143 + 1.144 + Service.startOver(); 1.145 + server.stop(run_next_test); 1.146 + }); 1.147 + }, 150, {}, "timer"); 1.148 + 1.149 + // Faking incorrect credentials to prevent score update. 1.150 + Status.login = LOGIN_FAILED_LOGIN_REJECTED; 1.151 + tracker.score += SCORE_INCREMENT_XLARGE; 1.152 +});