test_score_triggers.js (4568B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const { Service } = ChromeUtils.importESModule( 5 "resource://services-sync/service.sys.mjs" 6 ); 7 const { Status } = ChromeUtils.importESModule( 8 "resource://services-sync/status.sys.mjs" 9 ); 10 11 // Tracking info/collections. 12 var collectionsHelper = track_collections_helper(); 13 var upd = collectionsHelper.with_updated_collection; 14 15 function sync_httpd_setup() { 16 let handlers = {}; 17 18 handlers["/1.1/johndoe/storage/meta/global"] = new ServerWBO( 19 "global", 20 {} 21 ).handler(); 22 handlers["/1.1/johndoe/storage/steam"] = new ServerWBO("steam", {}).handler(); 23 24 handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler; 25 delete collectionsHelper.collections.crypto; 26 delete collectionsHelper.collections.meta; 27 28 let cr = new ServerWBO("keys"); 29 handlers["/1.1/johndoe/storage/crypto/keys"] = upd("crypto", cr.handler()); 30 31 let cl = new ServerCollection(); 32 handlers["/1.1/johndoe/storage/clients"] = upd("clients", cl.handler()); 33 34 return httpd_setup(handlers); 35 } 36 37 async function setUp(server) { 38 let engineInfo = await registerRotaryEngine(); 39 await SyncTestingInfrastructure(server, "johndoe", "ilovejane"); 40 return engineInfo; 41 } 42 43 add_task(async function test_tracker_score_updated() { 44 enableValidationPrefs(); 45 let { engine, tracker } = await registerRotaryEngine(); 46 47 let scoreUpdated = 0; 48 49 function onScoreUpdated() { 50 scoreUpdated++; 51 } 52 53 Svc.Obs.add("weave:engine:score:updated", onScoreUpdated); 54 55 try { 56 Assert.equal(engine.score, 0); 57 58 tracker.score += SCORE_INCREMENT_SMALL; 59 Assert.equal(engine.score, SCORE_INCREMENT_SMALL); 60 61 Assert.equal(scoreUpdated, 1); 62 } finally { 63 Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated); 64 tracker.resetScore(); 65 await tracker.clearChangedIDs(); 66 await Service.engineManager.unregister(engine); 67 } 68 }); 69 70 add_task(async function test_sync_triggered() { 71 let server = sync_httpd_setup(); 72 let { engine, tracker } = await setUp(server); 73 74 await Service.login(); 75 76 Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; 77 78 Assert.equal(Status.login, LOGIN_SUCCEEDED); 79 tracker.score += SCORE_INCREMENT_XLARGE; 80 81 await promiseOneObserver("weave:service:sync:finish"); 82 83 await Service.startOver(); 84 await promiseStopServer(server); 85 86 await tracker.clearChangedIDs(); 87 await Service.engineManager.unregister(engine); 88 }); 89 90 add_task(async function test_clients_engine_sync_triggered() { 91 enableValidationPrefs(); 92 93 _("Ensure that client engine score changes trigger a sync."); 94 95 // The clients engine is not registered like other engines. Therefore, 96 // it needs special treatment throughout the code. Here, we verify the 97 // global score tracker gives it that treatment. See bug 676042 for more. 98 99 let server = sync_httpd_setup(); 100 let { engine, tracker } = await setUp(server); 101 await Service.login(); 102 103 Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD; 104 Assert.equal(Status.login, LOGIN_SUCCEEDED); 105 Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE; 106 107 await promiseOneObserver("weave:service:sync:finish"); 108 _("Sync due to clients engine change completed."); 109 110 await Service.startOver(); 111 await promiseStopServer(server); 112 113 await tracker.clearChangedIDs(); 114 await Service.engineManager.unregister(engine); 115 }); 116 117 add_task(async function test_incorrect_credentials_sync_not_triggered() { 118 enableValidationPrefs(); 119 120 _( 121 "Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED." 122 ); 123 let server = sync_httpd_setup(); 124 let { engine, tracker } = await setUp(server); 125 126 // Ensure we don't actually try to sync. 127 function onSyncStart() { 128 do_throw("Should not get here!"); 129 } 130 Svc.Obs.add("weave:service:sync:start", onSyncStart); 131 132 // Faking incorrect credentials to prevent score update. 133 Status.login = LOGIN_FAILED_LOGIN_REJECTED; 134 tracker.score += SCORE_INCREMENT_XLARGE; 135 136 // First wait >100ms (nsITimers can take up to that much time to fire, so 137 // we can account for the timer in delayedAutoconnect) and then one event 138 // loop tick (to account for a possible call to weave:service:sync:start). 139 await promiseNamedTimer(150, {}, "timer"); 140 await Async.promiseYield(); 141 142 Svc.Obs.remove("weave:service:sync:start", onSyncStart); 143 144 Assert.equal(Status.login, LOGIN_FAILED_LOGIN_REJECTED); 145 146 await Service.startOver(); 147 await promiseStopServer(server); 148 149 await tracker.clearChangedIDs(); 150 await Service.engineManager.unregister(engine); 151 });