tor-browser

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

test_eventemitter_abort_controller.js (6084B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 const EventEmitter = require("resource://devtools/shared/event-emitter.js");
      7 
      8 add_task(function testAbortSingleListener() {
      9  // Test a simple case with AbortController
     10  info("Create an EventEmitter");
     11  const emitter = new EventEmitter();
     12  const abortController = new AbortController();
     13  const { signal } = abortController;
     14 
     15  info("Setup an event listener on test-event, controlled by an AbortSignal");
     16  let eventsReceived = 0;
     17  emitter.on("test-event", () => eventsReceived++, { signal });
     18 
     19  info("Emit test-event");
     20  emitter.emit("test-event");
     21  equal(eventsReceived, 1, "We received one event, as expected");
     22 
     23  info("Abort the AbortController…");
     24  abortController.abort();
     25  info("… and emit test-event again");
     26  emitter.emit("test-event");
     27  equal(eventsReceived, 1, "We didn't receive new event after aborting");
     28 });
     29 
     30 add_task(function testAbortSingleListenerOnce() {
     31  // Test a simple case with AbortController and once
     32  info("Create an EventEmitter");
     33  const emitter = new EventEmitter();
     34  const abortController = new AbortController();
     35  const { signal } = abortController;
     36 
     37  info("Setup an event listener on test-event, controlled by an AbortSignal");
     38  let eventReceived = false;
     39  emitter.once(
     40    "test-event",
     41    () => {
     42      eventReceived = true;
     43    },
     44    { signal }
     45  );
     46 
     47  info("Abort the AbortController…");
     48  abortController.abort();
     49  info("… and emit test-event");
     50  emitter.emit("test-event");
     51  equal(eventReceived, false, "We didn't receive the event after aborting");
     52 });
     53 
     54 add_task(function testAbortMultipleListener() {
     55  // Test aborting multiple event listeners with one call to abort
     56  info("Create an EventEmitter");
     57  const emitter = new EventEmitter();
     58  const abortController = new AbortController();
     59  const { signal } = abortController;
     60 
     61  info("Setup 3 event listeners controlled by an AbortSignal");
     62  let eventsReceived = 0;
     63  emitter.on("test-event", () => eventsReceived++, { signal });
     64  emitter.on("test-event", () => eventsReceived++, { signal });
     65  emitter.on("other-test-event", () => eventsReceived++, { signal });
     66 
     67  info("Emit test-event and other-test-event");
     68  emitter.emit("test-event");
     69  emitter.emit("other-test-event");
     70  equal(eventsReceived, 3, "We received 3 events, as expected");
     71 
     72  info("Abort the AbortController…");
     73  abortController.abort();
     74  info("… and emit events again");
     75  emitter.emit("test-event");
     76  emitter.emit("other-test-event");
     77  equal(eventsReceived, 3, "We didn't receive new event after aborting");
     78 });
     79 
     80 add_task(function testAbortMultipleEmitter() {
     81  // Test aborting multiple event listeners on different emitters with one call to abort
     82  info("Create 2 EventEmitter");
     83  const emitter1 = new EventEmitter();
     84  const emitter2 = new EventEmitter();
     85  const abortController = new AbortController();
     86  const { signal } = abortController;
     87 
     88  info("Setup 2 event listeners on test-event, controlled by an AbortSignal");
     89  let eventsReceived = 0;
     90  emitter1.on("test-event", () => eventsReceived++, { signal });
     91  emitter2.on("other-test-event", () => eventsReceived++, { signal });
     92 
     93  info("Emit test-event and other-test-event");
     94  emitter1.emit("test-event");
     95  emitter2.emit("other-test-event");
     96  equal(eventsReceived, 2, "We received 2 events, as expected");
     97 
     98  info("Abort the AbortController…");
     99  abortController.abort();
    100  info("… and emit events again");
    101  emitter1.emit("test-event");
    102  emitter2.emit("other-test-event");
    103  equal(eventsReceived, 2, "We didn't receive new event after aborting");
    104 });
    105 
    106 add_task(function testAbortBeforeEmitting() {
    107  // Check that aborting before emitting does unregister the event listener
    108  info("Create an EventEmitter");
    109  const emitter = new EventEmitter();
    110  const abortController = new AbortController();
    111  const { signal } = abortController;
    112 
    113  info("Setup an event listener on test-event, controlled by an AbortSignal");
    114  let eventsReceived = 0;
    115  emitter.on("test-event", () => eventsReceived++, { signal });
    116 
    117  info("Abort the AbortController…");
    118  abortController.abort();
    119 
    120  info("… and emit test-event");
    121  emitter.emit("test-event");
    122  equal(eventsReceived, 0, "We didn't receive any event");
    123 });
    124 
    125 add_task(function testAbortBeforeSettingListener() {
    126  // Check that aborting before creating the event listener won't register it
    127  info("Create an EventEmitter");
    128  const emitter = new EventEmitter();
    129 
    130  info("Create an AbortController and abort it immediately");
    131  const abortController = new AbortController();
    132  const { signal } = abortController;
    133  abortController.abort();
    134 
    135  info(
    136    "Setup an event listener on test-event, controlled by the aborted AbortSignal"
    137  );
    138  let eventsReceived = 0;
    139  const off = emitter.on("test-event", () => eventsReceived++, { signal });
    140 
    141  info("Emit test-event");
    142  emitter.emit("test-event");
    143  equal(eventsReceived, 0, "We didn't receive any event");
    144 
    145  equal(typeof off, "function", "emitter.on still returned a function");
    146  // check that calling off does not throw
    147  off();
    148 });
    149 
    150 add_task(function testAbortAfterEventListenerIsRemoved() {
    151  // Check that aborting after there's no more event listener does not throw
    152  info("Create an EventEmitter");
    153  const emitter = new EventEmitter();
    154 
    155  const abortController = new AbortController();
    156  const { signal } = abortController;
    157 
    158  info(
    159    "Setup an event listener on test-event, controlled by the aborted AbortSignal"
    160  );
    161  let eventsReceived = 0;
    162  const off = emitter.on("test-event", () => eventsReceived++, { signal });
    163 
    164  info("Emit test-event");
    165  emitter.emit("test-event");
    166  equal(eventsReceived, 1, "We received the expected event");
    167 
    168  info("Remove the event listener with the function returned by `on`");
    169  off();
    170 
    171  info("Emit test-event a second time");
    172  emitter.emit("test-event");
    173  equal(
    174    eventsReceived,
    175    1,
    176    "We didn't receive new event after removing the event listener"
    177  );
    178 
    179  info("Abort to check it doesn't throw");
    180  abortController.abort();
    181 });