test_collections_recovery.js (2586B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 // Verify that we wipe the server if we have to regenerate keys. 5 const { Service } = ChromeUtils.importESModule( 6 "resource://services-sync/service.sys.mjs" 7 ); 8 9 add_task(async function test_missing_crypto_collection() { 10 enableValidationPrefs(); 11 12 let johnHelper = track_collections_helper(); 13 let johnU = johnHelper.with_updated_collection; 14 let johnColls = johnHelper.collections; 15 16 let empty = false; 17 function maybe_empty(handler) { 18 return function (request, response) { 19 if (empty) { 20 let body = "{}"; 21 response.setStatusLine(request.httpVersion, 200, "OK"); 22 response.bodyOutputStream.write(body, body.length); 23 } else { 24 handler(request, response); 25 } 26 }; 27 } 28 29 let handlers = { 30 "/1.1/johndoe/info/collections": maybe_empty(johnHelper.handler), 31 "/1.1/johndoe/storage/crypto/keys": johnU( 32 "crypto", 33 new ServerWBO("keys").handler() 34 ), 35 "/1.1/johndoe/storage/meta/global": johnU( 36 "meta", 37 new ServerWBO("global").handler() 38 ), 39 }; 40 let collections = [ 41 "clients", 42 "bookmarks", 43 "forms", 44 "history", 45 "passwords", 46 "prefs", 47 "tabs", 48 ]; 49 // Disable addon sync because AddonManager won't be initialized here. 50 await Service.engineManager.unregister("addons"); 51 await Service.engineManager.unregister("extension-storage"); 52 53 for (let coll of collections) { 54 handlers["/1.1/johndoe/storage/" + coll] = johnU( 55 coll, 56 new ServerCollection({}, true).handler() 57 ); 58 } 59 let server = httpd_setup(handlers); 60 await configureIdentity({ username: "johndoe" }, server); 61 62 try { 63 let fresh = 0; 64 let orig = Service._freshStart; 65 Service._freshStart = async function () { 66 _("Called _freshStart."); 67 await orig.call(Service); 68 fresh++; 69 }; 70 71 _("Startup, no meta/global: freshStart called once."); 72 await sync_and_validate_telem(); 73 Assert.equal(fresh, 1); 74 fresh = 0; 75 76 _("Regular sync: no need to freshStart."); 77 await Service.sync(); 78 Assert.equal(fresh, 0); 79 80 _("Simulate a bad info/collections."); 81 delete johnColls.crypto; 82 await sync_and_validate_telem(); 83 Assert.equal(fresh, 1); 84 fresh = 0; 85 86 _("Regular sync: no need to freshStart."); 87 await sync_and_validate_telem(); 88 Assert.equal(fresh, 0); 89 } finally { 90 for (const pref of Svc.PrefBranch.getChildList("")) { 91 Svc.PrefBranch.clearUserPref(pref); 92 } 93 await promiseStopServer(server); 94 } 95 });