aboutsummaryrefslogtreecommitdiff
path: root/test/parallel/test-http-highwatermark.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/parallel/test-http-highwatermark.js')
-rw-r--r--test/parallel/test-http-highwatermark.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/test/parallel/test-http-highwatermark.js b/test/parallel/test-http-highwatermark.js
new file mode 100644
index 0000000000..79d9c46a55
--- /dev/null
+++ b/test/parallel/test-http-highwatermark.js
@@ -0,0 +1,52 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const net = require('net');
+const http = require('http');
+
+// These test cases to check socketOnDrain where needPause becomes false.
+// When send large response enough to exceed highWaterMark, it expect the socket
+// to be paused and res.write would be failed.
+// And it should be resumed when outgoingData falls below highWaterMark.
+
+let requestReceived = 0;
+
+const server = http.createServer(function(req, res) {
+ const id = ++requestReceived;
+ const enoughToDrain = req.connection.writableHighWaterMark;
+ const body = 'x'.repeat(enoughToDrain * 100);
+
+ if (id === 1) {
+ // Case of needParse = false
+ req.connection.once('pause', common.mustCall(() => {
+ assert(req.connection._paused, '_paused must be true because it exceeds' +
+ 'highWaterMark by second request');
+ }));
+ } else {
+ // Case of needParse = true
+ const resume = req.connection.parser.resume.bind(req.connection.parser);
+ req.connection.parser.resume = common.mustCall((...args) => {
+ const paused = req.connection._paused;
+ assert(!paused, '_paused must be false because it become false by ' +
+ 'socketOnDrain when outgoingData falls below ' +
+ 'highWaterMark');
+ return resume(...args);
+ });
+ }
+ assert(!res.write(body), 'res.write must return false because it will ' +
+ 'exceed highWaterMark on this call');
+ res.end();
+}).on('listening', () => {
+ const c = net.createConnection(server.address().port, () => {
+ c.write('GET / HTTP/1.1\r\n\r\n');
+ c.write('GET / HTTP/1.1\r\n\r\n',
+ () => setImmediate(() => c.resume()));
+ c.end();
+ });
+
+ c.on('end', () => {
+ server.close();
+ });
+});
+
+server.listen(0);