|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 Cu.import("resource://gre/modules/Log.jsm"); |
|
5 Cu.import("resource://services-sync/constants.js"); |
|
6 Cu.import("resource://services-sync/rest.js"); |
|
7 Cu.import("resource://services-sync/service.js"); |
|
8 Cu.import("resource://services-sync/util.js"); |
|
9 Cu.import("resource://testing-common/services/sync/utils.js"); |
|
10 |
|
11 function run_test() { |
|
12 Log.repository.getLogger("Sync.RESTRequest").level = Log.Level.Trace; |
|
13 initTestLogging(); |
|
14 |
|
15 ensureLegacyIdentityManager(); |
|
16 |
|
17 run_next_test(); |
|
18 } |
|
19 |
|
20 add_test(function test_user_agent_desktop() { |
|
21 let handler = httpd_handler(200, "OK"); |
|
22 let server = httpd_setup({"/resource": handler}); |
|
23 |
|
24 let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + |
|
25 " FxSync/" + WEAVE_VERSION + "." + |
|
26 Services.appinfo.appBuildID + ".desktop"; |
|
27 |
|
28 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
29 request.onComplete = function onComplete(error) { |
|
30 do_check_eq(error, null); |
|
31 do_check_eq(this.response.status, 200); |
|
32 do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); |
|
33 server.stop(run_next_test); |
|
34 }; |
|
35 do_check_eq(request.get(), request); |
|
36 }); |
|
37 |
|
38 add_test(function test_user_agent_mobile() { |
|
39 let handler = httpd_handler(200, "OK"); |
|
40 let server = httpd_setup({"/resource": handler}); |
|
41 |
|
42 Svc.Prefs.set("client.type", "mobile"); |
|
43 let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + |
|
44 " FxSync/" + WEAVE_VERSION + "." + |
|
45 Services.appinfo.appBuildID + ".mobile"; |
|
46 |
|
47 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
48 request.get(function (error) { |
|
49 do_check_eq(error, null); |
|
50 do_check_eq(this.response.status, 200); |
|
51 do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); |
|
52 Svc.Prefs.resetBranch(""); |
|
53 server.stop(run_next_test); |
|
54 }); |
|
55 }); |
|
56 |
|
57 add_test(function test_auth() { |
|
58 let handler = httpd_handler(200, "OK"); |
|
59 let server = httpd_setup({"/resource": handler}); |
|
60 |
|
61 setBasicCredentials("johndoe", "ilovejane", "XXXXXXXXX"); |
|
62 |
|
63 let request = Service.getStorageRequest(server.baseURI + "/resource"); |
|
64 request.get(function (error) { |
|
65 do_check_eq(error, null); |
|
66 do_check_eq(this.response.status, 200); |
|
67 do_check_true(basic_auth_matches(handler.request, "johndoe", "ilovejane")); |
|
68 |
|
69 Svc.Prefs.reset(""); |
|
70 |
|
71 server.stop(run_next_test); |
|
72 }); |
|
73 }); |
|
74 |
|
75 /** |
|
76 * The X-Weave-Timestamp header updates SyncStorageRequest.serverTime. |
|
77 */ |
|
78 add_test(function test_weave_timestamp() { |
|
79 const TIMESTAMP = 1274380461; |
|
80 function handler(request, response) { |
|
81 response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); |
|
82 response.setStatusLine(request.httpVersion, 200, "OK"); |
|
83 } |
|
84 let server = httpd_setup({"/resource": handler}); |
|
85 |
|
86 do_check_eq(SyncStorageRequest.serverTime, undefined); |
|
87 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
88 request.get(function (error) { |
|
89 do_check_eq(error, null); |
|
90 do_check_eq(this.response.status, 200); |
|
91 do_check_eq(SyncStorageRequest.serverTime, TIMESTAMP); |
|
92 delete SyncStorageRequest.serverTime; |
|
93 server.stop(run_next_test); |
|
94 }); |
|
95 }); |
|
96 |
|
97 /** |
|
98 * The X-Weave-Backoff header notifies an observer. |
|
99 */ |
|
100 add_test(function test_weave_backoff() { |
|
101 function handler(request, response) { |
|
102 response.setHeader("X-Weave-Backoff", '600', false); |
|
103 response.setStatusLine(request.httpVersion, 200, "OK"); |
|
104 } |
|
105 let server = httpd_setup({"/resource": handler}); |
|
106 |
|
107 let backoffInterval; |
|
108 Svc.Obs.add("weave:service:backoff:interval", function onBackoff(subject) { |
|
109 Svc.Obs.remove("weave:service:backoff:interval", onBackoff); |
|
110 backoffInterval = subject; |
|
111 }); |
|
112 |
|
113 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
114 request.get(function (error) { |
|
115 do_check_eq(error, null); |
|
116 do_check_eq(this.response.status, 200); |
|
117 do_check_eq(backoffInterval, 600); |
|
118 server.stop(run_next_test); |
|
119 }); |
|
120 }); |
|
121 |
|
122 /** |
|
123 * X-Weave-Quota-Remaining header notifies observer on successful requests. |
|
124 */ |
|
125 add_test(function test_weave_quota_notice() { |
|
126 function handler(request, response) { |
|
127 response.setHeader("X-Weave-Quota-Remaining", '1048576', false); |
|
128 response.setStatusLine(request.httpVersion, 200, "OK"); |
|
129 } |
|
130 let server = httpd_setup({"/resource": handler}); |
|
131 |
|
132 let quotaValue; |
|
133 Svc.Obs.add("weave:service:quota:remaining", function onQuota(subject) { |
|
134 Svc.Obs.remove("weave:service:quota:remaining", onQuota); |
|
135 quotaValue = subject; |
|
136 }); |
|
137 |
|
138 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
139 request.get(function (error) { |
|
140 do_check_eq(error, null); |
|
141 do_check_eq(this.response.status, 200); |
|
142 do_check_eq(quotaValue, 1048576); |
|
143 server.stop(run_next_test); |
|
144 }); |
|
145 }); |
|
146 |
|
147 /** |
|
148 * X-Weave-Quota-Remaining header doesn't notify observer on failed requests. |
|
149 */ |
|
150 add_test(function test_weave_quota_error() { |
|
151 function handler(request, response) { |
|
152 response.setHeader("X-Weave-Quota-Remaining", '1048576', false); |
|
153 response.setStatusLine(request.httpVersion, 400, "Bad Request"); |
|
154 } |
|
155 let server = httpd_setup({"/resource": handler}); |
|
156 |
|
157 let quotaValue; |
|
158 function onQuota(subject) { |
|
159 quotaValue = subject; |
|
160 } |
|
161 Svc.Obs.add("weave:service:quota:remaining", onQuota); |
|
162 |
|
163 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
164 request.get(function (error) { |
|
165 do_check_eq(error, null); |
|
166 do_check_eq(this.response.status, 400); |
|
167 do_check_eq(quotaValue, undefined); |
|
168 Svc.Obs.remove("weave:service:quota:remaining", onQuota); |
|
169 server.stop(run_next_test); |
|
170 }); |
|
171 }); |
|
172 |
|
173 add_test(function test_abort() { |
|
174 function handler(request, response) { |
|
175 response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); |
|
176 response.setHeader("X-Weave-Quota-Remaining", '1048576', false); |
|
177 response.setHeader("X-Weave-Backoff", '600', false); |
|
178 response.setStatusLine(request.httpVersion, 200, "OK"); |
|
179 } |
|
180 let server = httpd_setup({"/resource": handler}); |
|
181 |
|
182 let request = new SyncStorageRequest(server.baseURI + "/resource"); |
|
183 |
|
184 // Aborting a request that hasn't been sent yet is pointless and will throw. |
|
185 do_check_throws(function () { |
|
186 request.abort(); |
|
187 }); |
|
188 |
|
189 function throwy() { |
|
190 do_throw("Shouldn't have gotten here!"); |
|
191 } |
|
192 |
|
193 Svc.Obs.add("weave:service:backoff:interval", throwy); |
|
194 Svc.Obs.add("weave:service:quota:remaining", throwy); |
|
195 request.onProgress = request.onComplete = throwy; |
|
196 |
|
197 request.get(); |
|
198 request.abort(); |
|
199 do_check_eq(request.status, request.ABORTED); |
|
200 |
|
201 // Aborting an already aborted request is pointless and will throw. |
|
202 do_check_throws(function () { |
|
203 request.abort(); |
|
204 }); |
|
205 |
|
206 Utils.nextTick(function () { |
|
207 // Verify that we didn't try to process any of the values. |
|
208 do_check_eq(SyncStorageRequest.serverTime, undefined); |
|
209 |
|
210 Svc.Obs.remove("weave:service:backoff:interval", throwy); |
|
211 Svc.Obs.remove("weave:service:quota:remaining", throwy); |
|
212 |
|
213 server.stop(run_next_test); |
|
214 }); |
|
215 }); |