diff options
author | Brian White <mscdex@mscdex.net> | 2019-01-10 15:52:27 -0500 |
---|---|---|
committer | Brian White <mscdex@mscdex.net> | 2019-08-23 17:05:52 -0400 |
commit | 8292b280ec9e6b8c2444cbe49350facc77f5fefa (patch) | |
tree | 2f40ac41f20b53b748a7039c4f00e419efb8784b /test | |
parent | 9d21b0395cc248a0e5537a11cc84f61919eccca6 (diff) | |
download | android-node-v8-8292b280ec9e6b8c2444cbe49350facc77f5fefa.tar.gz android-node-v8-8292b280ec9e6b8c2444cbe49350facc77f5fefa.tar.bz2 android-node-v8-8292b280ec9e6b8c2444cbe49350facc77f5fefa.zip |
net: allow reading data into a static buffer
Co-Authored-By: Anna Henningsen <anna@addaleax.net>
PR-URL: https://github.com/nodejs/node/pull/25436
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'test')
-rw-r--r-- | test/parallel/test-net-onread-static-buffer.js | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/test/parallel/test-net-onread-static-buffer.js b/test/parallel/test-net-onread-static-buffer.js new file mode 100644 index 0000000000..ce722f69cd --- /dev/null +++ b/test/parallel/test-net-onread-static-buffer.js @@ -0,0 +1,186 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const net = require('net'); + +const message = Buffer.from('hello world'); + +// Test typical usage +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + const buffers = []; + const sockBuf = Buffer.alloc(8); + net.connect({ + port: this.address().port, + onread: { + buffer: sockBuf, + callback: function(nread, buf) { + assert.strictEqual(buf, sockBuf); + received += nread; + buffers.push(Buffer.from(buf.slice(0, nread))); + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(Buffer.concat(buffers), message); + })); +}); + +// Test Uint8Array support +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + let incoming = new Uint8Array(0); + const sockBuf = new Uint8Array(8); + net.connect({ + port: this.address().port, + onread: { + buffer: sockBuf, + callback: function(nread, buf) { + assert.strictEqual(buf, sockBuf); + received += nread; + const newIncoming = new Uint8Array(incoming.length + nread); + newIncoming.set(incoming); + newIncoming.set(buf.slice(0, nread), incoming.length); + incoming = newIncoming; + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(incoming, new Uint8Array(message)); + })); +}); + +// Test Buffer callback usage +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + const incoming = []; + const bufPool = [ Buffer.alloc(2), Buffer.alloc(2), Buffer.alloc(2) ]; + let bufPoolIdx = -1; + let bufPoolUsage = 0; + net.connect({ + port: this.address().port, + onread: { + buffer: () => { + ++bufPoolUsage; + bufPoolIdx = (bufPoolIdx + 1) % bufPool.length; + return bufPool[bufPoolIdx]; + }, + callback: function(nread, buf) { + assert.strictEqual(buf, bufPool[bufPoolIdx]); + received += nread; + incoming.push(Buffer.from(buf.slice(0, nread))); + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(Buffer.concat(incoming), message); + assert.strictEqual(bufPoolUsage, 7); + })); +}); + +// Test Uint8Array callback support +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + let incoming = new Uint8Array(0); + const bufPool = [ new Uint8Array(2), new Uint8Array(2), new Uint8Array(2) ]; + let bufPoolIdx = -1; + let bufPoolUsage = 0; + net.connect({ + port: this.address().port, + onread: { + buffer: () => { + ++bufPoolUsage; + bufPoolIdx = (bufPoolIdx + 1) % bufPool.length; + return bufPool[bufPoolIdx]; + }, + callback: function(nread, buf) { + assert.strictEqual(buf, bufPool[bufPoolIdx]); + received += nread; + const newIncoming = new Uint8Array(incoming.length + nread); + newIncoming.set(incoming); + newIncoming.set(buf.slice(0, nread), incoming.length); + incoming = newIncoming; + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(incoming, new Uint8Array(message)); + assert.strictEqual(bufPoolUsage, 7); + })); +}); + +// Test explicit socket pause +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + const buffers = []; + const sockBuf = Buffer.alloc(8); + let paused = false; + net.connect({ + port: this.address().port, + onread: { + buffer: sockBuf, + callback: function(nread, buf) { + assert.strictEqual(paused, false); + assert.strictEqual(buf, sockBuf); + received += nread; + buffers.push(Buffer.from(buf.slice(0, nread))); + paused = true; + this.pause(); + setTimeout(() => { + paused = false; + this.resume(); + }, 100); + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(Buffer.concat(buffers), message); + })); +}); + +// Test implicit socket pause +net.createServer(common.mustCall(function(socket) { + this.close(); + socket.end(message); +})).listen(0, function() { + let received = 0; + const buffers = []; + const sockBuf = Buffer.alloc(8); + let paused = false; + net.connect({ + port: this.address().port, + onread: { + buffer: sockBuf, + callback: function(nread, buf) { + assert.strictEqual(paused, false); + assert.strictEqual(buf, sockBuf); + received += nread; + buffers.push(Buffer.from(buf.slice(0, nread))); + paused = true; + setTimeout(() => { + paused = false; + this.resume(); + }, 100); + return false; + } + } + }).on('data', common.mustNotCall()).on('end', common.mustCall(() => { + assert.strictEqual(received, message.length); + assert.deepStrictEqual(Buffer.concat(buffers), message); + })); +}); |