• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright Joyent, Inc. and other Node contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and associated documentation files (the
5// "Software"), to deal in the Software without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Software, and to permit
8// persons to whom the Software is furnished to do so, subject to the
9// following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22'use strict';
23const common = require('../common');
24if (!common.hasCrypto)
25  common.skip('missing crypto');
26
27// This test ensures that the data received over tls-server after pause
28// is same as what it was sent
29
30const assert = require('assert');
31const tls = require('tls');
32const fixtures = require('../common/fixtures');
33
34const options = {
35  key: fixtures.readKey('rsa_private.pem'),
36  cert: fixtures.readKey('rsa_cert.crt')
37};
38
39const bufSize = 1024 * 1024;
40let sent = 0;
41let received = 0;
42
43const server = tls.Server(options, common.mustCall((socket) => {
44  socket.pipe(socket);
45  socket.on('data', (c) => {
46    console.error('data', c.length);
47  });
48}));
49
50server.listen(0, common.mustCall(() => {
51  let resumed = false;
52  const client = tls.connect({
53    port: server.address().port,
54    rejectUnauthorized: false
55  }, common.mustCall(() => {
56    console.error('connected');
57    client.pause();
58    console.error('paused');
59    const send = (() => {
60      console.error('sending');
61      const ret = client.write(Buffer.allocUnsafe(bufSize));
62      console.error(`write => ${ret}`);
63      if (ret !== false) {
64        console.error('write again');
65        sent += bufSize;
66        assert.ok(sent < 100 * 1024 * 1024); // max 100MB
67        return process.nextTick(send);
68      }
69      sent += bufSize;
70      console.error(`sent: ${sent}`);
71      resumed = true;
72      client.resume();
73      console.error('resumed', client);
74    })();
75  }));
76  client.on('data', (data) => {
77    console.error('data');
78    assert.ok(resumed);
79    received += data.length;
80    console.error('received', received);
81    console.error('sent', sent);
82    if (received >= sent) {
83      console.error(`received: ${received}`);
84      client.end();
85      server.close();
86    }
87  });
88}));
89
90process.on('exit', () => {
91  assert.strictEqual(sent, received);
92});
93