1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_syncstoragerequest.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,215 @@ 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://gre/modules/Log.jsm"); 1.8 +Cu.import("resource://services-sync/constants.js"); 1.9 +Cu.import("resource://services-sync/rest.js"); 1.10 +Cu.import("resource://services-sync/service.js"); 1.11 +Cu.import("resource://services-sync/util.js"); 1.12 +Cu.import("resource://testing-common/services/sync/utils.js"); 1.13 + 1.14 +function run_test() { 1.15 + Log.repository.getLogger("Sync.RESTRequest").level = Log.Level.Trace; 1.16 + initTestLogging(); 1.17 + 1.18 + ensureLegacyIdentityManager(); 1.19 + 1.20 + run_next_test(); 1.21 +} 1.22 + 1.23 +add_test(function test_user_agent_desktop() { 1.24 + let handler = httpd_handler(200, "OK"); 1.25 + let server = httpd_setup({"/resource": handler}); 1.26 + 1.27 + let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + 1.28 + " FxSync/" + WEAVE_VERSION + "." + 1.29 + Services.appinfo.appBuildID + ".desktop"; 1.30 + 1.31 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.32 + request.onComplete = function onComplete(error) { 1.33 + do_check_eq(error, null); 1.34 + do_check_eq(this.response.status, 200); 1.35 + do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); 1.36 + server.stop(run_next_test); 1.37 + }; 1.38 + do_check_eq(request.get(), request); 1.39 +}); 1.40 + 1.41 +add_test(function test_user_agent_mobile() { 1.42 + let handler = httpd_handler(200, "OK"); 1.43 + let server = httpd_setup({"/resource": handler}); 1.44 + 1.45 + Svc.Prefs.set("client.type", "mobile"); 1.46 + let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + 1.47 + " FxSync/" + WEAVE_VERSION + "." + 1.48 + Services.appinfo.appBuildID + ".mobile"; 1.49 + 1.50 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.51 + request.get(function (error) { 1.52 + do_check_eq(error, null); 1.53 + do_check_eq(this.response.status, 200); 1.54 + do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); 1.55 + Svc.Prefs.resetBranch(""); 1.56 + server.stop(run_next_test); 1.57 + }); 1.58 +}); 1.59 + 1.60 +add_test(function test_auth() { 1.61 + let handler = httpd_handler(200, "OK"); 1.62 + let server = httpd_setup({"/resource": handler}); 1.63 + 1.64 + setBasicCredentials("johndoe", "ilovejane", "XXXXXXXXX"); 1.65 + 1.66 + let request = Service.getStorageRequest(server.baseURI + "/resource"); 1.67 + request.get(function (error) { 1.68 + do_check_eq(error, null); 1.69 + do_check_eq(this.response.status, 200); 1.70 + do_check_true(basic_auth_matches(handler.request, "johndoe", "ilovejane")); 1.71 + 1.72 + Svc.Prefs.reset(""); 1.73 + 1.74 + server.stop(run_next_test); 1.75 + }); 1.76 +}); 1.77 + 1.78 +/** 1.79 + * The X-Weave-Timestamp header updates SyncStorageRequest.serverTime. 1.80 + */ 1.81 +add_test(function test_weave_timestamp() { 1.82 + const TIMESTAMP = 1274380461; 1.83 + function handler(request, response) { 1.84 + response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); 1.85 + response.setStatusLine(request.httpVersion, 200, "OK"); 1.86 + } 1.87 + let server = httpd_setup({"/resource": handler}); 1.88 + 1.89 + do_check_eq(SyncStorageRequest.serverTime, undefined); 1.90 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.91 + request.get(function (error) { 1.92 + do_check_eq(error, null); 1.93 + do_check_eq(this.response.status, 200); 1.94 + do_check_eq(SyncStorageRequest.serverTime, TIMESTAMP); 1.95 + delete SyncStorageRequest.serverTime; 1.96 + server.stop(run_next_test); 1.97 + }); 1.98 +}); 1.99 + 1.100 +/** 1.101 + * The X-Weave-Backoff header notifies an observer. 1.102 + */ 1.103 +add_test(function test_weave_backoff() { 1.104 + function handler(request, response) { 1.105 + response.setHeader("X-Weave-Backoff", '600', false); 1.106 + response.setStatusLine(request.httpVersion, 200, "OK"); 1.107 + } 1.108 + let server = httpd_setup({"/resource": handler}); 1.109 + 1.110 + let backoffInterval; 1.111 + Svc.Obs.add("weave:service:backoff:interval", function onBackoff(subject) { 1.112 + Svc.Obs.remove("weave:service:backoff:interval", onBackoff); 1.113 + backoffInterval = subject; 1.114 + }); 1.115 + 1.116 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.117 + request.get(function (error) { 1.118 + do_check_eq(error, null); 1.119 + do_check_eq(this.response.status, 200); 1.120 + do_check_eq(backoffInterval, 600); 1.121 + server.stop(run_next_test); 1.122 + }); 1.123 +}); 1.124 + 1.125 +/** 1.126 + * X-Weave-Quota-Remaining header notifies observer on successful requests. 1.127 + */ 1.128 +add_test(function test_weave_quota_notice() { 1.129 + function handler(request, response) { 1.130 + response.setHeader("X-Weave-Quota-Remaining", '1048576', false); 1.131 + response.setStatusLine(request.httpVersion, 200, "OK"); 1.132 + } 1.133 + let server = httpd_setup({"/resource": handler}); 1.134 + 1.135 + let quotaValue; 1.136 + Svc.Obs.add("weave:service:quota:remaining", function onQuota(subject) { 1.137 + Svc.Obs.remove("weave:service:quota:remaining", onQuota); 1.138 + quotaValue = subject; 1.139 + }); 1.140 + 1.141 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.142 + request.get(function (error) { 1.143 + do_check_eq(error, null); 1.144 + do_check_eq(this.response.status, 200); 1.145 + do_check_eq(quotaValue, 1048576); 1.146 + server.stop(run_next_test); 1.147 + }); 1.148 +}); 1.149 + 1.150 +/** 1.151 + * X-Weave-Quota-Remaining header doesn't notify observer on failed requests. 1.152 + */ 1.153 +add_test(function test_weave_quota_error() { 1.154 + function handler(request, response) { 1.155 + response.setHeader("X-Weave-Quota-Remaining", '1048576', false); 1.156 + response.setStatusLine(request.httpVersion, 400, "Bad Request"); 1.157 + } 1.158 + let server = httpd_setup({"/resource": handler}); 1.159 + 1.160 + let quotaValue; 1.161 + function onQuota(subject) { 1.162 + quotaValue = subject; 1.163 + } 1.164 + Svc.Obs.add("weave:service:quota:remaining", onQuota); 1.165 + 1.166 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.167 + request.get(function (error) { 1.168 + do_check_eq(error, null); 1.169 + do_check_eq(this.response.status, 400); 1.170 + do_check_eq(quotaValue, undefined); 1.171 + Svc.Obs.remove("weave:service:quota:remaining", onQuota); 1.172 + server.stop(run_next_test); 1.173 + }); 1.174 +}); 1.175 + 1.176 +add_test(function test_abort() { 1.177 + function handler(request, response) { 1.178 + response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); 1.179 + response.setHeader("X-Weave-Quota-Remaining", '1048576', false); 1.180 + response.setHeader("X-Weave-Backoff", '600', false); 1.181 + response.setStatusLine(request.httpVersion, 200, "OK"); 1.182 + } 1.183 + let server = httpd_setup({"/resource": handler}); 1.184 + 1.185 + let request = new SyncStorageRequest(server.baseURI + "/resource"); 1.186 + 1.187 + // Aborting a request that hasn't been sent yet is pointless and will throw. 1.188 + do_check_throws(function () { 1.189 + request.abort(); 1.190 + }); 1.191 + 1.192 + function throwy() { 1.193 + do_throw("Shouldn't have gotten here!"); 1.194 + } 1.195 + 1.196 + Svc.Obs.add("weave:service:backoff:interval", throwy); 1.197 + Svc.Obs.add("weave:service:quota:remaining", throwy); 1.198 + request.onProgress = request.onComplete = throwy; 1.199 + 1.200 + request.get(); 1.201 + request.abort(); 1.202 + do_check_eq(request.status, request.ABORTED); 1.203 + 1.204 + // Aborting an already aborted request is pointless and will throw. 1.205 + do_check_throws(function () { 1.206 + request.abort(); 1.207 + }); 1.208 + 1.209 + Utils.nextTick(function () { 1.210 + // Verify that we didn't try to process any of the values. 1.211 + do_check_eq(SyncStorageRequest.serverTime, undefined); 1.212 + 1.213 + Svc.Obs.remove("weave:service:backoff:interval", throwy); 1.214 + Svc.Obs.remove("weave:service:quota:remaining", throwy); 1.215 + 1.216 + server.stop(run_next_test); 1.217 + }); 1.218 +});