test_prefs_engine.js (4222B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const { getPrefsGUIDForTest } = ChromeUtils.importESModule( 5 "resource://services-sync/engines/prefs.sys.mjs" 6 ); 7 const PREFS_GUID = getPrefsGUIDForTest(); 8 const { Service } = ChromeUtils.importESModule( 9 "resource://services-sync/service.sys.mjs" 10 ); 11 12 async function cleanup(engine, server) { 13 await engine._tracker.stop(); 14 await engine.wipeClient(); 15 for (const pref of Svc.PrefBranch.getChildList("")) { 16 Svc.PrefBranch.clearUserPref(pref); 17 } 18 Service.recordManager.clearCache(); 19 await promiseStopServer(server); 20 } 21 22 add_task(async function test_modified_after_fail() { 23 let engine = Service.engineManager.get("prefs"); 24 25 let server = await serverForFoo(engine); 26 await SyncTestingInfrastructure(server); 27 28 try { 29 // The homepage pref is synced by default. 30 _("Set homepage before first sync"); 31 Services.prefs.setStringPref("browser.startup.homepage", "about:welcome"); 32 33 _("First sync; create collection and pref record on server"); 34 await sync_engine_and_validate_telem(engine, false); 35 36 let collection = server.user("foo").collection("prefs"); 37 equal( 38 collection.cleartext(PREFS_GUID).value["browser.startup.homepage"], 39 "about:welcome", 40 "Should upload homepage in pref record" 41 ); 42 ok( 43 !engine._tracker.modified, 44 "Tracker shouldn't be modified after first sync" 45 ); 46 47 // Our tracker only has a `modified` flag that's reset after a 48 // successful upload. Force it to remain set by failing the 49 // upload. 50 _("Second sync; flag tracker as modified and throw on upload"); 51 Services.prefs.setStringPref("browser.startup.homepage", "about:robots"); 52 engine._tracker.modified = true; 53 let oldPost = collection.post; 54 collection.post = () => { 55 throw new Error("Sync this!"); 56 }; 57 await Assert.rejects( 58 sync_engine_and_validate_telem(engine, true), 59 ex => ex.success === false 60 ); 61 ok( 62 engine._tracker.modified, 63 "Tracker should remain modified after failed sync" 64 ); 65 66 _("Third sync"); 67 collection.post = oldPost; 68 await sync_engine_and_validate_telem(engine, false); 69 equal( 70 collection.cleartext(PREFS_GUID).value["browser.startup.homepage"], 71 "about:robots", 72 "Should upload new homepage on third sync" 73 ); 74 ok( 75 !engine._tracker.modified, 76 "Tracker shouldn't be modified again after third sync" 77 ); 78 } finally { 79 await cleanup(engine, server); 80 } 81 }); 82 83 add_task(async function test_allow_arbitrary() { 84 let engine = Service.engineManager.get("prefs"); 85 86 let server = await serverForFoo(engine); 87 await SyncTestingInfrastructure(server); 88 89 try { 90 _("Create collection and pref record on server"); 91 await sync_engine_and_validate_telem(engine, false); 92 93 let collection = server.user("foo").collection("prefs"); 94 95 _("Insert arbitrary pref into remote record"); 96 let cleartext1 = collection.cleartext(PREFS_GUID); 97 cleartext1.value.let_viruses_take_over = true; 98 collection.insert( 99 PREFS_GUID, 100 encryptPayload(cleartext1), 101 new_timestamp() + 5 102 ); 103 104 _("Sync again; client shouldn't allow pref"); 105 await sync_engine_and_validate_telem(engine, false); 106 ok( 107 !Services.prefs.getBoolPref("let_viruses_take_over", false), 108 "Shouldn't allow arbitrary remote prefs without control pref" 109 ); 110 111 _("Sync with control pref set; client should set new pref"); 112 Services.prefs.setBoolPref( 113 "services.sync.prefs.sync.let_viruses_take_over_take_two", 114 true 115 ); 116 117 let cleartext2 = collection.cleartext(PREFS_GUID); 118 cleartext2.value.let_viruses_take_over_take_two = true; 119 collection.insert( 120 PREFS_GUID, 121 encryptPayload(cleartext2), 122 new_timestamp() + 5 123 ); 124 // Reset the last sync time so that the engine fetches the record again. 125 await engine.setLastSync(0); 126 await sync_engine_and_validate_telem(engine, false); 127 ok( 128 Services.prefs.getBoolPref("let_viruses_take_over_take_two"), 129 "Should set arbitrary remote pref with control pref" 130 ); 131 } finally { 132 await cleanup(engine, server); 133 } 134 });