michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Cu.import("resource://gre/modules/Log.jsm"); michael@0: Cu.import("resource://services-sync/constants.js"); michael@0: Cu.import("resource://services-sync/rest.js"); michael@0: Cu.import("resource://services-sync/service.js"); michael@0: Cu.import("resource://services-sync/util.js"); michael@0: Cu.import("resource://testing-common/services/sync/utils.js"); michael@0: michael@0: function run_test() { michael@0: Log.repository.getLogger("Sync.RESTRequest").level = Log.Level.Trace; michael@0: initTestLogging(); michael@0: michael@0: ensureLegacyIdentityManager(); michael@0: michael@0: run_next_test(); michael@0: } michael@0: michael@0: add_test(function test_user_agent_desktop() { michael@0: let handler = httpd_handler(200, "OK"); michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + michael@0: " FxSync/" + WEAVE_VERSION + "." + michael@0: Services.appinfo.appBuildID + ".desktop"; michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.onComplete = function onComplete(error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); michael@0: server.stop(run_next_test); michael@0: }; michael@0: do_check_eq(request.get(), request); michael@0: }); michael@0: michael@0: add_test(function test_user_agent_mobile() { michael@0: let handler = httpd_handler(200, "OK"); michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: Svc.Prefs.set("client.type", "mobile"); michael@0: let expectedUA = Services.appinfo.name + "/" + Services.appinfo.version + michael@0: " FxSync/" + WEAVE_VERSION + "." + michael@0: Services.appinfo.appBuildID + ".mobile"; michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_eq(handler.request.getHeader("User-Agent"), expectedUA); michael@0: Svc.Prefs.resetBranch(""); michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_auth() { michael@0: let handler = httpd_handler(200, "OK"); michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: setBasicCredentials("johndoe", "ilovejane", "XXXXXXXXX"); michael@0: michael@0: let request = Service.getStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_true(basic_auth_matches(handler.request, "johndoe", "ilovejane")); michael@0: michael@0: Svc.Prefs.reset(""); michael@0: michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * The X-Weave-Timestamp header updates SyncStorageRequest.serverTime. michael@0: */ michael@0: add_test(function test_weave_timestamp() { michael@0: const TIMESTAMP = 1274380461; michael@0: function handler(request, response) { michael@0: response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); michael@0: response.setStatusLine(request.httpVersion, 200, "OK"); michael@0: } michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: do_check_eq(SyncStorageRequest.serverTime, undefined); michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_eq(SyncStorageRequest.serverTime, TIMESTAMP); michael@0: delete SyncStorageRequest.serverTime; michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * The X-Weave-Backoff header notifies an observer. michael@0: */ michael@0: add_test(function test_weave_backoff() { michael@0: function handler(request, response) { michael@0: response.setHeader("X-Weave-Backoff", '600', false); michael@0: response.setStatusLine(request.httpVersion, 200, "OK"); michael@0: } michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: let backoffInterval; michael@0: Svc.Obs.add("weave:service:backoff:interval", function onBackoff(subject) { michael@0: Svc.Obs.remove("weave:service:backoff:interval", onBackoff); michael@0: backoffInterval = subject; michael@0: }); michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_eq(backoffInterval, 600); michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * X-Weave-Quota-Remaining header notifies observer on successful requests. michael@0: */ michael@0: add_test(function test_weave_quota_notice() { michael@0: function handler(request, response) { michael@0: response.setHeader("X-Weave-Quota-Remaining", '1048576', false); michael@0: response.setStatusLine(request.httpVersion, 200, "OK"); michael@0: } michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: let quotaValue; michael@0: Svc.Obs.add("weave:service:quota:remaining", function onQuota(subject) { michael@0: Svc.Obs.remove("weave:service:quota:remaining", onQuota); michael@0: quotaValue = subject; michael@0: }); michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 200); michael@0: do_check_eq(quotaValue, 1048576); michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * X-Weave-Quota-Remaining header doesn't notify observer on failed requests. michael@0: */ michael@0: add_test(function test_weave_quota_error() { michael@0: function handler(request, response) { michael@0: response.setHeader("X-Weave-Quota-Remaining", '1048576', false); michael@0: response.setStatusLine(request.httpVersion, 400, "Bad Request"); michael@0: } michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: let quotaValue; michael@0: function onQuota(subject) { michael@0: quotaValue = subject; michael@0: } michael@0: Svc.Obs.add("weave:service:quota:remaining", onQuota); michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: request.get(function (error) { michael@0: do_check_eq(error, null); michael@0: do_check_eq(this.response.status, 400); michael@0: do_check_eq(quotaValue, undefined); michael@0: Svc.Obs.remove("weave:service:quota:remaining", onQuota); michael@0: server.stop(run_next_test); michael@0: }); michael@0: }); michael@0: michael@0: add_test(function test_abort() { michael@0: function handler(request, response) { michael@0: response.setHeader("X-Weave-Timestamp", "" + TIMESTAMP, false); michael@0: response.setHeader("X-Weave-Quota-Remaining", '1048576', false); michael@0: response.setHeader("X-Weave-Backoff", '600', false); michael@0: response.setStatusLine(request.httpVersion, 200, "OK"); michael@0: } michael@0: let server = httpd_setup({"/resource": handler}); michael@0: michael@0: let request = new SyncStorageRequest(server.baseURI + "/resource"); michael@0: michael@0: // Aborting a request that hasn't been sent yet is pointless and will throw. michael@0: do_check_throws(function () { michael@0: request.abort(); michael@0: }); michael@0: michael@0: function throwy() { michael@0: do_throw("Shouldn't have gotten here!"); michael@0: } michael@0: michael@0: Svc.Obs.add("weave:service:backoff:interval", throwy); michael@0: Svc.Obs.add("weave:service:quota:remaining", throwy); michael@0: request.onProgress = request.onComplete = throwy; michael@0: michael@0: request.get(); michael@0: request.abort(); michael@0: do_check_eq(request.status, request.ABORTED); michael@0: michael@0: // Aborting an already aborted request is pointless and will throw. michael@0: do_check_throws(function () { michael@0: request.abort(); michael@0: }); michael@0: michael@0: Utils.nextTick(function () { michael@0: // Verify that we didn't try to process any of the values. michael@0: do_check_eq(SyncStorageRequest.serverTime, undefined); michael@0: michael@0: Svc.Obs.remove("weave:service:backoff:interval", throwy); michael@0: Svc.Obs.remove("weave:service:quota:remaining", throwy); michael@0: michael@0: server.stop(run_next_test); michael@0: }); michael@0: });