head_errorhandler_common.js (6768B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 /* import-globals-from head_appinfo.js */ 5 /* import-globals-from ../../../common/tests/unit/head_helpers.js */ 6 /* import-globals-from head_helpers.js */ 7 /* import-globals-from head_http_server.js */ 8 9 // This file expects Service to be defined in the global scope when EHTestsCommon 10 // is used (from service.js). 11 /* global Service */ 12 13 var { Changeset, EngineManager, Store, SyncEngine, Tracker, LegacyTracker } = 14 ChromeUtils.importESModule("resource://services-sync/engines.sys.mjs"); 15 var { 16 ABORT_SYNC_COMMAND, 17 CLIENT_NOT_CONFIGURED, 18 CREDENTIALS_CHANGED, 19 DEFAULT_DOWNLOAD_BATCH_SIZE, 20 DEFAULT_GUID_FETCH_BATCH_SIZE, 21 DEFAULT_KEYBUNDLE_NAME, 22 DEVICE_TYPE_DESKTOP, 23 DEVICE_TYPE_MOBILE, 24 ENGINE_APPLY_FAIL, 25 ENGINE_BATCH_INTERRUPTED, 26 ENGINE_DOWNLOAD_FAIL, 27 ENGINE_SUCCEEDED, 28 ENGINE_UNKNOWN_FAIL, 29 ENGINE_UPLOAD_FAIL, 30 HMAC_EVENT_INTERVAL, 31 IDLE_OBSERVER_BACK_DELAY, 32 LOGIN_FAILED, 33 LOGIN_FAILED_INVALID_PASSPHRASE, 34 LOGIN_FAILED_LOGIN_REJECTED, 35 LOGIN_FAILED_NETWORK_ERROR, 36 LOGIN_FAILED_NO_PASSPHRASE, 37 LOGIN_FAILED_NO_USERNAME, 38 LOGIN_FAILED_SERVER_ERROR, 39 LOGIN_SUCCEEDED, 40 MASTER_PASSWORD_LOCKED, 41 MASTER_PASSWORD_LOCKED_RETRY_INTERVAL, 42 MAXIMUM_BACKOFF_INTERVAL, 43 MAX_ERROR_COUNT_BEFORE_BACKOFF, 44 MAX_HISTORY_DOWNLOAD, 45 MAX_HISTORY_UPLOAD, 46 METARECORD_DOWNLOAD_FAIL, 47 MINIMUM_BACKOFF_INTERVAL, 48 MULTI_DEVICE_THRESHOLD, 49 NO_SYNC_NODE_FOUND, 50 NO_SYNC_NODE_INTERVAL, 51 OVER_QUOTA, 52 PREFS_BRANCH, 53 RESPONSE_OVER_QUOTA, 54 SCORE_INCREMENT_MEDIUM, 55 SCORE_INCREMENT_SMALL, 56 SCORE_INCREMENT_XLARGE, 57 SCORE_UPDATE_DELAY, 58 SERVER_MAINTENANCE, 59 SINGLE_USER_THRESHOLD, 60 SQLITE_MAX_VARIABLE_NUMBER, 61 STATUS_DISABLED, 62 STATUS_OK, 63 STORAGE_VERSION, 64 SYNC_FAILED, 65 SYNC_FAILED_PARTIAL, 66 SYNC_KEY_DECODED_LENGTH, 67 SYNC_KEY_ENCODED_LENGTH, 68 SYNC_SUCCEEDED, 69 URI_LENGTH_MAX, 70 VERSION_OUT_OF_DATE, 71 WEAVE_VERSION, 72 kFirefoxShuttingDown, 73 kFirstSyncChoiceNotMade, 74 kSyncBackoffNotMet, 75 kSyncMasterPasswordLocked, 76 kSyncNetworkOffline, 77 kSyncNotConfigured, 78 kSyncWeaveDisabled, 79 } = ChromeUtils.importESModule("resource://services-sync/constants.sys.mjs"); 80 var { BulkKeyBundle, SyncKeyBundle } = ChromeUtils.importESModule( 81 "resource://services-sync/keys.sys.mjs" 82 ); 83 84 // Common code for test_errorhandler_{1,2}.js -- pulled out to make it less 85 // monolithic and take less time to execute. 86 const EHTestsCommon = { 87 service_unavailable(request, response) { 88 let body = "Service Unavailable"; 89 response.setStatusLine(request.httpVersion, 503, "Service Unavailable"); 90 response.setHeader("Retry-After", "42"); 91 response.bodyOutputStream.write(body, body.length); 92 }, 93 94 async sync_httpd_setup() { 95 let clientsEngine = Service.clientsEngine; 96 let clientsSyncID = await clientsEngine.resetLocalSyncID(); 97 let catapultEngine = Service.engineManager.get("catapult"); 98 let catapultSyncID = await catapultEngine.resetLocalSyncID(); 99 let global = new ServerWBO("global", { 100 syncID: Service.syncID, 101 storageVersion: STORAGE_VERSION, 102 engines: { 103 clients: { version: clientsEngine.version, syncID: clientsSyncID }, 104 catapult: { version: catapultEngine.version, syncID: catapultSyncID }, 105 }, 106 }); 107 let clientsColl = new ServerCollection({}, true); 108 109 // Tracking info/collections. 110 let collectionsHelper = track_collections_helper(); 111 let upd = collectionsHelper.with_updated_collection; 112 113 let handler_401 = httpd_handler(401, "Unauthorized"); 114 return httpd_setup({ 115 // Normal server behaviour. 116 "/1.1/johndoe/storage/meta/global": upd("meta", global.handler()), 117 "/1.1/johndoe/info/collections": collectionsHelper.handler, 118 "/1.1/johndoe/storage/crypto/keys": upd( 119 "crypto", 120 new ServerWBO("keys").handler() 121 ), 122 "/1.1/johndoe/storage/clients": upd("clients", clientsColl.handler()), 123 124 // Credentials are wrong or node reallocated. 125 "/1.1/janedoe/storage/meta/global": handler_401, 126 "/1.1/janedoe/info/collections": handler_401, 127 128 // Maintenance or overloaded (503 + Retry-After) at info/collections. 129 "/1.1/broken.info/info/collections": EHTestsCommon.service_unavailable, 130 131 // Maintenance or overloaded (503 + Retry-After) at meta/global. 132 "/1.1/broken.meta/storage/meta/global": EHTestsCommon.service_unavailable, 133 "/1.1/broken.meta/info/collections": collectionsHelper.handler, 134 135 // Maintenance or overloaded (503 + Retry-After) at crypto/keys. 136 "/1.1/broken.keys/storage/meta/global": upd("meta", global.handler()), 137 "/1.1/broken.keys/info/collections": collectionsHelper.handler, 138 "/1.1/broken.keys/storage/crypto/keys": EHTestsCommon.service_unavailable, 139 140 // Maintenance or overloaded (503 + Retry-After) at wiping collection. 141 "/1.1/broken.wipe/info/collections": collectionsHelper.handler, 142 "/1.1/broken.wipe/storage/meta/global": upd("meta", global.handler()), 143 "/1.1/broken.wipe/storage/crypto/keys": upd( 144 "crypto", 145 new ServerWBO("keys").handler() 146 ), 147 "/1.1/broken.wipe/storage": EHTestsCommon.service_unavailable, 148 "/1.1/broken.wipe/storage/clients": upd("clients", clientsColl.handler()), 149 "/1.1/broken.wipe/storage/catapult": EHTestsCommon.service_unavailable, 150 }); 151 }, 152 153 CatapultEngine: (function () { 154 function CatapultEngine() { 155 SyncEngine.call(this, "Catapult", Service); 156 } 157 CatapultEngine.prototype = { 158 exception: null, // tests fill this in 159 async _sync() { 160 if (this.exception) { 161 throw this.exception; 162 } 163 }, 164 }; 165 Object.setPrototypeOf(CatapultEngine.prototype, SyncEngine.prototype); 166 167 return CatapultEngine; 168 })(), 169 170 async generateCredentialsChangedFailure() { 171 // Make sync fail due to changed credentials. We simply re-encrypt 172 // the keys with a different Sync Key, without changing the local one. 173 let newSyncKeyBundle = new BulkKeyBundle("crypto"); 174 await newSyncKeyBundle.generateRandom(); 175 let keys = Service.collectionKeys.asWBO(); 176 await keys.encrypt(newSyncKeyBundle); 177 return keys.upload(Service.resource(Service.cryptoKeysURL)); 178 }, 179 180 async setUp(server) { 181 syncTestLogging(); 182 await configureIdentity({ username: "johndoe" }, server); 183 return EHTestsCommon.generateAndUploadKeys(); 184 }, 185 186 async generateAndUploadKeys() { 187 await generateNewKeys(Service.collectionKeys); 188 let serverKeys = Service.collectionKeys.asWBO("crypto", "keys"); 189 await serverKeys.encrypt(Service.identity.syncKeyBundle); 190 let response = await serverKeys.upload( 191 Service.resource(Service.cryptoKeysURL) 192 ); 193 return response.success; 194 }, 195 };