tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });