tor-browser

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

test_engine.js (7491B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const { Observers } = ChromeUtils.importESModule(
      5  "resource://services-common/observers.sys.mjs"
      6 );
      7 const { Service } = ChromeUtils.importESModule(
      8  "resource://services-sync/service.sys.mjs"
      9 );
     10 
     11 function SteamStore(engine) {
     12  Store.call(this, "Steam", engine);
     13  this.wasWiped = false;
     14 }
     15 SteamStore.prototype = {
     16  async wipe() {
     17    this.wasWiped = true;
     18  },
     19 };
     20 Object.setPrototypeOf(SteamStore.prototype, Store.prototype);
     21 
     22 function SteamTracker(name, engine) {
     23  LegacyTracker.call(this, name || "Steam", engine);
     24 }
     25 Object.setPrototypeOf(SteamTracker.prototype, LegacyTracker.prototype);
     26 
     27 function SteamEngine(name, service) {
     28  SyncEngine.call(this, name, service);
     29  this.wasReset = false;
     30  this.wasSynced = false;
     31 }
     32 SteamEngine.prototype = {
     33  _storeObj: SteamStore,
     34  _trackerObj: SteamTracker,
     35 
     36  async _resetClient() {
     37    this.wasReset = true;
     38  },
     39 
     40  async _sync() {
     41    this.wasSynced = true;
     42  },
     43 };
     44 Object.setPrototypeOf(SteamEngine.prototype, SyncEngine.prototype);
     45 
     46 var engineObserver = {
     47  topics: [],
     48 
     49  observe(subject, topic, data) {
     50    Assert.equal(data, "steam");
     51    this.topics.push(topic);
     52  },
     53 
     54  reset() {
     55    this.topics = [];
     56  },
     57 };
     58 Observers.add("weave:engine:reset-client:start", engineObserver);
     59 Observers.add("weave:engine:reset-client:finish", engineObserver);
     60 Observers.add("weave:engine:wipe-client:start", engineObserver);
     61 Observers.add("weave:engine:wipe-client:finish", engineObserver);
     62 Observers.add("weave:engine:sync:start", engineObserver);
     63 Observers.add("weave:engine:sync:finish", engineObserver);
     64 
     65 async function cleanup(engine) {
     66  for (const pref of Svc.PrefBranch.getChildList("")) {
     67    Svc.PrefBranch.clearUserPref(pref);
     68  }
     69  engine.wasReset = false;
     70  engine.wasSynced = false;
     71  engineObserver.reset();
     72  await engine._tracker.clearChangedIDs();
     73  await engine.finalize();
     74 }
     75 
     76 add_task(async function test_members() {
     77  _("Engine object members");
     78  let engine = new SteamEngine("Steam", Service);
     79  await engine.initialize();
     80  Assert.equal(engine.Name, "Steam");
     81  Assert.equal(engine.prefName, "steam");
     82  Assert.ok(engine._store instanceof SteamStore);
     83  Assert.ok(engine._tracker instanceof SteamTracker);
     84 });
     85 
     86 add_task(async function test_score() {
     87  _("Engine.score corresponds to tracker.score and is readonly");
     88  let engine = new SteamEngine("Steam", Service);
     89  await engine.initialize();
     90  Assert.equal(engine.score, 0);
     91  engine._tracker.score += 5;
     92  Assert.equal(engine.score, 5);
     93 
     94  try {
     95    engine.score = 10;
     96  } catch (ex) {
     97    // Setting an attribute that has a getter produces an error in
     98    // Firefox <= 3.6 and is ignored in later versions.  Either way,
     99    // the attribute's value won't change.
    100  }
    101  Assert.equal(engine.score, 5);
    102 });
    103 
    104 add_task(async function test_resetClient() {
    105  _("Engine.resetClient calls _resetClient");
    106  let engine = new SteamEngine("Steam", Service);
    107  await engine.initialize();
    108  Assert.ok(!engine.wasReset);
    109 
    110  await engine.resetClient();
    111  Assert.ok(engine.wasReset);
    112  Assert.equal(engineObserver.topics[0], "weave:engine:reset-client:start");
    113  Assert.equal(engineObserver.topics[1], "weave:engine:reset-client:finish");
    114 
    115  await cleanup(engine);
    116 });
    117 
    118 add_task(async function test_invalidChangedIDs() {
    119  _("Test that invalid changed IDs on disk don't end up live.");
    120  let engine = new SteamEngine("Steam", Service);
    121  await engine.initialize();
    122  let tracker = engine._tracker;
    123 
    124  await tracker._beforeSave();
    125  await IOUtils.writeUTF8(tracker._storage.path, "5", {
    126    tmpPath: tracker._storage.path + ".tmp",
    127  });
    128 
    129  ok(!tracker._storage.dataReady);
    130  const changes = await tracker.getChangedIDs();
    131  changes.placeholder = true;
    132  deepEqual(
    133    changes,
    134    { placeholder: true },
    135    "Accessing changed IDs should load changes from disk as a side effect"
    136  );
    137  ok(tracker._storage.dataReady);
    138 
    139  Assert.ok(changes.placeholder);
    140  await cleanup(engine);
    141 });
    142 
    143 add_task(async function test_wipeClient() {
    144  _("Engine.wipeClient calls resetClient, wipes store, clears changed IDs");
    145  let engine = new SteamEngine("Steam", Service);
    146  await engine.initialize();
    147  Assert.ok(!engine.wasReset);
    148  Assert.ok(!engine._store.wasWiped);
    149  Assert.ok(await engine._tracker.addChangedID("a-changed-id"));
    150  let changes = await engine._tracker.getChangedIDs();
    151  Assert.ok("a-changed-id" in changes);
    152 
    153  await engine.wipeClient();
    154  Assert.ok(engine.wasReset);
    155  Assert.ok(engine._store.wasWiped);
    156  changes = await engine._tracker.getChangedIDs();
    157  Assert.equal(JSON.stringify(changes), "{}");
    158  Assert.equal(engineObserver.topics[0], "weave:engine:wipe-client:start");
    159  Assert.equal(engineObserver.topics[1], "weave:engine:reset-client:start");
    160  Assert.equal(engineObserver.topics[2], "weave:engine:reset-client:finish");
    161  Assert.equal(engineObserver.topics[3], "weave:engine:wipe-client:finish");
    162 
    163  await cleanup(engine);
    164 });
    165 
    166 add_task(async function test_enabled() {
    167  _("Engine.enabled corresponds to preference");
    168  let engine = new SteamEngine("Steam", Service);
    169  await engine.initialize();
    170  try {
    171    Assert.ok(!engine.enabled);
    172    Svc.PrefBranch.setBoolPref("engine.steam", true);
    173    Assert.ok(engine.enabled);
    174 
    175    engine.enabled = false;
    176    Assert.ok(!Svc.PrefBranch.getBoolPref("engine.steam"));
    177  } finally {
    178    await cleanup(engine);
    179  }
    180 });
    181 
    182 add_task(async function test_sync() {
    183  let engine = new SteamEngine("Steam", Service);
    184  await engine.initialize();
    185  try {
    186    _("Engine.sync doesn't call _sync if it's not enabled");
    187    Assert.ok(!engine.enabled);
    188    Assert.ok(!engine.wasSynced);
    189    await engine.sync();
    190 
    191    Assert.ok(!engine.wasSynced);
    192 
    193    _("Engine.sync calls _sync if it's enabled");
    194    engine.enabled = true;
    195 
    196    await engine.sync();
    197    Assert.ok(engine.wasSynced);
    198    Assert.equal(engineObserver.topics[0], "weave:engine:sync:start");
    199    Assert.equal(engineObserver.topics[1], "weave:engine:sync:finish");
    200  } finally {
    201    await cleanup(engine);
    202  }
    203 });
    204 
    205 add_task(async function test_disabled_no_track() {
    206  _("When an engine is disabled, its tracker is not tracking.");
    207  let engine = new SteamEngine("Steam", Service);
    208  await engine.initialize();
    209  let tracker = engine._tracker;
    210  Assert.equal(engine, tracker.engine);
    211 
    212  Assert.ok(!engine.enabled);
    213  Assert.ok(!tracker._isTracking);
    214  let changes = await tracker.getChangedIDs();
    215  do_check_empty(changes);
    216 
    217  Assert.ok(!tracker.engineIsEnabled());
    218  Assert.ok(!tracker._isTracking);
    219  changes = await tracker.getChangedIDs();
    220  do_check_empty(changes);
    221 
    222  let promisePrefChangeHandled = Promise.withResolvers();
    223  const origMethod = tracker.onEngineEnabledChanged;
    224  tracker.onEngineEnabledChanged = async (...args) => {
    225    await origMethod.apply(tracker, args);
    226    promisePrefChangeHandled.resolve();
    227  };
    228 
    229  engine.enabled = true; // Also enables the tracker automatically.
    230  await promisePrefChangeHandled.promise;
    231  Assert.ok(tracker._isTracking);
    232  changes = await tracker.getChangedIDs();
    233  do_check_empty(changes);
    234 
    235  await tracker.addChangedID("abcdefghijkl");
    236  changes = await tracker.getChangedIDs();
    237  Assert.less(0, changes.abcdefghijkl);
    238  promisePrefChangeHandled = Promise.withResolvers();
    239  Svc.PrefBranch.setBoolPref("engine." + engine.prefName, false);
    240  await promisePrefChangeHandled.promise;
    241  Assert.ok(!tracker._isTracking);
    242  changes = await tracker.getChangedIDs();
    243  do_check_empty(changes);
    244 
    245  await cleanup(engine);
    246 });