|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 Cu.import("resource://services-sync/service.js"); |
|
5 Cu.import("resource://services-sync/status.js"); |
|
6 Cu.import("resource://services-sync/util.js"); |
|
7 |
|
8 Cu.import("resource://testing-common/services/sync/fakeservices.js"); |
|
9 Cu.import("resource://testing-common/services/sync/utils.js"); |
|
10 |
|
11 function baseHandler(eolCode, request, response, statusCode, status, body) { |
|
12 let alertBody = { |
|
13 code: eolCode, |
|
14 message: "Service is EOLed.", |
|
15 url: "http://getfirefox.com", |
|
16 }; |
|
17 response.setHeader("X-Weave-Timestamp", "" + new_timestamp(), false); |
|
18 response.setHeader("X-Weave-Alert", "" + JSON.stringify(alertBody), false); |
|
19 response.setStatusLine(request.httpVersion, statusCode, status); |
|
20 response.bodyOutputStream.write(body, body.length); |
|
21 } |
|
22 |
|
23 function handler513(request, response) { |
|
24 let statusCode = 513; |
|
25 let status = "Upgrade Required"; |
|
26 let body = "{}"; |
|
27 baseHandler("hard-eol", request, response, statusCode, status, body); |
|
28 } |
|
29 |
|
30 function handler200(eolCode) { |
|
31 return function (request, response) { |
|
32 let statusCode = 200; |
|
33 let status = "OK"; |
|
34 let body = "{\"meta\": 123456789010}"; |
|
35 baseHandler(eolCode, request, response, statusCode, status, body); |
|
36 }; |
|
37 } |
|
38 |
|
39 function sync_httpd_setup(infoHandler) { |
|
40 let handlers = { |
|
41 "/1.1/johndoe/info/collections": infoHandler, |
|
42 }; |
|
43 return httpd_setup(handlers); |
|
44 } |
|
45 |
|
46 function setUp(server) { |
|
47 yield configureIdentity({username: "johndoe"}); |
|
48 Service.serverURL = server.baseURI + "/"; |
|
49 Service.clusterURL = server.baseURI + "/"; |
|
50 new FakeCryptoService(); |
|
51 } |
|
52 |
|
53 function run_test() { |
|
54 run_next_test(); |
|
55 } |
|
56 |
|
57 function do_check_soft_eol(eh, start) { |
|
58 // We subtract 1000 because the stored value is in second precision. |
|
59 do_check_true(eh.earliestNextAlert >= (start + eh.MINIMUM_ALERT_INTERVAL_MSEC - 1000)); |
|
60 do_check_eq("soft-eol", eh.currentAlertMode); |
|
61 } |
|
62 function do_check_hard_eol(eh, start) { |
|
63 // We subtract 1000 because the stored value is in second precision. |
|
64 do_check_true(eh.earliestNextAlert >= (start + eh.MINIMUM_ALERT_INTERVAL_MSEC - 1000)); |
|
65 do_check_eq("hard-eol", eh.currentAlertMode); |
|
66 do_check_true(Status.eol); |
|
67 } |
|
68 |
|
69 add_identity_test(this, function test_200_hard() { |
|
70 let eh = Service.errorHandler; |
|
71 let start = Date.now(); |
|
72 let server = sync_httpd_setup(handler200("hard-eol")); |
|
73 yield setUp(server); |
|
74 |
|
75 let deferred = Promise.defer(); |
|
76 let obs = function (subject, topic, data) { |
|
77 Svc.Obs.remove("weave:eol", obs); |
|
78 do_check_eq("hard-eol", subject.code); |
|
79 do_check_hard_eol(eh, start); |
|
80 do_check_eq(Service.scheduler.eolInterval, Service.scheduler.syncInterval); |
|
81 eh.clearServerAlerts(); |
|
82 server.stop(deferred.resolve); |
|
83 }; |
|
84 |
|
85 Svc.Obs.add("weave:eol", obs); |
|
86 Service._fetchInfo(); |
|
87 Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. |
|
88 yield deferred.promise; |
|
89 }); |
|
90 |
|
91 add_identity_test(this, function test_513_hard() { |
|
92 let eh = Service.errorHandler; |
|
93 let start = Date.now(); |
|
94 let server = sync_httpd_setup(handler513); |
|
95 yield setUp(server); |
|
96 |
|
97 let deferred = Promise.defer(); |
|
98 let obs = function (subject, topic, data) { |
|
99 Svc.Obs.remove("weave:eol", obs); |
|
100 do_check_eq("hard-eol", subject.code); |
|
101 do_check_hard_eol(eh, start); |
|
102 do_check_eq(Service.scheduler.eolInterval, Service.scheduler.syncInterval); |
|
103 eh.clearServerAlerts(); |
|
104 server.stop(deferred.resolve); |
|
105 }; |
|
106 |
|
107 Svc.Obs.add("weave:eol", obs); |
|
108 try { |
|
109 Service._fetchInfo(); |
|
110 Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. |
|
111 } catch (ex) { |
|
112 // Because fetchInfo will fail on a 513. |
|
113 } |
|
114 yield deferred.promise; |
|
115 }); |
|
116 |
|
117 add_identity_test(this, function test_200_soft() { |
|
118 let eh = Service.errorHandler; |
|
119 let start = Date.now(); |
|
120 let server = sync_httpd_setup(handler200("soft-eol")); |
|
121 yield setUp(server); |
|
122 |
|
123 let deferred = Promise.defer(); |
|
124 let obs = function (subject, topic, data) { |
|
125 Svc.Obs.remove("weave:eol", obs); |
|
126 do_check_eq("soft-eol", subject.code); |
|
127 do_check_soft_eol(eh, start); |
|
128 do_check_eq(Service.scheduler.singleDeviceInterval, Service.scheduler.syncInterval); |
|
129 eh.clearServerAlerts(); |
|
130 server.stop(deferred.resolve); |
|
131 }; |
|
132 |
|
133 Svc.Obs.add("weave:eol", obs); |
|
134 Service._fetchInfo(); |
|
135 Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. |
|
136 yield deferred.promise; |
|
137 }); |