'use strict'; const common = require('../common'); const assert = require('assert'); const net = require('net'); // Regression test for https://github.com/nodejs/node/issues/19562: // Writing to a socket first tries to push through as much data as possible // without blocking synchronously, and, if that is not enough, queues more // data up for asynchronous writing. // Check that `bytesWritten` accounts for both parts of a write. const N = 10000000; { // Variant 1: Write a Buffer. const server = net.createServer(common.mustCall((socket) => { socket.end(Buffer.alloc(N), common.mustCall(() => { assert.strictEqual(socket.bytesWritten, N); })); assert.strictEqual(socket.bytesWritten, N); })).listen(0, common.mustCall(() => { const client = net.connect(server.address().port); client.resume(); client.on('close', common.mustCall(() => { assert.strictEqual(client.bytesRead, N); server.close(); })); })); } { // Variant 2: Write a string. const server = net.createServer(common.mustCall((socket) => { socket.end('a'.repeat(N), common.mustCall(() => { assert.strictEqual(socket.bytesWritten, N); })); assert.strictEqual(socket.bytesWritten, N); })).listen(0, common.mustCall(() => { const client = net.connect(server.address().port); client.resume(); client.on('close', common.mustCall(() => { assert.strictEqual(client.bytesRead, N); server.close(); })); })); } { // Variant 2: writev() with mixed data. const server = net.createServer(common.mustCall((socket) => { socket.cork(); socket.write('a'.repeat(N)); assert.strictEqual(socket.bytesWritten, N); socket.write(Buffer.alloc(N)); assert.strictEqual(socket.bytesWritten, 2 * N); socket.end('', common.mustCall(() => { assert.strictEqual(socket.bytesWritten, 2 * N); })); socket.uncork(); })).listen(0, common.mustCall(() => { const client = net.connect(server.address().port); client.resume(); client.on('close', common.mustCall(() => { assert.strictEqual(client.bytesRead, 2 * N); server.close(); })); })); }