tor-browser

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

test_queue.js (5054B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 /**
      7 * This test verifies that the transport's queue operates correctly when various
      8 * packets are scheduled simultaneously.
      9 */
     10 
     11 var { FileUtils } = ChromeUtils.importESModule(
     12  "resource://gre/modules/FileUtils.sys.mjs"
     13 );
     14 
     15 function run_test() {
     16  initTestDevToolsServer();
     17 
     18  add_task(async function () {
     19    await test_transport(socket_transport);
     20    await test_transport(local_transport);
     21    DevToolsServer.destroy();
     22  });
     23 
     24  run_next_test();
     25 }
     26 
     27 /*** Tests ***/
     28 
     29 var test_transport = async function (transportFactory) {
     30  let clientResolve;
     31  const clientDeferred = new Promise(resolve => {
     32    clientResolve = resolve;
     33  });
     34 
     35  let serverResolve;
     36  const serverDeferred = new Promise(resolve => {
     37    serverResolve = resolve;
     38  });
     39 
     40  // Ensure test files are not present from a failed run
     41  cleanup_files();
     42  const reallyLong = really_long();
     43  writeTestTempFile("bulk-input", reallyLong);
     44 
     45  Assert.equal(Object.keys(DevToolsServer._connections).length, 0);
     46 
     47  const transport = await transportFactory();
     48 
     49  // Sending from client to server
     50  function write_data({ copyFrom }) {
     51    NetUtil.asyncFetch(
     52      {
     53        uri: NetUtil.newURI(getTestTempFile("bulk-input")),
     54        loadUsingSystemPrincipal: true,
     55      },
     56      function (input) {
     57        copyFrom(input).then(() => {
     58          input.close();
     59        });
     60      }
     61    );
     62  }
     63 
     64  // Receiving on server from client
     65  function on_bulk_packet({ actor, type, length, copyTo }) {
     66    Assert.equal(actor, "root");
     67    Assert.equal(type, "file-stream");
     68    Assert.equal(length, reallyLong.length);
     69 
     70    const outputFile = getTestTempFile("bulk-output", true);
     71    outputFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8));
     72 
     73    const output = FileUtils.openSafeFileOutputStream(outputFile);
     74 
     75    copyTo(output)
     76      .then(() => {
     77        FileUtils.closeSafeFileOutputStream(output);
     78        return verify();
     79      })
     80      .then(() => {
     81        // It's now safe to close
     82        transport.hooks.onTransportClosed = () => {
     83          clientResolve();
     84        };
     85        transport.close();
     86      });
     87  }
     88 
     89  // Client
     90 
     91  function send_packets() {
     92    // Specifically, we want to ensure that multiple send()s proceed without
     93    // causing the transport to die.
     94    transport.send({
     95      actor: "root",
     96      type: "explode",
     97    });
     98 
     99    transport
    100      .startBulkSend({
    101        actor: "root",
    102        type: "file-stream",
    103        length: reallyLong.length,
    104      })
    105      .then(write_data);
    106  }
    107 
    108  transport.hooks = {
    109    onPacket(packet) {
    110      if (packet.error) {
    111        transport.hooks.onError(packet);
    112      } else if (packet.applicationType) {
    113        transport.hooks.onServerHello(packet);
    114      } else {
    115        do_throw("Unexpected server reply");
    116      }
    117    },
    118 
    119    onServerHello(packet) {
    120      // We've received the initial start up packet
    121      Assert.equal(packet.from, "root");
    122      Assert.equal(packet.applicationType, "xpcshell-tests");
    123 
    124      // Server
    125      Assert.equal(Object.keys(DevToolsServer._connections).length, 1);
    126      info(Object.keys(DevToolsServer._connections));
    127      for (const connId in DevToolsServer._connections) {
    128        DevToolsServer._connections[connId].onBulkPacket = on_bulk_packet;
    129      }
    130 
    131      DevToolsServer.on("connectionchange", type => {
    132        if (type === "closed") {
    133          serverResolve();
    134        }
    135      });
    136 
    137      send_packets();
    138    },
    139 
    140    onError(packet) {
    141      // The explode actor doesn't exist
    142      Assert.equal(packet.from, "root");
    143      Assert.equal(packet.error, "noSuchActor");
    144    },
    145 
    146    onTransportClosed() {
    147      do_throw("Transport closed before we expected");
    148    },
    149  };
    150 
    151  transport.ready();
    152 
    153  return Promise.all([clientDeferred, serverDeferred]);
    154 };
    155 
    156 /*** Test Utils ***/
    157 
    158 function verify() {
    159  const reallyLong = really_long();
    160 
    161  const inputFile = getTestTempFile("bulk-input");
    162  const outputFile = getTestTempFile("bulk-output");
    163 
    164  Assert.equal(inputFile.fileSize, reallyLong.length);
    165  Assert.equal(outputFile.fileSize, reallyLong.length);
    166 
    167  // Ensure output file contents actually match
    168  return new Promise(resolve => {
    169    NetUtil.asyncFetch(
    170      {
    171        uri: NetUtil.newURI(getTestTempFile("bulk-output")),
    172        loadUsingSystemPrincipal: true,
    173      },
    174      input => {
    175        const outputData = NetUtil.readInputStreamToString(
    176          input,
    177          reallyLong.length
    178        );
    179        // Avoid Assert.strictEqual here so we don't log the contents
    180        // eslint-disable-next-line mozilla/no-comparison-or-assignment-inside-ok
    181        Assert.ok(outputData === reallyLong);
    182        input.close();
    183        resolve();
    184      }
    185    );
    186  }).then(cleanup_files);
    187 }
    188 
    189 function cleanup_files() {
    190  const inputFile = getTestTempFile("bulk-input", true);
    191  if (inputFile.exists()) {
    192    inputFile.remove(false);
    193  }
    194 
    195  const outputFile = getTestTempFile("bulk-output", true);
    196  if (outputFile.exists()) {
    197    outputFile.remove(false);
    198  }
    199 }