summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2019-01-10 15:52:27 -0500
committerBrian White <mscdex@mscdex.net>2019-08-23 17:05:52 -0400
commit8292b280ec9e6b8c2444cbe49350facc77f5fefa (patch)
tree2f40ac41f20b53b748a7039c4f00e419efb8784b /test
parent9d21b0395cc248a0e5537a11cc84f61919eccca6 (diff)
downloadandroid-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.js186
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);
+ }));
+});