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-common/observers.js"); michael@0: Cu.import("resource://services-sync/engines.js"); michael@0: Cu.import("resource://services-sync/service.js"); michael@0: Cu.import("resource://services-sync/util.js"); michael@0: michael@0: function SteamStore(engine) { michael@0: Store.call(this, "Steam", engine); michael@0: this.wasWiped = false; michael@0: } michael@0: SteamStore.prototype = { michael@0: __proto__: Store.prototype, michael@0: michael@0: wipe: function() { michael@0: this.wasWiped = true; michael@0: } michael@0: }; michael@0: michael@0: function SteamTracker(name, engine) { michael@0: Tracker.call(this, name || "Steam", engine); michael@0: } michael@0: SteamTracker.prototype = { michael@0: __proto__: Tracker.prototype michael@0: }; michael@0: michael@0: function SteamEngine(service) { michael@0: Engine.call(this, "Steam", service); michael@0: this.wasReset = false; michael@0: this.wasSynced = false; michael@0: } michael@0: SteamEngine.prototype = { michael@0: __proto__: Engine.prototype, michael@0: _storeObj: SteamStore, michael@0: _trackerObj: SteamTracker, michael@0: michael@0: _resetClient: function () { michael@0: this.wasReset = true; michael@0: }, michael@0: michael@0: _sync: function () { michael@0: this.wasSynced = true; michael@0: } michael@0: }; michael@0: michael@0: let engineObserver = { michael@0: topics: [], michael@0: michael@0: observe: function(subject, topic, data) { michael@0: do_check_eq(data, "steam"); michael@0: this.topics.push(topic); michael@0: }, michael@0: michael@0: reset: function() { michael@0: this.topics = []; michael@0: } michael@0: }; michael@0: Observers.add("weave:engine:reset-client:start", engineObserver); michael@0: Observers.add("weave:engine:reset-client:finish", engineObserver); michael@0: Observers.add("weave:engine:wipe-client:start", engineObserver); michael@0: Observers.add("weave:engine:wipe-client:finish", engineObserver); michael@0: Observers.add("weave:engine:sync:start", engineObserver); michael@0: Observers.add("weave:engine:sync:finish", engineObserver); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_members() { michael@0: _("Engine object members"); michael@0: let engine = new SteamEngine(Service); michael@0: do_check_eq(engine.Name, "Steam"); michael@0: do_check_eq(engine.prefName, "steam"); michael@0: do_check_true(engine._store instanceof SteamStore); michael@0: do_check_true(engine._tracker instanceof SteamTracker); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_score() { michael@0: _("Engine.score corresponds to tracker.score and is readonly"); michael@0: let engine = new SteamEngine(Service); michael@0: do_check_eq(engine.score, 0); michael@0: engine._tracker.score += 5; michael@0: do_check_eq(engine.score, 5); michael@0: michael@0: try { michael@0: engine.score = 10; michael@0: } catch(ex) { michael@0: // Setting an attribute that has a getter produces an error in michael@0: // Firefox <= 3.6 and is ignored in later versions. Either way, michael@0: // the attribute's value won't change. michael@0: } michael@0: do_check_eq(engine.score, 5); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_resetClient() { michael@0: _("Engine.resetClient calls _resetClient"); michael@0: let engine = new SteamEngine(Service); michael@0: do_check_false(engine.wasReset); michael@0: michael@0: engine.resetClient(); michael@0: do_check_true(engine.wasReset); michael@0: do_check_eq(engineObserver.topics[0], "weave:engine:reset-client:start"); michael@0: do_check_eq(engineObserver.topics[1], "weave:engine:reset-client:finish"); michael@0: michael@0: engine.wasReset = false; michael@0: engineObserver.reset(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_invalidChangedIDs() { michael@0: _("Test that invalid changed IDs on disk don't end up live."); michael@0: let engine = new SteamEngine(Service); michael@0: let tracker = engine._tracker; michael@0: tracker.changedIDs = 5; michael@0: tracker.saveChangedIDs(function onSaved() { michael@0: tracker.changedIDs = {placeholder: true}; michael@0: tracker.loadChangedIDs(function onLoaded(json) { michael@0: do_check_null(json); michael@0: do_check_true(tracker.changedIDs.placeholder); michael@0: run_next_test(); michael@0: }); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_wipeClient() { michael@0: _("Engine.wipeClient calls resetClient, wipes store, clears changed IDs"); michael@0: let engine = new SteamEngine(Service); michael@0: do_check_false(engine.wasReset); michael@0: do_check_false(engine._store.wasWiped); michael@0: do_check_true(engine._tracker.addChangedID("a-changed-id")); michael@0: do_check_true("a-changed-id" in engine._tracker.changedIDs); michael@0: michael@0: engine.wipeClient(); michael@0: do_check_true(engine.wasReset); michael@0: do_check_true(engine._store.wasWiped); michael@0: do_check_eq(JSON.stringify(engine._tracker.changedIDs), "{}"); michael@0: do_check_eq(engineObserver.topics[0], "weave:engine:wipe-client:start"); michael@0: do_check_eq(engineObserver.topics[1], "weave:engine:reset-client:start"); michael@0: do_check_eq(engineObserver.topics[2], "weave:engine:reset-client:finish"); michael@0: do_check_eq(engineObserver.topics[3], "weave:engine:wipe-client:finish"); michael@0: michael@0: engine.wasReset = false; michael@0: engine._store.wasWiped = false; michael@0: engineObserver.reset(); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: add_test(function test_enabled() { michael@0: _("Engine.enabled corresponds to preference"); michael@0: let engine = new SteamEngine(Service); michael@0: try { michael@0: do_check_false(engine.enabled); michael@0: Svc.Prefs.set("engine.steam", true); michael@0: do_check_true(engine.enabled); michael@0: michael@0: engine.enabled = false; michael@0: do_check_false(Svc.Prefs.get("engine.steam")); michael@0: run_next_test(); michael@0: } finally { michael@0: Svc.Prefs.resetBranch(""); michael@0: } michael@0: }); michael@0: michael@0: add_test(function test_sync() { michael@0: let engine = new SteamEngine(Service); michael@0: try { michael@0: _("Engine.sync doesn't call _sync if it's not enabled"); michael@0: do_check_false(engine.enabled); michael@0: do_check_false(engine.wasSynced); michael@0: engine.sync(); michael@0: do_check_false(engine.wasSynced); michael@0: michael@0: _("Engine.sync calls _sync if it's enabled"); michael@0: engine.enabled = true; michael@0: engine.sync(); michael@0: do_check_true(engine.wasSynced); michael@0: do_check_eq(engineObserver.topics[0], "weave:engine:sync:start"); michael@0: do_check_eq(engineObserver.topics[1], "weave:engine:sync:finish"); michael@0: run_next_test(); michael@0: } finally { michael@0: Svc.Prefs.resetBranch(""); michael@0: engine.wasSynced = false; michael@0: engineObserver.reset(); michael@0: } michael@0: }); michael@0: michael@0: add_test(function test_disabled_no_track() { michael@0: _("When an engine is disabled, its tracker is not tracking."); michael@0: let engine = new SteamEngine(Service); michael@0: let tracker = engine._tracker; michael@0: do_check_eq(engine, tracker.engine); michael@0: michael@0: do_check_false(engine.enabled); michael@0: do_check_false(tracker._isTracking); michael@0: do_check_empty(tracker.changedIDs); michael@0: michael@0: do_check_false(tracker.engineIsEnabled()); michael@0: tracker.observe(null, "weave:engine:start-tracking", null); michael@0: do_check_false(tracker._isTracking); michael@0: do_check_empty(tracker.changedIDs); michael@0: michael@0: engine.enabled = true; michael@0: tracker.observe(null, "weave:engine:start-tracking", null); michael@0: do_check_true(tracker._isTracking); michael@0: do_check_empty(tracker.changedIDs); michael@0: michael@0: tracker.addChangedID("abcdefghijkl"); michael@0: do_check_true(0 < tracker.changedIDs["abcdefghijkl"]); michael@0: engine.enabled = false; michael@0: do_check_false(tracker._isTracking); michael@0: do_check_empty(tracker.changedIDs); michael@0: michael@0: run_next_test(); michael@0: });