1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_errorhandler_eol.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,137 @@ 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://services-sync/service.js"); 1.8 +Cu.import("resource://services-sync/status.js"); 1.9 +Cu.import("resource://services-sync/util.js"); 1.10 + 1.11 +Cu.import("resource://testing-common/services/sync/fakeservices.js"); 1.12 +Cu.import("resource://testing-common/services/sync/utils.js"); 1.13 + 1.14 +function baseHandler(eolCode, request, response, statusCode, status, body) { 1.15 + let alertBody = { 1.16 + code: eolCode, 1.17 + message: "Service is EOLed.", 1.18 + url: "http://getfirefox.com", 1.19 + }; 1.20 + response.setHeader("X-Weave-Timestamp", "" + new_timestamp(), false); 1.21 + response.setHeader("X-Weave-Alert", "" + JSON.stringify(alertBody), false); 1.22 + response.setStatusLine(request.httpVersion, statusCode, status); 1.23 + response.bodyOutputStream.write(body, body.length); 1.24 +} 1.25 + 1.26 +function handler513(request, response) { 1.27 + let statusCode = 513; 1.28 + let status = "Upgrade Required"; 1.29 + let body = "{}"; 1.30 + baseHandler("hard-eol", request, response, statusCode, status, body); 1.31 +} 1.32 + 1.33 +function handler200(eolCode) { 1.34 + return function (request, response) { 1.35 + let statusCode = 200; 1.36 + let status = "OK"; 1.37 + let body = "{\"meta\": 123456789010}"; 1.38 + baseHandler(eolCode, request, response, statusCode, status, body); 1.39 + }; 1.40 +} 1.41 + 1.42 +function sync_httpd_setup(infoHandler) { 1.43 + let handlers = { 1.44 + "/1.1/johndoe/info/collections": infoHandler, 1.45 + }; 1.46 + return httpd_setup(handlers); 1.47 +} 1.48 + 1.49 +function setUp(server) { 1.50 + yield configureIdentity({username: "johndoe"}); 1.51 + Service.serverURL = server.baseURI + "/"; 1.52 + Service.clusterURL = server.baseURI + "/"; 1.53 + new FakeCryptoService(); 1.54 +} 1.55 + 1.56 +function run_test() { 1.57 + run_next_test(); 1.58 +} 1.59 + 1.60 +function do_check_soft_eol(eh, start) { 1.61 + // We subtract 1000 because the stored value is in second precision. 1.62 + do_check_true(eh.earliestNextAlert >= (start + eh.MINIMUM_ALERT_INTERVAL_MSEC - 1000)); 1.63 + do_check_eq("soft-eol", eh.currentAlertMode); 1.64 +} 1.65 +function do_check_hard_eol(eh, start) { 1.66 + // We subtract 1000 because the stored value is in second precision. 1.67 + do_check_true(eh.earliestNextAlert >= (start + eh.MINIMUM_ALERT_INTERVAL_MSEC - 1000)); 1.68 + do_check_eq("hard-eol", eh.currentAlertMode); 1.69 + do_check_true(Status.eol); 1.70 +} 1.71 + 1.72 +add_identity_test(this, function test_200_hard() { 1.73 + let eh = Service.errorHandler; 1.74 + let start = Date.now(); 1.75 + let server = sync_httpd_setup(handler200("hard-eol")); 1.76 + yield setUp(server); 1.77 + 1.78 + let deferred = Promise.defer(); 1.79 + let obs = function (subject, topic, data) { 1.80 + Svc.Obs.remove("weave:eol", obs); 1.81 + do_check_eq("hard-eol", subject.code); 1.82 + do_check_hard_eol(eh, start); 1.83 + do_check_eq(Service.scheduler.eolInterval, Service.scheduler.syncInterval); 1.84 + eh.clearServerAlerts(); 1.85 + server.stop(deferred.resolve); 1.86 + }; 1.87 + 1.88 + Svc.Obs.add("weave:eol", obs); 1.89 + Service._fetchInfo(); 1.90 + Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. 1.91 + yield deferred.promise; 1.92 +}); 1.93 + 1.94 +add_identity_test(this, function test_513_hard() { 1.95 + let eh = Service.errorHandler; 1.96 + let start = Date.now(); 1.97 + let server = sync_httpd_setup(handler513); 1.98 + yield setUp(server); 1.99 + 1.100 + let deferred = Promise.defer(); 1.101 + let obs = function (subject, topic, data) { 1.102 + Svc.Obs.remove("weave:eol", obs); 1.103 + do_check_eq("hard-eol", subject.code); 1.104 + do_check_hard_eol(eh, start); 1.105 + do_check_eq(Service.scheduler.eolInterval, Service.scheduler.syncInterval); 1.106 + eh.clearServerAlerts(); 1.107 + server.stop(deferred.resolve); 1.108 + }; 1.109 + 1.110 + Svc.Obs.add("weave:eol", obs); 1.111 + try { 1.112 + Service._fetchInfo(); 1.113 + Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. 1.114 + } catch (ex) { 1.115 + // Because fetchInfo will fail on a 513. 1.116 + } 1.117 + yield deferred.promise; 1.118 +}); 1.119 + 1.120 +add_identity_test(this, function test_200_soft() { 1.121 + let eh = Service.errorHandler; 1.122 + let start = Date.now(); 1.123 + let server = sync_httpd_setup(handler200("soft-eol")); 1.124 + yield setUp(server); 1.125 + 1.126 + let deferred = Promise.defer(); 1.127 + let obs = function (subject, topic, data) { 1.128 + Svc.Obs.remove("weave:eol", obs); 1.129 + do_check_eq("soft-eol", subject.code); 1.130 + do_check_soft_eol(eh, start); 1.131 + do_check_eq(Service.scheduler.singleDeviceInterval, Service.scheduler.syncInterval); 1.132 + eh.clearServerAlerts(); 1.133 + server.stop(deferred.resolve); 1.134 + }; 1.135 + 1.136 + Svc.Obs.add("weave:eol", obs); 1.137 + Service._fetchInfo(); 1.138 + Service.scheduler.adjustSyncInterval(); // As if we failed or succeeded in syncing. 1.139 + yield deferred.promise; 1.140 +});