Bug 1845311 - [Part 2] Use ChromeUtils.defineLazyGetter in more places r=arai,webcomp...
[gecko.git] / netwerk / test / unit / test_post.js
blobf57a149920128fc69b0a81219c32acdb77f8efd7
1 //
2 // POST test
3 //
5 "use strict";
7 const { HttpServer } = ChromeUtils.importESModule(
8   "resource://testing-common/httpd.sys.mjs"
9 );
11 ChromeUtils.defineLazyGetter(this, "URL", function () {
12   return "http://localhost:" + httpserver.identity.primaryPort;
13 });
15 var httpserver = new HttpServer();
16 var testpath = "/simple";
18 var testfile = do_get_file("../unit/data/test_readline6.txt");
20 const BOUNDARY = "AaB03x";
21 var teststring1 =
22   "--" +
23   BOUNDARY +
24   "\r\n" +
25   'Content-Disposition: form-data; name="body"\r\n\r\n' +
26   "0123456789\r\n" +
27   "--" +
28   BOUNDARY +
29   "\r\n" +
30   'Content-Disposition: form-data; name="files"; filename="' +
31   testfile.leafName +
32   '"\r\n' +
33   "Content-Type: application/octet-stream\r\n" +
34   "Content-Length: " +
35   testfile.fileSize +
36   "\r\n\r\n";
37 var teststring2 = "--" + BOUNDARY + "--\r\n";
39 const BUFFERSIZE = 4096;
40 var correctOnProgress = false;
42 var listenerCallback = {
43   QueryInterface: ChromeUtils.generateQI(["nsIProgressEventSink"]),
45   getInterface(iid) {
46     if (iid.equals(Ci.nsIProgressEventSink)) {
47       return this;
48     }
49     throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
50   },
52   onProgress(request, progress, progressMax) {
53     // this works because the response is 0 bytes and does not trigger onprogress
54     if (progress === progressMax) {
55       correctOnProgress = true;
56     }
57   },
59   onStatus(request, status, statusArg) {},
62 function run_test() {
63   var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
64     Ci.nsIStringInputStream
65   );
66   sstream1.data = teststring1;
68   var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
69     Ci.nsIFileInputStream
70   );
71   fstream.init(testfile, -1, -1, 0);
73   var buffered = Cc[
74     "@mozilla.org/network/buffered-input-stream;1"
75   ].createInstance(Ci.nsIBufferedInputStream);
76   buffered.init(fstream, BUFFERSIZE);
78   var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
79     Ci.nsIStringInputStream
80   );
81   sstream2.data = teststring2;
83   var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"].createInstance(
84     Ci.nsIMultiplexInputStream
85   );
86   multi.appendStream(sstream1);
87   multi.appendStream(buffered);
88   multi.appendStream(sstream2);
90   var mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(
91     Ci.nsIMIMEInputStream
92   );
93   mime.addHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
94   mime.setData(multi);
96   httpserver.registerPathHandler(testpath, serverHandler);
97   httpserver.start(-1);
99   var channel = setupChannel(testpath);
101   channel
102     .QueryInterface(Ci.nsIUploadChannel)
103     .setUploadStream(mime, "", mime.available());
104   channel.requestMethod = "POST";
105   channel.notificationCallbacks = listenerCallback;
106   channel.asyncOpen(new ChannelListener(checkRequest, channel));
107   do_test_pending();
110 function setupChannel(path) {
111   return NetUtil.newChannel({
112     uri: URL + path,
113     loadUsingSystemPrincipal: true,
114   }).QueryInterface(Ci.nsIHttpChannel);
117 function serverHandler(metadata, response) {
118   Assert.equal(metadata.method, "POST");
120   var data = read_stream(
121     metadata.bodyInputStream,
122     metadata.bodyInputStream.available()
123   );
125   var testfile_stream = Cc[
126     "@mozilla.org/network/file-input-stream;1"
127   ].createInstance(Ci.nsIFileInputStream);
128   testfile_stream.init(testfile, -1, -1, 0);
130   Assert.equal(
131     teststring1 +
132       read_stream(testfile_stream, testfile_stream.available()) +
133       teststring2,
134     data
135   );
138 function checkRequest(request, data, context) {
139   Assert.ok(correctOnProgress);
140   httpserver.stop(do_test_finished);