• 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.
26require('../common');
27const http = require('http');
28const server = http.createServer();
29let connections = 0;
30
31server.on('request', function(req, res) {
32  req.socket.setTimeout(1000);
33  req.socket.on('timeout', function() {
34    throw new Error('Unexpected timeout');
35  });
36  req.on('end', function() {
37    connections--;
38    res.writeHead(200);
39    res.end('done\n');
40    if (connections === 0) {
41      server.close();
42    }
43  });
44  req.resume();
45});
46
47server.listen(0, '127.0.0.1', function() {
48  for (let i = 0; i < 10; i++) {
49    connections++;
50
51    setTimeout(function() {
52      const request = http.request({
53        port: server.address().port,
54        method: 'POST',
55        path: '/'
56      });
57
58      function ping() {
59        const nextPing = (Math.random() * 900).toFixed();
60        if (nextPing > 600) {
61          request.end();
62          return;
63        }
64        request.write('ping');
65        setTimeout(ping, nextPing);
66      }
67      ping();
68    }, i * 50);
69  }
70});
71