tor-browser

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

test_gio_protocol.js (5475B)


      1 /* run some tests on the gvfs/gio protocol handler */
      2 
      3 "use strict";
      4 
      5 function inChildProcess() {
      6  return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
      7 }
      8 
      9 const PR_RDONLY = 0x1; // see prio.h
     10 
     11 [
     12  do_test_read_data_dir,
     13  do_test_read_recent,
     14  test_read_file,
     15  do_test_finished,
     16 ].forEach(f => add_test(f));
     17 
     18 function setup() {
     19  // Allowing some protocols to get a channel
     20  if (!inChildProcess()) {
     21    Services.prefs.setCharPref(
     22      "network.gio.supported-protocols",
     23      "localtest:,recent:"
     24    );
     25  } else {
     26    do_send_remote_message("gio-allow-test-protocols");
     27    do_await_remote_message("gio-allow-test-protocols-done");
     28  }
     29 }
     30 
     31 setup();
     32 
     33 registerCleanupFunction(() => {
     34  // Resetting the protocols to None
     35  if (!inChildProcess()) {
     36    Services.prefs.clearUserPref("network.gio.supported-protocols");
     37  }
     38 });
     39 
     40 function new_file_input_stream(file, buffered) {
     41  var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
     42    Ci.nsIFileInputStream
     43  );
     44  stream.init(file, PR_RDONLY, 0, 0);
     45  if (!buffered) {
     46    return stream;
     47  }
     48 
     49  var buffer = Cc[
     50    "@mozilla.org/network/buffered-input-stream;1"
     51  ].createInstance(Ci.nsIBufferedInputStream);
     52  buffer.init(stream, 4096);
     53  return buffer;
     54 }
     55 
     56 function new_file_channel(file) {
     57  var chan = NetUtil.newChannel({
     58    uri: file,
     59    loadUsingSystemPrincipal: true,
     60  });
     61 
     62  return chan;
     63 }
     64 
     65 /*
     66 * stream listener
     67 * this listener has some additional file-specific tests, so we can't just use
     68 * ChannelListener here.
     69 */
     70 function FileStreamListener(closure) {
     71  this._closure = closure;
     72 }
     73 FileStreamListener.prototype = {
     74  _closure: null,
     75  _buffer: "",
     76  _got_onstartrequest: false,
     77  _got_onstoprequest: false,
     78  _contentLen: -1,
     79 
     80  QueryInterface: ChromeUtils.generateQI([
     81    "nsIStreamListener",
     82    "nsIRequestObserver",
     83  ]),
     84 
     85  onStartRequest() {
     86    if (this._got_onstartrequest) {
     87      do_throw("Got second onStartRequest event!");
     88    }
     89    this._got_onstartrequest = true;
     90  },
     91 
     92  onDataAvailable(request, stream, offset, count) {
     93    if (!this._got_onstartrequest) {
     94      do_throw("onDataAvailable without onStartRequest event!");
     95    }
     96    if (this._got_onstoprequest) {
     97      do_throw("onDataAvailable after onStopRequest event!");
     98    }
     99    if (!request.isPending()) {
    100      do_throw("request reports itself as not pending from onStartRequest!");
    101    }
    102 
    103    this._buffer = this._buffer.concat(read_stream(stream, count));
    104  },
    105 
    106  onStopRequest(request, status) {
    107    if (!this._got_onstartrequest) {
    108      do_throw("onStopRequest without onStartRequest event!");
    109    }
    110    if (this._got_onstoprequest) {
    111      do_throw("Got second onStopRequest event!");
    112    }
    113    this._got_onstoprequest = true;
    114    if (!Components.isSuccessCode(status)) {
    115      do_throw("Failed to load file: " + status.toString(16));
    116    }
    117    if (status != request.status) {
    118      do_throw("request.status does not match status arg to onStopRequest!");
    119    }
    120    if (request.isPending()) {
    121      do_throw("request reports itself as pending from onStopRequest!");
    122    }
    123    if (this._contentLen != -1 && this._buffer.length != this._contentLen) {
    124      do_throw("did not read nsIChannel.contentLength number of bytes!");
    125    }
    126 
    127    this._closure(this._buffer);
    128  },
    129 };
    130 
    131 function test_read_file() {
    132  dump("*** test_read_file\n");
    133  // Going via parent path, because this is opended from test/unit/ and test/unit_ipc/
    134  var file = do_get_file("../unit/data/test_readline4.txt");
    135  var chan = new_file_channel("localtest://" + file.path);
    136 
    137  function on_read_complete(data) {
    138    dump("*** test_read_file.on_read_complete()\n");
    139    /* read completed successfully.  now read data directly from file,
    140       and compare the result. */
    141    var stream = new_file_input_stream(file, false);
    142    var result = read_stream(stream, stream.available());
    143    if (result != data) {
    144      do_throw("Stream contents do not match with direct read!");
    145    }
    146    run_next_test();
    147  }
    148 
    149  chan.asyncOpen(new FileStreamListener(on_read_complete));
    150 }
    151 
    152 function do_test_read_data_dir() {
    153  dump('*** test_read_data_dir("../data/")\n');
    154 
    155  var dir = do_get_file("../unit/data/");
    156  var chan = new_file_channel("localtest://" + dir.path);
    157 
    158  function on_read_complete(data) {
    159    dump("*** test_read_data_dir.on_read_complete()\n");
    160 
    161    // The data-directory should be listed, containing a header-line and the files therein
    162    if (
    163      !(
    164        data.includes("200: filename content-length last-modified file-type") &&
    165        data.includes("201: test_readline1.txt") &&
    166        data.includes("201: test_readline2.txt")
    167      )
    168    ) {
    169      do_throw(
    170        "test_read_data_dir() - Bad data! Does not contain needles! Is <" +
    171          data +
    172          ">"
    173      );
    174    }
    175    run_next_test();
    176  }
    177  chan.asyncOpen(new FileStreamListener(on_read_complete));
    178 }
    179 
    180 function do_test_read_recent() {
    181  dump('*** test_read_recent("recent://")\n');
    182 
    183  var chan = new_file_channel("recent:///");
    184 
    185  function on_read_complete(data) {
    186    dump("*** test_read_recent.on_read_complete()\n");
    187 
    188    // The data-directory should be listed, containing a header-line and the files therein
    189    if (
    190      !data.includes("200: filename content-length last-modified file-type")
    191    ) {
    192      do_throw(
    193        "do_test_read_recent() - Bad data! Does not contain header! Is <" +
    194          data +
    195          ">"
    196      );
    197    }
    198    run_next_test();
    199  }
    200  chan.asyncOpen(new FileStreamListener(on_read_complete));
    201 }