test_engine.js (7491B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const { Observers } = ChromeUtils.importESModule( 5 "resource://services-common/observers.sys.mjs" 6 ); 7 const { Service } = ChromeUtils.importESModule( 8 "resource://services-sync/service.sys.mjs" 9 ); 10 11 function SteamStore(engine) { 12 Store.call(this, "Steam", engine); 13 this.wasWiped = false; 14 } 15 SteamStore.prototype = { 16 async wipe() { 17 this.wasWiped = true; 18 }, 19 }; 20 Object.setPrototypeOf(SteamStore.prototype, Store.prototype); 21 22 function SteamTracker(name, engine) { 23 LegacyTracker.call(this, name || "Steam", engine); 24 } 25 Object.setPrototypeOf(SteamTracker.prototype, LegacyTracker.prototype); 26 27 function SteamEngine(name, service) { 28 SyncEngine.call(this, name, service); 29 this.wasReset = false; 30 this.wasSynced = false; 31 } 32 SteamEngine.prototype = { 33 _storeObj: SteamStore, 34 _trackerObj: SteamTracker, 35 36 async _resetClient() { 37 this.wasReset = true; 38 }, 39 40 async _sync() { 41 this.wasSynced = true; 42 }, 43 }; 44 Object.setPrototypeOf(SteamEngine.prototype, SyncEngine.prototype); 45 46 var engineObserver = { 47 topics: [], 48 49 observe(subject, topic, data) { 50 Assert.equal(data, "steam"); 51 this.topics.push(topic); 52 }, 53 54 reset() { 55 this.topics = []; 56 }, 57 }; 58 Observers.add("weave:engine:reset-client:start", engineObserver); 59 Observers.add("weave:engine:reset-client:finish", engineObserver); 60 Observers.add("weave:engine:wipe-client:start", engineObserver); 61 Observers.add("weave:engine:wipe-client:finish", engineObserver); 62 Observers.add("weave:engine:sync:start", engineObserver); 63 Observers.add("weave:engine:sync:finish", engineObserver); 64 65 async function cleanup(engine) { 66 for (const pref of Svc.PrefBranch.getChildList("")) { 67 Svc.PrefBranch.clearUserPref(pref); 68 } 69 engine.wasReset = false; 70 engine.wasSynced = false; 71 engineObserver.reset(); 72 await engine._tracker.clearChangedIDs(); 73 await engine.finalize(); 74 } 75 76 add_task(async function test_members() { 77 _("Engine object members"); 78 let engine = new SteamEngine("Steam", Service); 79 await engine.initialize(); 80 Assert.equal(engine.Name, "Steam"); 81 Assert.equal(engine.prefName, "steam"); 82 Assert.ok(engine._store instanceof SteamStore); 83 Assert.ok(engine._tracker instanceof SteamTracker); 84 }); 85 86 add_task(async function test_score() { 87 _("Engine.score corresponds to tracker.score and is readonly"); 88 let engine = new SteamEngine("Steam", Service); 89 await engine.initialize(); 90 Assert.equal(engine.score, 0); 91 engine._tracker.score += 5; 92 Assert.equal(engine.score, 5); 93 94 try { 95 engine.score = 10; 96 } catch (ex) { 97 // Setting an attribute that has a getter produces an error in 98 // Firefox <= 3.6 and is ignored in later versions. Either way, 99 // the attribute's value won't change. 100 } 101 Assert.equal(engine.score, 5); 102 }); 103 104 add_task(async function test_resetClient() { 105 _("Engine.resetClient calls _resetClient"); 106 let engine = new SteamEngine("Steam", Service); 107 await engine.initialize(); 108 Assert.ok(!engine.wasReset); 109 110 await engine.resetClient(); 111 Assert.ok(engine.wasReset); 112 Assert.equal(engineObserver.topics[0], "weave:engine:reset-client:start"); 113 Assert.equal(engineObserver.topics[1], "weave:engine:reset-client:finish"); 114 115 await cleanup(engine); 116 }); 117 118 add_task(async function test_invalidChangedIDs() { 119 _("Test that invalid changed IDs on disk don't end up live."); 120 let engine = new SteamEngine("Steam", Service); 121 await engine.initialize(); 122 let tracker = engine._tracker; 123 124 await tracker._beforeSave(); 125 await IOUtils.writeUTF8(tracker._storage.path, "5", { 126 tmpPath: tracker._storage.path + ".tmp", 127 }); 128 129 ok(!tracker._storage.dataReady); 130 const changes = await tracker.getChangedIDs(); 131 changes.placeholder = true; 132 deepEqual( 133 changes, 134 { placeholder: true }, 135 "Accessing changed IDs should load changes from disk as a side effect" 136 ); 137 ok(tracker._storage.dataReady); 138 139 Assert.ok(changes.placeholder); 140 await cleanup(engine); 141 }); 142 143 add_task(async function test_wipeClient() { 144 _("Engine.wipeClient calls resetClient, wipes store, clears changed IDs"); 145 let engine = new SteamEngine("Steam", Service); 146 await engine.initialize(); 147 Assert.ok(!engine.wasReset); 148 Assert.ok(!engine._store.wasWiped); 149 Assert.ok(await engine._tracker.addChangedID("a-changed-id")); 150 let changes = await engine._tracker.getChangedIDs(); 151 Assert.ok("a-changed-id" in changes); 152 153 await engine.wipeClient(); 154 Assert.ok(engine.wasReset); 155 Assert.ok(engine._store.wasWiped); 156 changes = await engine._tracker.getChangedIDs(); 157 Assert.equal(JSON.stringify(changes), "{}"); 158 Assert.equal(engineObserver.topics[0], "weave:engine:wipe-client:start"); 159 Assert.equal(engineObserver.topics[1], "weave:engine:reset-client:start"); 160 Assert.equal(engineObserver.topics[2], "weave:engine:reset-client:finish"); 161 Assert.equal(engineObserver.topics[3], "weave:engine:wipe-client:finish"); 162 163 await cleanup(engine); 164 }); 165 166 add_task(async function test_enabled() { 167 _("Engine.enabled corresponds to preference"); 168 let engine = new SteamEngine("Steam", Service); 169 await engine.initialize(); 170 try { 171 Assert.ok(!engine.enabled); 172 Svc.PrefBranch.setBoolPref("engine.steam", true); 173 Assert.ok(engine.enabled); 174 175 engine.enabled = false; 176 Assert.ok(!Svc.PrefBranch.getBoolPref("engine.steam")); 177 } finally { 178 await cleanup(engine); 179 } 180 }); 181 182 add_task(async function test_sync() { 183 let engine = new SteamEngine("Steam", Service); 184 await engine.initialize(); 185 try { 186 _("Engine.sync doesn't call _sync if it's not enabled"); 187 Assert.ok(!engine.enabled); 188 Assert.ok(!engine.wasSynced); 189 await engine.sync(); 190 191 Assert.ok(!engine.wasSynced); 192 193 _("Engine.sync calls _sync if it's enabled"); 194 engine.enabled = true; 195 196 await engine.sync(); 197 Assert.ok(engine.wasSynced); 198 Assert.equal(engineObserver.topics[0], "weave:engine:sync:start"); 199 Assert.equal(engineObserver.topics[1], "weave:engine:sync:finish"); 200 } finally { 201 await cleanup(engine); 202 } 203 }); 204 205 add_task(async function test_disabled_no_track() { 206 _("When an engine is disabled, its tracker is not tracking."); 207 let engine = new SteamEngine("Steam", Service); 208 await engine.initialize(); 209 let tracker = engine._tracker; 210 Assert.equal(engine, tracker.engine); 211 212 Assert.ok(!engine.enabled); 213 Assert.ok(!tracker._isTracking); 214 let changes = await tracker.getChangedIDs(); 215 do_check_empty(changes); 216 217 Assert.ok(!tracker.engineIsEnabled()); 218 Assert.ok(!tracker._isTracking); 219 changes = await tracker.getChangedIDs(); 220 do_check_empty(changes); 221 222 let promisePrefChangeHandled = Promise.withResolvers(); 223 const origMethod = tracker.onEngineEnabledChanged; 224 tracker.onEngineEnabledChanged = async (...args) => { 225 await origMethod.apply(tracker, args); 226 promisePrefChangeHandled.resolve(); 227 }; 228 229 engine.enabled = true; // Also enables the tracker automatically. 230 await promisePrefChangeHandled.promise; 231 Assert.ok(tracker._isTracking); 232 changes = await tracker.getChangedIDs(); 233 do_check_empty(changes); 234 235 await tracker.addChangedID("abcdefghijkl"); 236 changes = await tracker.getChangedIDs(); 237 Assert.less(0, changes.abcdefghijkl); 238 promisePrefChangeHandled = Promise.withResolvers(); 239 Svc.PrefBranch.setBoolPref("engine." + engine.prefName, false); 240 await promisePrefChangeHandled.promise; 241 Assert.ok(!tracker._isTracking); 242 changes = await tracker.getChangedIDs(); 243 do_check_empty(changes); 244 245 await cleanup(engine); 246 });