1'use strict';
2const common = require('../common');
3if (!common.hasCrypto)
4  common.skip('missing crypto');
5const assert = require('assert');
6const fixtures = require('../common/fixtures');
7const makeDuplexPair = require('../common/duplexpair');
8const tls = require('tls');
9const net = require('net');
10
11// This test ensures that `bufferSize` also works for those tlsSockets
12// created from `socket` of `Duplex`, with which, TLSSocket will wrap
13// sockets in `StreamWrap`.
14{
15  const iter = 10;
16
17  function createDuplex(port) {
18    const { clientSide, serverSide } = makeDuplexPair();
19
20    return new Promise((resolve, reject) => {
21      const socket = net.connect({
22        port,
23      }, common.mustCall(() => {
24        clientSide.pipe(socket);
25        socket.pipe(clientSide);
26        clientSide.on('close', common.mustCall(() => socket.destroy()));
27        socket.on('close', common.mustCall(() => clientSide.destroy()));
28
29        resolve(serverSide);
30      }));
31    });
32  }
33
34  const server = tls.createServer({
35    key: fixtures.readKey('agent2-key.pem'),
36    cert: fixtures.readKey('agent2-cert.pem')
37  }, common.mustCall((socket) => {
38    let str = '';
39    socket.setEncoding('utf-8');
40    socket.on('data', (chunk) => { str += chunk; });
41
42    socket.on('end', common.mustCall(() => {
43      assert.strictEqual(str, 'a'.repeat(iter - 1));
44      server.close();
45    }));
46  }));
47
48  server.listen(0, common.mustCall(() => {
49    const { port } = server.address();
50    createDuplex(port).then((socket) => {
51      const client = tls.connect({
52        socket,
53        rejectUnauthorized: false,
54      }, common.mustCall(() => {
55        assert.strictEqual(client.bufferSize, 0);
56
57        for (let i = 1; i < iter; i++) {
58          client.write('a');
59          assert.strictEqual(client.bufferSize, i);
60        }
61
62        client.on('end', common.mustCall());
63        client.on('close', common.mustCall(() => {
64          assert.strictEqual(client.bufferSize, undefined);
65        }));
66
67        client.end();
68      }));
69    });
70  }));
71}
72