test_extension_storage_engine_kinto.js (4006B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 Services.prefs.setBoolPref("webextensions.storage.sync.kinto", true); 7 8 const { ExtensionStorageEngineKinto: ExtensionStorageEngine } = 9 ChromeUtils.importESModule( 10 "resource://services-sync/engines/extension-storage.sys.mjs" 11 ); 12 const { Service } = ChromeUtils.importESModule( 13 "resource://services-sync/service.sys.mjs" 14 ); 15 const { extensionStorageSyncKinto: extensionStorageSync } = 16 ChromeUtils.importESModule( 17 "resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs" 18 ); 19 20 let engine; 21 22 function mock(options) { 23 let calls = []; 24 let ret = function () { 25 calls.push(arguments); 26 return options.returns; 27 }; 28 let proto = { 29 get calls() { 30 return calls; 31 }, 32 }; 33 Object.setPrototypeOf(proto, Function.prototype); 34 Object.setPrototypeOf(ret, proto); 35 return ret; 36 } 37 38 function setSkipChance(v) { 39 Services.prefs.setIntPref( 40 "services.sync.extension-storage.skipPercentageChance", 41 v 42 ); 43 } 44 45 add_task(async function setup() { 46 await Service.engineManager.register(ExtensionStorageEngine); 47 engine = Service.engineManager.get("extension-storage"); 48 do_get_profile(); // so we can use FxAccounts 49 loadWebExtensionTestFunctions(); 50 setSkipChance(0); 51 }); 52 53 add_task(async function test_calling_sync_calls__sync() { 54 let oldSync = ExtensionStorageEngine.prototype._sync; 55 let syncMock = (ExtensionStorageEngine.prototype._sync = mock({ 56 returns: true, 57 })); 58 try { 59 // I wanted to call the main sync entry point for the entire 60 // package, but that fails because it tries to sync ClientEngine 61 // first, which fails. 62 await engine.sync(); 63 } finally { 64 ExtensionStorageEngine.prototype._sync = oldSync; 65 } 66 equal(syncMock.calls.length, 1); 67 }); 68 69 add_task(async function test_sync_skip() { 70 try { 71 // Do a few times to ensure we aren't getting "lucky" WRT Math.random() 72 for (let i = 0; i < 10; ++i) { 73 setSkipChance(100); 74 engine._tracker._score = 0; 75 ok( 76 !engine.shouldSkipSync("user"), 77 "Should allow explicitly requested syncs" 78 ); 79 ok(!engine.shouldSkipSync("startup"), "Should allow startup syncs"); 80 ok( 81 engine.shouldSkipSync("schedule"), 82 "Should skip scheduled syncs if skipProbability is 100" 83 ); 84 engine._tracker._score = MULTI_DEVICE_THRESHOLD; 85 ok( 86 !engine.shouldSkipSync("schedule"), 87 "should allow scheduled syncs if tracker score is high" 88 ); 89 engine._tracker._score = 0; 90 setSkipChance(0); 91 ok( 92 !engine.shouldSkipSync("schedule"), 93 "Should allow scheduled syncs if probability is 0" 94 ); 95 } 96 } finally { 97 engine._tracker._score = 0; 98 setSkipChance(0); 99 } 100 }); 101 102 add_task(async function test_calling_wipeClient_calls_clearAll() { 103 let oldClearAll = extensionStorageSync.clearAll; 104 let clearMock = (extensionStorageSync.clearAll = mock({ 105 returns: Promise.resolve(), 106 })); 107 try { 108 await engine.wipeClient(); 109 } finally { 110 extensionStorageSync.clearAll = oldClearAll; 111 } 112 equal(clearMock.calls.length, 1); 113 }); 114 115 add_task(async function test_calling_sync_calls_ext_storage_sync() { 116 const extension = { id: "my-extension" }; 117 let oldSync = extensionStorageSync.syncAll; 118 let syncMock = (extensionStorageSync.syncAll = mock({ 119 returns: Promise.resolve(), 120 })); 121 try { 122 await withContext(async function (context) { 123 // Set something so that everyone knows that we're using storage.sync 124 await extensionStorageSync.set(extension, { a: "b" }, context); 125 let ping = await sync_engine_and_validate_telem(engine, false); 126 Assert.ok(ping.engines.find(e => e.name == "extension-storage")); 127 Assert.equal( 128 ping.engines.find(e => e.name == "rust-webext-storage"), 129 null 130 ); 131 }); 132 } finally { 133 extensionStorageSync.syncAll = oldSync; 134 } 135 Assert.greaterOrEqual(syncMock.calls.length, 1); 136 });