1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_progress.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,126 @@ 1.4 +Cu.import("resource://testing-common/httpd.js"); 1.5 + 1.6 +XPCOMUtils.defineLazyGetter(this, "URL", function() { 1.7 + return "http://localhost:" + httpserver.identity.primaryPort; 1.8 +}); 1.9 + 1.10 +var httpserver = new HttpServer(); 1.11 +var testpath = "/simple"; 1.12 +var httpbody = "0123456789"; 1.13 + 1.14 +var last = 0, max = 0; 1.15 + 1.16 +const STATUS_RECEIVING_FROM = 0x804b0006; 1.17 +const LOOPS = 50000; 1.18 + 1.19 +const TYPE_ONSTATUS = 1; 1.20 +const TYPE_ONPROGRESS = 2; 1.21 +const TYPE_ONSTARTREQUEST = 3; 1.22 +const TYPE_ONDATAAVAILABLE = 4; 1.23 +const TYPE_ONSTOPREQUEST = 5; 1.24 + 1.25 +var progressCallback = { 1.26 + _listener: null, 1.27 + _got_onstartrequest: false, 1.28 + _got_onstatus_after_onstartrequest: false, 1.29 + _last_callback_handled: null, 1.30 + 1.31 + QueryInterface: function (iid) { 1.32 + if (iid.equals(Ci.nsISupports) || 1.33 + iid.equals(Ci.nsIProgressEventSink) || 1.34 + iid.equals(Ci.nsIStreamListener) || 1.35 + iid.equals(Ci.nsIRequestObserver)) 1.36 + return this; 1.37 + throw Cr.NS_ERROR_NO_INTERFACE; 1.38 + }, 1.39 + 1.40 + getInterface: function (iid) { 1.41 + if (iid.equals(Ci.nsIProgressEventSink) || 1.42 + iid.equals(Ci.nsIStreamListener) || 1.43 + iid.equals(Ci.nsIRequestObserver)) 1.44 + return this; 1.45 + throw Cr.NS_ERROR_NO_INTERFACE; 1.46 + }, 1.47 + 1.48 + onStartRequest: function(request, context) { 1.49 + do_check_eq(this._last_callback_handled, TYPE_ONSTATUS); 1.50 + this._got_onstartrequest = true; 1.51 + this._last_callback_handled = TYPE_ONSTARTREQUEST; 1.52 + 1.53 + this._listener = new ChannelListener(checkRequest, request); 1.54 + this._listener.onStartRequest(request, context); 1.55 + }, 1.56 + 1.57 + onDataAvailable: function(request, context, data, offset, count) { 1.58 + do_check_eq(this._last_callback_handled, TYPE_ONPROGRESS); 1.59 + this._last_callback_handled = TYPE_ONDATAAVAILABLE; 1.60 + 1.61 + this._listener.onDataAvailable(request, context, data, offset, count); 1.62 + }, 1.63 + 1.64 + onStopRequest: function(request, context, status) { 1.65 + do_check_eq(this._last_callback_handled, TYPE_ONDATAAVAILABLE); 1.66 + do_check_true(this._got_onstatus_after_onstartrequest); 1.67 + this._last_callback_handled = TYPE_ONSTOPREQUEST; 1.68 + 1.69 + this._listener.onStopRequest(request, context, status); 1.70 + delete this._listener; 1.71 + }, 1.72 + 1.73 + onProgress: function (request, context, progress, progressMax) { 1.74 + do_check_eq(this._last_callback_handled, TYPE_ONSTATUS); 1.75 + this._last_callback_handled = TYPE_ONPROGRESS; 1.76 + 1.77 + do_check_eq(mStatus, STATUS_RECEIVING_FROM); 1.78 + last = progress; 1.79 + max = progressMax; 1.80 + }, 1.81 + 1.82 + onStatus: function (request, context, status, statusArg) { 1.83 + if (!this._got_onstartrequest) { 1.84 + // Ensure that all messages before onStartRequest are onStatus 1.85 + if (this._last_callback_handled) 1.86 + do_check_eq(this._last_callback_handled, TYPE_ONSTATUS); 1.87 + } else if (this._last_callback_handled == TYPE_ONSTARTREQUEST) { 1.88 + this._got_onstatus_after_onstartrequest = true; 1.89 + } else { 1.90 + do_check_eq(this._last_callback_handled, TYPE_ONDATAAVAILABLE); 1.91 + } 1.92 + this._last_callback_handled = TYPE_ONSTATUS; 1.93 + 1.94 + do_check_eq(statusArg, "localhost"); 1.95 + mStatus = status; 1.96 + }, 1.97 + 1.98 + mStatus: 0, 1.99 +}; 1.100 + 1.101 +function run_test() { 1.102 + httpserver.registerPathHandler(testpath, serverHandler); 1.103 + httpserver.start(-1); 1.104 + var channel = setupChannel(testpath); 1.105 + channel.asyncOpen(progressCallback, null); 1.106 + do_test_pending(); 1.107 +} 1.108 + 1.109 +function setupChannel(path) { 1.110 + var ios = Cc["@mozilla.org/network/io-service;1"]. 1.111 + getService(Ci.nsIIOService); 1.112 + var chan = ios.newChannel(URL + path, "", null); 1.113 + chan.QueryInterface(Ci.nsIHttpChannel); 1.114 + chan.requestMethod = "GET"; 1.115 + chan.notificationCallbacks = progressCallback; 1.116 + return chan; 1.117 +} 1.118 + 1.119 +function serverHandler(metadata, response) { 1.120 + response.setHeader("Content-Type", "text/plain", false); 1.121 + for (let i = 0; i < LOOPS; i++) 1.122 + response.bodyOutputStream.write(httpbody, httpbody.length); 1.123 +} 1.124 + 1.125 +function checkRequest(request, data, context) { 1.126 + do_check_eq(last, httpbody.length*LOOPS); 1.127 + do_check_eq(max, httpbody.length*LOOPS); 1.128 + httpserver.stop(do_test_finished); 1.129 +}