1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_declined.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,153 @@ 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/stages/declined.js"); 1.8 +Cu.import("resource://services-sync/stages/enginesync.js"); 1.9 +Cu.import("resource://services-sync/engines.js"); 1.10 +Cu.import("resource://services-sync/service.js"); 1.11 +Cu.import("resource://services-common/observers.js"); 1.12 + 1.13 +function run_test() { 1.14 + run_next_test(); 1.15 +} 1.16 + 1.17 +function PetrolEngine() {} 1.18 +PetrolEngine.prototype.name = "petrol"; 1.19 + 1.20 +function DieselEngine() {} 1.21 +DieselEngine.prototype.name = "diesel"; 1.22 + 1.23 +function DummyEngine() {} 1.24 +DummyEngine.prototype.name = "dummy"; 1.25 + 1.26 +function ActualEngine() {} 1.27 +ActualEngine.prototype = {__proto__: Engine.prototype, 1.28 + name: 'actual'}; 1.29 + 1.30 +function getEngineManager() { 1.31 + let manager = new EngineManager(Service); 1.32 + Service.engineManager = manager; 1.33 + manager._engines = { 1.34 + "petrol": new PetrolEngine(), 1.35 + "diesel": new DieselEngine(), 1.36 + "dummy": new DummyEngine(), 1.37 + "actual": new ActualEngine(), 1.38 + }; 1.39 + return manager; 1.40 +} 1.41 + 1.42 +/** 1.43 + * 'Fetch' a meta/global record that doesn't mention declined. 1.44 + * 1.45 + * Push it into the EngineSynchronizer to set enabled; verify that those are 1.46 + * correct. 1.47 + * 1.48 + * Then push it into DeclinedEngines to set declined; verify that none are 1.49 + * declined, and a notification is sent for our locally disabled-but-not- 1.50 + * declined engines. 1.51 + */ 1.52 +add_test(function testOldMeta() { 1.53 + let meta = { 1.54 + payload: { 1.55 + engines: { 1.56 + "petrol": 1, 1.57 + "diesel": 2, 1.58 + "nonlocal": 3, // Enabled but not supported. 1.59 + }, 1.60 + }, 1.61 + }; 1.62 + 1.63 + _("Record: " + JSON.stringify(meta)); 1.64 + 1.65 + let manager = getEngineManager(); 1.66 + 1.67 + // Update enabled from meta/global. 1.68 + let engineSync = new EngineSynchronizer(Service); 1.69 + engineSync._updateEnabledFromMeta(meta, 3, manager); 1.70 + 1.71 + Assert.ok(manager._engines["petrol"].enabled, "'petrol' locally enabled."); 1.72 + Assert.ok(manager._engines["diesel"].enabled, "'diesel' locally enabled."); 1.73 + Assert.ok(!("nonlocal" in manager._engines), "We don't know anything about the 'nonlocal' engine."); 1.74 + Assert.ok(!manager._engines["actual"].enabled, "'actual' not locally enabled."); 1.75 + Assert.ok(!manager.isDeclined("actual"), "'actual' not declined, though."); 1.76 + 1.77 + let declinedEngines = new DeclinedEngines(Service); 1.78 + 1.79 + function onNotDeclined(subject, topic, data) { 1.80 + Observers.remove("weave:engines:notdeclined", onNotDeclined); 1.81 + Assert.ok(subject.undecided.has("actual"), "EngineManager observed that 'actual' was undecided."); 1.82 + 1.83 + let declined = manager.getDeclined(); 1.84 + _("Declined: " + JSON.stringify(declined)); 1.85 + 1.86 + Assert.ok(!meta.changed, "No need to upload a new meta/global."); 1.87 + run_next_test(); 1.88 + } 1.89 + 1.90 + Observers.add("weave:engines:notdeclined", onNotDeclined); 1.91 + 1.92 + declinedEngines.updateDeclined(meta, manager); 1.93 +}); 1.94 + 1.95 +/** 1.96 + * 'Fetch' a meta/global that declines an engine we don't 1.97 + * recognize. Ensure that we track that declined engine along 1.98 + * with any we locally declined, and that the meta/global 1.99 + * record is marked as changed and includes all declined 1.100 + * engines. 1.101 + */ 1.102 +add_test(function testDeclinedMeta() { 1.103 + let meta = { 1.104 + payload: { 1.105 + engines: { 1.106 + "petrol": 1, 1.107 + "diesel": 2, 1.108 + "nonlocal": 3, // Enabled but not supported. 1.109 + }, 1.110 + declined: ["nonexistent"], // Declined and not supported. 1.111 + }, 1.112 + }; 1.113 + 1.114 + _("Record: " + JSON.stringify(meta)); 1.115 + 1.116 + let manager = getEngineManager(); 1.117 + manager._engines["petrol"].enabled = true; 1.118 + manager._engines["diesel"].enabled = true; 1.119 + manager._engines["dummy"].enabled = true; 1.120 + manager._engines["actual"].enabled = false; // Disabled but not declined. 1.121 + 1.122 + manager.decline(["localdecline"]); // Declined and not supported. 1.123 + 1.124 + let declinedEngines = new DeclinedEngines(Service); 1.125 + 1.126 + function onNotDeclined(subject, topic, data) { 1.127 + Observers.remove("weave:engines:notdeclined", onNotDeclined); 1.128 + Assert.ok(subject.undecided.has("actual"), "EngineManager observed that 'actual' was undecided."); 1.129 + 1.130 + let declined = manager.getDeclined(); 1.131 + _("Declined: " + JSON.stringify(declined)); 1.132 + 1.133 + Assert.equal(declined.indexOf("actual"), -1, "'actual' is locally disabled, but not marked as declined."); 1.134 + 1.135 + Assert.equal(declined.indexOf("clients"), -1, "'clients' is enabled and not remotely declined."); 1.136 + Assert.equal(declined.indexOf("petrol"), -1, "'petrol' is enabled and not remotely declined."); 1.137 + Assert.equal(declined.indexOf("diesel"), -1, "'diesel' is enabled and not remotely declined."); 1.138 + Assert.equal(declined.indexOf("dummy"), -1, "'dummy' is enabled and not remotely declined."); 1.139 + 1.140 + Assert.ok(0 <= declined.indexOf("nonexistent"), "'nonexistent' was declined on the server."); 1.141 + 1.142 + Assert.ok(0 <= declined.indexOf("localdecline"), "'localdecline' was declined locally."); 1.143 + 1.144 + // The meta/global is modified, too. 1.145 + Assert.ok(0 <= meta.payload.declined.indexOf("nonexistent"), "meta/global's declined contains 'nonexistent'."); 1.146 + Assert.ok(0 <= meta.payload.declined.indexOf("localdecline"), "meta/global's declined contains 'localdecline'."); 1.147 + Assert.strictEqual(true, meta.changed, "meta/global was changed."); 1.148 + 1.149 + run_next_test(); 1.150 + } 1.151 + 1.152 + Observers.add("weave:engines:notdeclined", onNotDeclined); 1.153 + 1.154 + declinedEngines.updateDeclined(meta, manager); 1.155 +}); 1.156 +