tor-browser

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

test_UrlbarUtils_skippableTimer.js (2817B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 /**
      5 * Tests UrlbarUtils.SkippableTimer
      6 */
      7 
      8 "use strict";
      9 
     10 let { SkippableTimer } = ChromeUtils.importESModule(
     11  "moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs"
     12 );
     13 const { setTimeout } = ChromeUtils.importESModule(
     14  "resource://gre/modules/Timer.sys.mjs"
     15 );
     16 
     17 add_task(async function test_basic() {
     18  let invoked = 0;
     19  let deferred = Promise.withResolvers();
     20  let timer = new SkippableTimer({
     21    name: "test 1",
     22    callback: () => {
     23      invoked++;
     24      deferred.resolve();
     25    },
     26    time: 50,
     27  });
     28  Assert.equal(timer.name, "test 1", "Timer should have the correct name");
     29  Assert.ok(!timer.done, "Should not be done");
     30  Assert.equal(invoked, 0, "Should not have invoked the callback yet");
     31  await deferred.promise;
     32  Assert.ok(timer.done, "Should be done");
     33  Assert.equal(invoked, 1, "Should have invoked the callback");
     34 });
     35 
     36 add_task(async function test_fire() {
     37  let longTimeMs = 1000;
     38  let invoked = 0;
     39  let deferred = Promise.withResolvers();
     40  let timer = new SkippableTimer({
     41    name: "test 1",
     42    callback: () => {
     43      invoked++;
     44      deferred.resolve();
     45    },
     46    time: longTimeMs,
     47  });
     48  let start = ChromeUtils.now();
     49  Assert.equal(timer.name, "test 1", "Timer should have the correct name");
     50  Assert.ok(!timer.done, "Should not be done");
     51  Assert.equal(invoked, 0, "Should not have invoked the callback yet");
     52  // Call fire() many times to also verify the callback is invoked just once.
     53  timer.fire();
     54  timer.fire();
     55  timer.fire();
     56  Assert.ok(timer.done, "Should be done");
     57  await deferred.promise;
     58  Assert.greater(
     59    longTimeMs,
     60    ChromeUtils.now() - start,
     61    "Should have resolved earlier"
     62  );
     63  Assert.equal(invoked, 1, "Should have invoked the callback");
     64 });
     65 
     66 add_task(async function test_cancel() {
     67  let timeMs = 50;
     68  let invoked = 0;
     69  let deferred = Promise.withResolvers();
     70  let timer = new SkippableTimer({
     71    name: "test 1",
     72    callback: () => {
     73      invoked++;
     74      deferred.resolve();
     75    },
     76    time: timeMs,
     77  });
     78  let start = ChromeUtils.now();
     79  Assert.equal(timer.name, "test 1", "Timer should have the correct name");
     80  Assert.ok(!timer.done, "Should not be done");
     81  Assert.equal(invoked, 0, "Should not have invoked the callback yet");
     82  // Calling cancel many times shouldn't rise any error.
     83  timer.cancel();
     84  timer.cancel();
     85  Assert.ok(timer.done, "Should be done");
     86  await Promise.race([
     87    deferred.promise,
     88    // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
     89    new Promise(r => setTimeout(r, timeMs * 4)),
     90  ]);
     91  Assert.greater(
     92    ChromeUtils.now() - start,
     93    timeMs,
     94    "Should not have resolved earlier"
     95  );
     96  Assert.equal(invoked, 0, "Should not have invoked the callback");
     97 });