gecko-dev/services/sync/tests/unit/test_syncstoragerequest.js

216 lines
6.9 KiB
JavaScript

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