|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 Cu.import("resource://services-sync/engines.js"); |
|
5 Cu.import("resource://services-sync/engines/clients.js"); |
|
6 Cu.import("resource://services-sync/constants.js"); |
|
7 Cu.import("resource://services-sync/service.js"); |
|
8 Cu.import("resource://services-sync/status.js"); |
|
9 Cu.import("resource://services-sync/util.js"); |
|
10 Cu.import("resource://testing-common/services/sync/rotaryengine.js"); |
|
11 Cu.import("resource://testing-common/services/sync/utils.js"); |
|
12 |
|
13 Service.engineManager.clear(); |
|
14 Service.engineManager.register(RotaryEngine); |
|
15 let engine = Service.engineManager.get("rotary"); |
|
16 let tracker = engine._tracker; |
|
17 engine.enabled = true; |
|
18 |
|
19 // Tracking info/collections. |
|
20 let collectionsHelper = track_collections_helper(); |
|
21 let upd = collectionsHelper.with_updated_collection; |
|
22 |
|
23 function sync_httpd_setup() { |
|
24 let handlers = {}; |
|
25 |
|
26 handlers["/1.1/johndoe/storage/meta/global"] = |
|
27 new ServerWBO("global", {}).handler(); |
|
28 handlers["/1.1/johndoe/storage/steam"] = |
|
29 new ServerWBO("steam", {}).handler(); |
|
30 |
|
31 handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler; |
|
32 delete collectionsHelper.collections.crypto; |
|
33 delete collectionsHelper.collections.meta; |
|
34 |
|
35 let cr = new ServerWBO("keys"); |
|
36 handlers["/1.1/johndoe/storage/crypto/keys"] = |
|
37 upd("crypto", cr.handler()); |
|
38 |
|
39 let cl = new ServerCollection(); |
|
40 handlers["/1.1/johndoe/storage/clients"] = |
|
41 upd("clients", cl.handler()); |
|
42 |
|
43 return httpd_setup(handlers); |
|
44 } |
|
45 |
|
46 function setUp(server) { |
|
47 new SyncTestingInfrastructure(server, "johndoe", "ilovejane", "sekrit"); |
|
48 } |
|
49 |
|
50 function run_test() { |
|
51 initTestLogging("Trace"); |
|
52 |
|
53 Log.repository.getLogger("Sync.Service").level = Log.Level.Trace; |
|
54 |
|
55 run_next_test(); |
|
56 } |
|
57 |
|
58 add_test(function test_tracker_score_updated() { |
|
59 let scoreUpdated = 0; |
|
60 |
|
61 function onScoreUpdated() { |
|
62 scoreUpdated++; |
|
63 } |
|
64 |
|
65 Svc.Obs.add("weave:engine:score:updated", onScoreUpdated()); |
|
66 |
|
67 try { |
|
68 do_check_eq(engine.score, 0); |
|
69 |
|
70 tracker.score += SCORE_INCREMENT_SMALL; |
|
71 do_check_eq(engine.score, SCORE_INCREMENT_SMALL); |
|
72 |
|
73 do_check_eq(scoreUpdated, 1); |
|
74 } finally { |
|
75 Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated); |
|
76 tracker.resetScore(); |
|
77 run_next_test(); |
|
78 } |
|
79 }); |
|
80 |
|
81 add_test(function test_sync_triggered() { |
|
82 let server = sync_httpd_setup(); |
|
83 setUp(server); |
|
84 |
|
85 Service.login(); |
|
86 |
|
87 Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; |
|
88 Svc.Obs.add("weave:service:sync:finish", function onSyncFinish() { |
|
89 Svc.Obs.remove("weave:service:sync:finish", onSyncFinish); |
|
90 _("Sync completed!"); |
|
91 server.stop(run_next_test); |
|
92 }); |
|
93 |
|
94 do_check_eq(Status.login, LOGIN_SUCCEEDED); |
|
95 tracker.score += SCORE_INCREMENT_XLARGE; |
|
96 }); |
|
97 |
|
98 add_test(function test_clients_engine_sync_triggered() { |
|
99 _("Ensure that client engine score changes trigger a sync."); |
|
100 |
|
101 // The clients engine is not registered like other engines. Therefore, |
|
102 // it needs special treatment throughout the code. Here, we verify the |
|
103 // global score tracker gives it that treatment. See bug 676042 for more. |
|
104 |
|
105 let server = sync_httpd_setup(); |
|
106 setUp(server); |
|
107 Service.login(); |
|
108 |
|
109 const TOPIC = "weave:service:sync:finish"; |
|
110 Svc.Obs.add(TOPIC, function onSyncFinish() { |
|
111 Svc.Obs.remove(TOPIC, onSyncFinish); |
|
112 _("Sync due to clients engine change completed."); |
|
113 server.stop(run_next_test); |
|
114 }); |
|
115 |
|
116 Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; |
|
117 do_check_eq(Status.login, LOGIN_SUCCEEDED); |
|
118 Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE; |
|
119 }); |
|
120 |
|
121 add_test(function test_incorrect_credentials_sync_not_triggered() { |
|
122 _("Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."); |
|
123 let server = sync_httpd_setup(); |
|
124 setUp(server); |
|
125 |
|
126 // Ensure we don't actually try to sync. |
|
127 function onSyncStart() { |
|
128 do_throw("Should not get here!"); |
|
129 } |
|
130 Svc.Obs.add("weave:service:sync:start", onSyncStart); |
|
131 |
|
132 // First wait >100ms (nsITimers can take up to that much time to fire, so |
|
133 // we can account for the timer in delayedAutoconnect) and then one event |
|
134 // loop tick (to account for a possible call to weave:service:sync:start). |
|
135 Utils.namedTimer(function() { |
|
136 Utils.nextTick(function() { |
|
137 Svc.Obs.remove("weave:service:sync:start", onSyncStart); |
|
138 |
|
139 do_check_eq(Status.login, LOGIN_FAILED_LOGIN_REJECTED); |
|
140 |
|
141 Service.startOver(); |
|
142 server.stop(run_next_test); |
|
143 }); |
|
144 }, 150, {}, "timer"); |
|
145 |
|
146 // Faking incorrect credentials to prevent score update. |
|
147 Status.login = LOGIN_FAILED_LOGIN_REJECTED; |
|
148 tracker.score += SCORE_INCREMENT_XLARGE; |
|
149 }); |