• 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';
23// This tests setTimeout() by having multiple clients connecting and sending
24// data in random intervals. Clients are also randomly disconnecting until there
25// are no more clients left. If no false timeout occurs, this test has passed.
26const common = require('../common');
27const http = require('http');
28const server = http.createServer();
29let connections = 0;
30
31const ontimeout = common.mustNotCall('Unexpected timeout');
32
33server.on('request', function(req, res) {
34  req.socket.setTimeout(1000);
35  req.socket.on('timeout', ontimeout);
36  req.on('end', function() {
37    connections--;
38    res.writeHead(200);
39    req.socket.off('timeout', ontimeout);
40    res.end('done\n');
41    if (connections === 0) {
42      server.close();
43    }
44  });
45  req.resume();
46});
47
48server.listen(0, function() {
49  for (let i = 0; i < 10; i++) {
50    connections++;
51    let count = 0;
52    setTimeout(function() {
53      const request = http.request({
54        port: server.address().port,
55        method: 'POST',
56        path: '/',
57      });
58
59      function ping() {
60        if (++count === 10) {
61          request.end();
62          return;
63        }
64        request.write('ping');
65        setTimeout(ping, 300);
66      }
67      ping();
68    }, i * 50);
69  }
70});
71