mirror of https://gitee.com/openkylin/nodejs.git
187 lines
5.4 KiB
JavaScript
187 lines
5.4 KiB
JavaScript
|
'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);
|
||
|
}));
|
||
|
});
|