1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_engine.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,217 @@ 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-common/observers.js"); 1.8 +Cu.import("resource://services-sync/engines.js"); 1.9 +Cu.import("resource://services-sync/service.js"); 1.10 +Cu.import("resource://services-sync/util.js"); 1.11 + 1.12 +function SteamStore(engine) { 1.13 + Store.call(this, "Steam", engine); 1.14 + this.wasWiped = false; 1.15 +} 1.16 +SteamStore.prototype = { 1.17 + __proto__: Store.prototype, 1.18 + 1.19 + wipe: function() { 1.20 + this.wasWiped = true; 1.21 + } 1.22 +}; 1.23 + 1.24 +function SteamTracker(name, engine) { 1.25 + Tracker.call(this, name || "Steam", engine); 1.26 +} 1.27 +SteamTracker.prototype = { 1.28 + __proto__: Tracker.prototype 1.29 +}; 1.30 + 1.31 +function SteamEngine(service) { 1.32 + Engine.call(this, "Steam", service); 1.33 + this.wasReset = false; 1.34 + this.wasSynced = false; 1.35 +} 1.36 +SteamEngine.prototype = { 1.37 + __proto__: Engine.prototype, 1.38 + _storeObj: SteamStore, 1.39 + _trackerObj: SteamTracker, 1.40 + 1.41 + _resetClient: function () { 1.42 + this.wasReset = true; 1.43 + }, 1.44 + 1.45 + _sync: function () { 1.46 + this.wasSynced = true; 1.47 + } 1.48 +}; 1.49 + 1.50 +let engineObserver = { 1.51 + topics: [], 1.52 + 1.53 + observe: function(subject, topic, data) { 1.54 + do_check_eq(data, "steam"); 1.55 + this.topics.push(topic); 1.56 + }, 1.57 + 1.58 + reset: function() { 1.59 + this.topics = []; 1.60 + } 1.61 +}; 1.62 +Observers.add("weave:engine:reset-client:start", engineObserver); 1.63 +Observers.add("weave:engine:reset-client:finish", engineObserver); 1.64 +Observers.add("weave:engine:wipe-client:start", engineObserver); 1.65 +Observers.add("weave:engine:wipe-client:finish", engineObserver); 1.66 +Observers.add("weave:engine:sync:start", engineObserver); 1.67 +Observers.add("weave:engine:sync:finish", engineObserver); 1.68 + 1.69 +function run_test() { 1.70 + run_next_test(); 1.71 +} 1.72 + 1.73 +add_test(function test_members() { 1.74 + _("Engine object members"); 1.75 + let engine = new SteamEngine(Service); 1.76 + do_check_eq(engine.Name, "Steam"); 1.77 + do_check_eq(engine.prefName, "steam"); 1.78 + do_check_true(engine._store instanceof SteamStore); 1.79 + do_check_true(engine._tracker instanceof SteamTracker); 1.80 + run_next_test(); 1.81 +}); 1.82 + 1.83 +add_test(function test_score() { 1.84 + _("Engine.score corresponds to tracker.score and is readonly"); 1.85 + let engine = new SteamEngine(Service); 1.86 + do_check_eq(engine.score, 0); 1.87 + engine._tracker.score += 5; 1.88 + do_check_eq(engine.score, 5); 1.89 + 1.90 + try { 1.91 + engine.score = 10; 1.92 + } catch(ex) { 1.93 + // Setting an attribute that has a getter produces an error in 1.94 + // Firefox <= 3.6 and is ignored in later versions. Either way, 1.95 + // the attribute's value won't change. 1.96 + } 1.97 + do_check_eq(engine.score, 5); 1.98 + run_next_test(); 1.99 +}); 1.100 + 1.101 +add_test(function test_resetClient() { 1.102 + _("Engine.resetClient calls _resetClient"); 1.103 + let engine = new SteamEngine(Service); 1.104 + do_check_false(engine.wasReset); 1.105 + 1.106 + engine.resetClient(); 1.107 + do_check_true(engine.wasReset); 1.108 + do_check_eq(engineObserver.topics[0], "weave:engine:reset-client:start"); 1.109 + do_check_eq(engineObserver.topics[1], "weave:engine:reset-client:finish"); 1.110 + 1.111 + engine.wasReset = false; 1.112 + engineObserver.reset(); 1.113 + run_next_test(); 1.114 +}); 1.115 + 1.116 +add_test(function test_invalidChangedIDs() { 1.117 + _("Test that invalid changed IDs on disk don't end up live."); 1.118 + let engine = new SteamEngine(Service); 1.119 + let tracker = engine._tracker; 1.120 + tracker.changedIDs = 5; 1.121 + tracker.saveChangedIDs(function onSaved() { 1.122 + tracker.changedIDs = {placeholder: true}; 1.123 + tracker.loadChangedIDs(function onLoaded(json) { 1.124 + do_check_null(json); 1.125 + do_check_true(tracker.changedIDs.placeholder); 1.126 + run_next_test(); 1.127 + }); 1.128 + }); 1.129 +}); 1.130 + 1.131 +add_test(function test_wipeClient() { 1.132 + _("Engine.wipeClient calls resetClient, wipes store, clears changed IDs"); 1.133 + let engine = new SteamEngine(Service); 1.134 + do_check_false(engine.wasReset); 1.135 + do_check_false(engine._store.wasWiped); 1.136 + do_check_true(engine._tracker.addChangedID("a-changed-id")); 1.137 + do_check_true("a-changed-id" in engine._tracker.changedIDs); 1.138 + 1.139 + engine.wipeClient(); 1.140 + do_check_true(engine.wasReset); 1.141 + do_check_true(engine._store.wasWiped); 1.142 + do_check_eq(JSON.stringify(engine._tracker.changedIDs), "{}"); 1.143 + do_check_eq(engineObserver.topics[0], "weave:engine:wipe-client:start"); 1.144 + do_check_eq(engineObserver.topics[1], "weave:engine:reset-client:start"); 1.145 + do_check_eq(engineObserver.topics[2], "weave:engine:reset-client:finish"); 1.146 + do_check_eq(engineObserver.topics[3], "weave:engine:wipe-client:finish"); 1.147 + 1.148 + engine.wasReset = false; 1.149 + engine._store.wasWiped = false; 1.150 + engineObserver.reset(); 1.151 + run_next_test(); 1.152 +}); 1.153 + 1.154 +add_test(function test_enabled() { 1.155 + _("Engine.enabled corresponds to preference"); 1.156 + let engine = new SteamEngine(Service); 1.157 + try { 1.158 + do_check_false(engine.enabled); 1.159 + Svc.Prefs.set("engine.steam", true); 1.160 + do_check_true(engine.enabled); 1.161 + 1.162 + engine.enabled = false; 1.163 + do_check_false(Svc.Prefs.get("engine.steam")); 1.164 + run_next_test(); 1.165 + } finally { 1.166 + Svc.Prefs.resetBranch(""); 1.167 + } 1.168 +}); 1.169 + 1.170 +add_test(function test_sync() { 1.171 + let engine = new SteamEngine(Service); 1.172 + try { 1.173 + _("Engine.sync doesn't call _sync if it's not enabled"); 1.174 + do_check_false(engine.enabled); 1.175 + do_check_false(engine.wasSynced); 1.176 + engine.sync(); 1.177 + do_check_false(engine.wasSynced); 1.178 + 1.179 + _("Engine.sync calls _sync if it's enabled"); 1.180 + engine.enabled = true; 1.181 + engine.sync(); 1.182 + do_check_true(engine.wasSynced); 1.183 + do_check_eq(engineObserver.topics[0], "weave:engine:sync:start"); 1.184 + do_check_eq(engineObserver.topics[1], "weave:engine:sync:finish"); 1.185 + run_next_test(); 1.186 + } finally { 1.187 + Svc.Prefs.resetBranch(""); 1.188 + engine.wasSynced = false; 1.189 + engineObserver.reset(); 1.190 + } 1.191 +}); 1.192 + 1.193 +add_test(function test_disabled_no_track() { 1.194 + _("When an engine is disabled, its tracker is not tracking."); 1.195 + let engine = new SteamEngine(Service); 1.196 + let tracker = engine._tracker; 1.197 + do_check_eq(engine, tracker.engine); 1.198 + 1.199 + do_check_false(engine.enabled); 1.200 + do_check_false(tracker._isTracking); 1.201 + do_check_empty(tracker.changedIDs); 1.202 + 1.203 + do_check_false(tracker.engineIsEnabled()); 1.204 + tracker.observe(null, "weave:engine:start-tracking", null); 1.205 + do_check_false(tracker._isTracking); 1.206 + do_check_empty(tracker.changedIDs); 1.207 + 1.208 + engine.enabled = true; 1.209 + tracker.observe(null, "weave:engine:start-tracking", null); 1.210 + do_check_true(tracker._isTracking); 1.211 + do_check_empty(tracker.changedIDs); 1.212 + 1.213 + tracker.addChangedID("abcdefghijkl"); 1.214 + do_check_true(0 < tracker.changedIDs["abcdefghijkl"]); 1.215 + engine.enabled = false; 1.216 + do_check_false(tracker._isTracking); 1.217 + do_check_empty(tracker.changedIDs); 1.218 + 1.219 + run_next_test(); 1.220 +});