1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_bug470716.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,174 @@ 1.4 +const CC = Components.Constructor; 1.5 + 1.6 +const StreamCopier = CC("@mozilla.org/network/async-stream-copier;1", 1.7 + "nsIAsyncStreamCopier", 1.8 + "init"); 1.9 + 1.10 +const ScriptableInputStream = CC("@mozilla.org/scriptableinputstream;1", 1.11 + "nsIScriptableInputStream", 1.12 + "init"); 1.13 + 1.14 +const Pipe = CC("@mozilla.org/pipe;1", 1.15 + "nsIPipe", 1.16 + "init"); 1.17 + 1.18 +var pipe1; 1.19 +var pipe2; 1.20 +var copier; 1.21 +var test_result; 1.22 +var test_content; 1.23 +var test_source_closed; 1.24 +var test_sink_closed; 1.25 +var test_nr; 1.26 + 1.27 +var copyObserver = 1.28 +{ 1.29 + onStartRequest: function(request, context) { }, 1.30 + 1.31 + onStopRequest: function(request, cx, statusCode) 1.32 + { 1.33 + // check status code 1.34 + do_check_eq(statusCode, test_result); 1.35 + 1.36 + // check number of copied bytes 1.37 + do_check_eq(pipe2.inputStream.available(), test_content.length); 1.38 + 1.39 + // check content 1.40 + var scinp = new ScriptableInputStream(pipe2.inputStream); 1.41 + var content = scinp.read(scinp.available()); 1.42 + do_check_eq(content, test_content); 1.43 + 1.44 + // check closed sink 1.45 + try { 1.46 + pipe2.outputStream.write("closedSinkTest", 14); 1.47 + do_check_false(test_sink_closed); 1.48 + } 1.49 + catch (ex) { 1.50 + do_check_true(test_sink_closed); 1.51 + } 1.52 + 1.53 + // check closed source 1.54 + try { 1.55 + pipe1.outputStream.write("closedSourceTest", 16); 1.56 + do_check_false(test_source_closed); 1.57 + } 1.58 + catch (ex) { 1.59 + do_check_true(test_source_closed); 1.60 + } 1.61 + 1.62 + do_timeout(0, do_test); 1.63 + }, 1.64 + 1.65 + QueryInterface: function(aIID) 1.66 + { 1.67 + if (aIID.equals(Ci.nsIRequestObserver) || 1.68 + aIID.equals(Ci.nsISupports)) 1.69 + return this; 1.70 + 1.71 + throw Cr.NS_ERROR_NO_INTERFACE; 1.72 + } 1.73 +}; 1.74 + 1.75 +function startCopier(closeSource, closeSink) { 1.76 + pipe1 = new Pipe(true /* nonBlockingInput */, 1.77 + true /* nonBlockingOutput */, 1.78 + 0 /* segmentSize */, 1.79 + 0xffffffff /* segmentCount */, 1.80 + null /* segmentAllocator */); 1.81 + 1.82 + pipe2 = new Pipe(true /* nonBlockingInput */, 1.83 + true /* nonBlockingOutput */, 1.84 + 0 /* segmentSize */, 1.85 + 0xffffffff /* segmentCount */, 1.86 + null /* segmentAllocator */); 1.87 + 1.88 + copier = new StreamCopier(pipe1.inputStream /* aSource */, 1.89 + pipe2.outputStream /* aSink */, 1.90 + null /* aTarget */, 1.91 + true /* aSourceBuffered */, 1.92 + true /* aSinkBuffered */, 1.93 + 8192 /* aChunkSize */, 1.94 + closeSource /* aCloseSource */, 1.95 + closeSink /* aCloseSink */); 1.96 + 1.97 + copier.asyncCopy(copyObserver, null); 1.98 +} 1.99 + 1.100 +function do_test() { 1.101 + 1.102 + test_nr++; 1.103 + test_content = "test" + test_nr; 1.104 + 1.105 + switch (test_nr) { 1.106 + case 1: 1.107 + case 2: // close sink 1.108 + case 3: // close source 1.109 + case 4: // close both 1.110 + // test canceling transfer 1.111 + // use some undefined error code to check if it is successfully passed 1.112 + // to the request observer 1.113 + test_result = 0x87654321; 1.114 + 1.115 + test_source_closed = ((test_nr-1)>>1 != 0); 1.116 + test_sink_closed = ((test_nr-1)%2 != 0); 1.117 + 1.118 + startCopier(test_source_closed, test_sink_closed); 1.119 + pipe1.outputStream.write(test_content, test_content.length); 1.120 + pipe1.outputStream.flush(); 1.121 + do_timeout(20, 1.122 + function(){ 1.123 + copier.cancel(test_result); 1.124 + pipe1.outputStream.write("a", 1);}); 1.125 + break; 1.126 + case 5: 1.127 + case 6: // close sink 1.128 + case 7: // close source 1.129 + case 8: // close both 1.130 + // test copying with EOF on source 1.131 + test_result = 0; 1.132 + 1.133 + test_source_closed = ((test_nr-5)>>1 != 0); 1.134 + test_sink_closed = ((test_nr-5)%2 != 0); 1.135 + 1.136 + startCopier(test_source_closed, test_sink_closed); 1.137 + pipe1.outputStream.write(test_content, test_content.length); 1.138 + // we will close the source 1.139 + test_source_closed = true; 1.140 + pipe1.outputStream.close(); 1.141 + break; 1.142 + case 9: 1.143 + case 10: // close sink 1.144 + case 11: // close source 1.145 + case 12: // close both 1.146 + // test copying with error on sink 1.147 + // use some undefined error code to check if it is successfully passed 1.148 + // to the request observer 1.149 + test_result = 0x87654321; 1.150 + 1.151 + test_source_closed = ((test_nr-9)>>1 != 0); 1.152 + test_sink_closed = ((test_nr-9)%2 != 0); 1.153 + 1.154 + startCopier(test_source_closed, test_sink_closed); 1.155 + pipe1.outputStream.write(test_content, test_content.length); 1.156 + pipe1.outputStream.flush(); 1.157 + // we will close the sink 1.158 + test_sink_closed = true; 1.159 + do_timeout(20, 1.160 + function() 1.161 + { 1.162 + pipe2.outputStream 1.163 + .QueryInterface(Ci.nsIAsyncOutputStream) 1.164 + .closeWithStatus(test_result); 1.165 + pipe1.outputStream.write("a", 1);}); 1.166 + break; 1.167 + case 13: 1.168 + do_test_finished(); 1.169 + break; 1.170 + } 1.171 +} 1.172 + 1.173 +function run_test() { 1.174 + test_nr = 0; 1.175 + do_timeout(0, do_test); 1.176 + do_test_pending(); 1.177 +}