summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_gio_protocol.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_gio_protocol.js')
-rw-r--r--netwerk/test/unit/test_gio_protocol.js201
1 files changed, 201 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_gio_protocol.js b/netwerk/test/unit/test_gio_protocol.js
new file mode 100644
index 0000000000..37ce37abab
--- /dev/null
+++ b/netwerk/test/unit/test_gio_protocol.js
@@ -0,0 +1,201 @@
+/* run some tests on the gvfs/gio protocol handler */
+
+"use strict";
+
+function inChildProcess() {
+ return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
+}
+
+const PR_RDONLY = 0x1; // see prio.h
+
+[
+ do_test_read_data_dir,
+ do_test_read_recent,
+ test_read_file,
+ do_test_finished,
+].forEach(f => add_test(f));
+
+function setup() {
+ // Allowing some protocols to get a channel
+ if (!inChildProcess()) {
+ Services.prefs.setCharPref(
+ "network.gio.supported-protocols",
+ "localtest:,recent:"
+ );
+ } else {
+ do_send_remote_message("gio-allow-test-protocols");
+ do_await_remote_message("gio-allow-test-protocols-done");
+ }
+}
+
+setup();
+
+registerCleanupFunction(() => {
+ // Resetting the protocols to None
+ if (!inChildProcess()) {
+ Services.prefs.clearUserPref("network.gio.supported-protocols");
+ }
+});
+
+function new_file_input_stream(file, buffered) {
+ var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
+ Ci.nsIFileInputStream
+ );
+ stream.init(file, PR_RDONLY, 0, 0);
+ if (!buffered) {
+ return stream;
+ }
+
+ var buffer = Cc[
+ "@mozilla.org/network/buffered-input-stream;1"
+ ].createInstance(Ci.nsIBufferedInputStream);
+ buffer.init(stream, 4096);
+ return buffer;
+}
+
+function new_file_channel(file) {
+ var chan = NetUtil.newChannel({
+ uri: file,
+ loadUsingSystemPrincipal: true,
+ });
+
+ return chan;
+}
+
+/*
+ * stream listener
+ * this listener has some additional file-specific tests, so we can't just use
+ * ChannelListener here.
+ */
+function FileStreamListener(closure) {
+ this._closure = closure;
+}
+FileStreamListener.prototype = {
+ _closure: null,
+ _buffer: "",
+ _got_onstartrequest: false,
+ _got_onstoprequest: false,
+ _contentLen: -1,
+
+ QueryInterface: ChromeUtils.generateQI([
+ "nsIStreamListener",
+ "nsIRequestObserver",
+ ]),
+
+ onStartRequest(request) {
+ if (this._got_onstartrequest) {
+ do_throw("Got second onStartRequest event!");
+ }
+ this._got_onstartrequest = true;
+ },
+
+ onDataAvailable(request, stream, offset, count) {
+ if (!this._got_onstartrequest) {
+ do_throw("onDataAvailable without onStartRequest event!");
+ }
+ if (this._got_onstoprequest) {
+ do_throw("onDataAvailable after onStopRequest event!");
+ }
+ if (!request.isPending()) {
+ do_throw("request reports itself as not pending from onStartRequest!");
+ }
+
+ this._buffer = this._buffer.concat(read_stream(stream, count));
+ },
+
+ onStopRequest(request, status) {
+ if (!this._got_onstartrequest) {
+ do_throw("onStopRequest without onStartRequest event!");
+ }
+ if (this._got_onstoprequest) {
+ do_throw("Got second onStopRequest event!");
+ }
+ this._got_onstoprequest = true;
+ if (!Components.isSuccessCode(status)) {
+ do_throw("Failed to load file: " + status.toString(16));
+ }
+ if (status != request.status) {
+ do_throw("request.status does not match status arg to onStopRequest!");
+ }
+ if (request.isPending()) {
+ do_throw("request reports itself as pending from onStopRequest!");
+ }
+ if (this._contentLen != -1 && this._buffer.length != this._contentLen) {
+ do_throw("did not read nsIChannel.contentLength number of bytes!");
+ }
+
+ this._closure(this._buffer);
+ },
+};
+
+function test_read_file() {
+ dump("*** test_read_file\n");
+ // Going via parent path, because this is opended from test/unit/ and test/unit_ipc/
+ var file = do_get_file("../unit/data/test_readline4.txt");
+ var chan = new_file_channel("localtest://" + file.path);
+
+ function on_read_complete(data) {
+ dump("*** test_read_file.on_read_complete()\n");
+ /* read completed successfully. now read data directly from file,
+ and compare the result. */
+ var stream = new_file_input_stream(file, false);
+ var result = read_stream(stream, stream.available());
+ if (result != data) {
+ do_throw("Stream contents do not match with direct read!");
+ }
+ run_next_test();
+ }
+
+ chan.asyncOpen(new FileStreamListener(on_read_complete));
+}
+
+function do_test_read_data_dir() {
+ dump('*** test_read_data_dir("../data/")\n');
+
+ var dir = do_get_file("../unit/data/");
+ var chan = new_file_channel("localtest://" + dir.path);
+
+ function on_read_complete(data) {
+ dump("*** test_read_data_dir.on_read_complete()\n");
+
+ // The data-directory should be listed, containing a header-line and the files therein
+ if (
+ !(
+ data.includes("200: filename content-length last-modified file-type") &&
+ data.includes("201: test_readline1.txt") &&
+ data.includes("201: test_readline2.txt")
+ )
+ ) {
+ do_throw(
+ "test_read_data_dir() - Bad data! Does not contain needles! Is <" +
+ data +
+ ">"
+ );
+ }
+ run_next_test();
+ }
+ chan.asyncOpen(new FileStreamListener(on_read_complete));
+}
+
+function do_test_read_recent() {
+ dump('*** test_read_recent("recent://")\n');
+
+ var chan = new_file_channel("recent:///");
+
+ function on_read_complete(data) {
+ dump("*** test_read_recent.on_read_complete()\n");
+
+ // The data-directory should be listed, containing a header-line and the files therein
+ if (
+ !data.includes("200: filename content-length last-modified file-type")
+ ) {
+ do_throw(
+ "do_test_read_recent() - Bad data! Does not contain header! Is <" +
+ data +
+ ">"
+ );
+ }
+ run_next_test();
+ }
+ chan.asyncOpen(new FileStreamListener(on_read_complete));
+}