tor-browser

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

test_ASRouterTargeting_snapshot.js (4040B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/
      3 */
      4 
      5 "use strict";
      6 
      7 const { ASRouterTargeting } = ChromeUtils.importESModule(
      8  "resource:///modules/asrouter/ASRouterTargeting.sys.mjs"
      9 );
     10 
     11 add_task(async function should_ignore_rejections() {
     12  let target = {
     13    get foo() {
     14      return new Promise(resolve => resolve(1));
     15    },
     16 
     17    get bar() {
     18      return new Promise((resolve, reject) => reject(new Error("unspecified")));
     19    },
     20  };
     21 
     22  let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({
     23    targets: [target],
     24  });
     25  Assert.deepEqual(snapshot, { environment: { foo: 1 }, version: 1 });
     26 });
     27 
     28 add_task(async function nested_objects() {
     29  const target = {
     30    get foo() {
     31      return Promise.resolve("foo");
     32    },
     33    get bar() {
     34      return Promise.reject(new Error("bar"));
     35    },
     36    baz: {
     37      get qux() {
     38        return Promise.resolve("qux");
     39      },
     40      get quux() {
     41        return Promise.reject(new Error("quux"));
     42      },
     43      get corge() {
     44        return {
     45          get grault() {
     46            return Promise.resolve("grault");
     47          },
     48          get garply() {
     49            return Promise.reject(new Error("garply"));
     50          },
     51        };
     52      },
     53    },
     54  };
     55 
     56  const snapshot = await ASRouterTargeting.getEnvironmentSnapshot({
     57    targets: [target],
     58  });
     59  Assert.deepEqual(
     60    snapshot,
     61    {
     62      environment: {
     63        foo: "foo",
     64        baz: {
     65          qux: "qux",
     66          corge: {
     67            grault: "grault",
     68          },
     69        },
     70      },
     71      version: 1,
     72    },
     73    "getEnvironmentSnapshot should resolve nested promises"
     74  );
     75 });
     76 
     77 add_task(async function arrays() {
     78  const target = {
     79    foo: [1, 2, 3],
     80    bar: [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)],
     81    baz: Promise.resolve([1, 2, 3]),
     82    qux: Promise.resolve([
     83      Promise.resolve(1),
     84      Promise.resolve(2),
     85      Promise.resolve(3),
     86    ]),
     87    quux: Promise.resolve({
     88      corge: [Promise.resolve(1), 2, 3],
     89    }),
     90  };
     91 
     92  const snapshot = await ASRouterTargeting.getEnvironmentSnapshot({
     93    targets: [target],
     94  });
     95  Assert.deepEqual(
     96    snapshot,
     97    {
     98      environment: {
     99        foo: [1, 2, 3],
    100        bar: [1, 2, 3],
    101        baz: [1, 2, 3],
    102        qux: [1, 2, 3],
    103        quux: { corge: [1, 2, 3] },
    104      },
    105      version: 1,
    106    },
    107    "getEnvironmentSnapshot should resolve arrays correctly"
    108  );
    109 });
    110 
    111 add_task(async function target_order() {
    112  let target1 = {
    113    foo: 1,
    114    bar: 1,
    115    baz: 1,
    116  };
    117 
    118  let target2 = {
    119    foo: 2,
    120    bar: 2,
    121  };
    122 
    123  let target3 = {
    124    foo: 3,
    125  };
    126 
    127  // target3 supercedes target2; both supercede target1.
    128  let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({
    129    targets: [target3, target2, target1],
    130  });
    131  Assert.deepEqual(snapshot, {
    132    environment: { foo: 3, bar: 2, baz: 1 },
    133    version: 1,
    134  });
    135 });
    136 
    137 /*
    138 * NB: This test is last because it manipulates shutdown phases.
    139 *
    140 * Adding tests after this one will result in failures.
    141 */
    142 add_task(async function should_ignore_rejections() {
    143  // The order that `ASRouterTargeting.getEnvironmentSnapshot`
    144  // enumerates the target object matters here, but it's guaranteed to
    145  // be consistent by the `for ... in` ordering: see
    146  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#description.
    147  let target = {
    148    get foo() {
    149      return new Promise(resolve => resolve(1));
    150    },
    151 
    152    get bar() {
    153      return new Promise(resolve => {
    154        // Pretend that we're about to shut down.
    155        Services.startup.advanceShutdownPhase(
    156          Services.startup.SHUTDOWN_PHASE_APPSHUTDOWN
    157        );
    158        resolve(2);
    159      });
    160    },
    161 
    162    get baz() {
    163      return new Promise(resolve => resolve(3));
    164    },
    165  };
    166 
    167  let snapshot = await ASRouterTargeting.getEnvironmentSnapshot({
    168    targets: [target],
    169  });
    170  // `baz` is dropped since we're shutting down by the time it's processed.
    171  Assert.deepEqual(snapshot, { environment: { foo: 1, bar: 2 }, version: 1 });
    172 });