netwerk/test/unit/test_progress.js

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

michael@0 1 Cu.import("resource://testing-common/httpd.js");
michael@0 2
michael@0 3 XPCOMUtils.defineLazyGetter(this, "URL", function() {
michael@0 4 return "http://localhost:" + httpserver.identity.primaryPort;
michael@0 5 });
michael@0 6
michael@0 7 var httpserver = new HttpServer();
michael@0 8 var testpath = "/simple";
michael@0 9 var httpbody = "0123456789";
michael@0 10
michael@0 11 var last = 0, max = 0;
michael@0 12
michael@0 13 const STATUS_RECEIVING_FROM = 0x804b0006;
michael@0 14 const LOOPS = 50000;
michael@0 15
michael@0 16 const TYPE_ONSTATUS = 1;
michael@0 17 const TYPE_ONPROGRESS = 2;
michael@0 18 const TYPE_ONSTARTREQUEST = 3;
michael@0 19 const TYPE_ONDATAAVAILABLE = 4;
michael@0 20 const TYPE_ONSTOPREQUEST = 5;
michael@0 21
michael@0 22 var progressCallback = {
michael@0 23 _listener: null,
michael@0 24 _got_onstartrequest: false,
michael@0 25 _got_onstatus_after_onstartrequest: false,
michael@0 26 _last_callback_handled: null,
michael@0 27
michael@0 28 QueryInterface: function (iid) {
michael@0 29 if (iid.equals(Ci.nsISupports) ||
michael@0 30 iid.equals(Ci.nsIProgressEventSink) ||
michael@0 31 iid.equals(Ci.nsIStreamListener) ||
michael@0 32 iid.equals(Ci.nsIRequestObserver))
michael@0 33 return this;
michael@0 34 throw Cr.NS_ERROR_NO_INTERFACE;
michael@0 35 },
michael@0 36
michael@0 37 getInterface: function (iid) {
michael@0 38 if (iid.equals(Ci.nsIProgressEventSink) ||
michael@0 39 iid.equals(Ci.nsIStreamListener) ||
michael@0 40 iid.equals(Ci.nsIRequestObserver))
michael@0 41 return this;
michael@0 42 throw Cr.NS_ERROR_NO_INTERFACE;
michael@0 43 },
michael@0 44
michael@0 45 onStartRequest: function(request, context) {
michael@0 46 do_check_eq(this._last_callback_handled, TYPE_ONSTATUS);
michael@0 47 this._got_onstartrequest = true;
michael@0 48 this._last_callback_handled = TYPE_ONSTARTREQUEST;
michael@0 49
michael@0 50 this._listener = new ChannelListener(checkRequest, request);
michael@0 51 this._listener.onStartRequest(request, context);
michael@0 52 },
michael@0 53
michael@0 54 onDataAvailable: function(request, context, data, offset, count) {
michael@0 55 do_check_eq(this._last_callback_handled, TYPE_ONPROGRESS);
michael@0 56 this._last_callback_handled = TYPE_ONDATAAVAILABLE;
michael@0 57
michael@0 58 this._listener.onDataAvailable(request, context, data, offset, count);
michael@0 59 },
michael@0 60
michael@0 61 onStopRequest: function(request, context, status) {
michael@0 62 do_check_eq(this._last_callback_handled, TYPE_ONDATAAVAILABLE);
michael@0 63 do_check_true(this._got_onstatus_after_onstartrequest);
michael@0 64 this._last_callback_handled = TYPE_ONSTOPREQUEST;
michael@0 65
michael@0 66 this._listener.onStopRequest(request, context, status);
michael@0 67 delete this._listener;
michael@0 68 },
michael@0 69
michael@0 70 onProgress: function (request, context, progress, progressMax) {
michael@0 71 do_check_eq(this._last_callback_handled, TYPE_ONSTATUS);
michael@0 72 this._last_callback_handled = TYPE_ONPROGRESS;
michael@0 73
michael@0 74 do_check_eq(mStatus, STATUS_RECEIVING_FROM);
michael@0 75 last = progress;
michael@0 76 max = progressMax;
michael@0 77 },
michael@0 78
michael@0 79 onStatus: function (request, context, status, statusArg) {
michael@0 80 if (!this._got_onstartrequest) {
michael@0 81 // Ensure that all messages before onStartRequest are onStatus
michael@0 82 if (this._last_callback_handled)
michael@0 83 do_check_eq(this._last_callback_handled, TYPE_ONSTATUS);
michael@0 84 } else if (this._last_callback_handled == TYPE_ONSTARTREQUEST) {
michael@0 85 this._got_onstatus_after_onstartrequest = true;
michael@0 86 } else {
michael@0 87 do_check_eq(this._last_callback_handled, TYPE_ONDATAAVAILABLE);
michael@0 88 }
michael@0 89 this._last_callback_handled = TYPE_ONSTATUS;
michael@0 90
michael@0 91 do_check_eq(statusArg, "localhost");
michael@0 92 mStatus = status;
michael@0 93 },
michael@0 94
michael@0 95 mStatus: 0,
michael@0 96 };
michael@0 97
michael@0 98 function run_test() {
michael@0 99 httpserver.registerPathHandler(testpath, serverHandler);
michael@0 100 httpserver.start(-1);
michael@0 101 var channel = setupChannel(testpath);
michael@0 102 channel.asyncOpen(progressCallback, null);
michael@0 103 do_test_pending();
michael@0 104 }
michael@0 105
michael@0 106 function setupChannel(path) {
michael@0 107 var ios = Cc["@mozilla.org/network/io-service;1"].
michael@0 108 getService(Ci.nsIIOService);
michael@0 109 var chan = ios.newChannel(URL + path, "", null);
michael@0 110 chan.QueryInterface(Ci.nsIHttpChannel);
michael@0 111 chan.requestMethod = "GET";
michael@0 112 chan.notificationCallbacks = progressCallback;
michael@0 113 return chan;
michael@0 114 }
michael@0 115
michael@0 116 function serverHandler(metadata, response) {
michael@0 117 response.setHeader("Content-Type", "text/plain", false);
michael@0 118 for (let i = 0; i < LOOPS; i++)
michael@0 119 response.bodyOutputStream.write(httpbody, httpbody.length);
michael@0 120 }
michael@0 121
michael@0 122 function checkRequest(request, data, context) {
michael@0 123 do_check_eq(last, httpbody.length*LOOPS);
michael@0 124 do_check_eq(max, httpbody.length*LOOPS);
michael@0 125 httpserver.stop(do_test_finished);
michael@0 126 }

mercurial