text: 'use strict';
  
  const common = require('../common');
  const http = require('http');
  const net = require('net');
  
  const tests = [];
  
  function test(fn) {
    if (!tests.length) {
      process.nextTick(run);
    }
    tests.push(fn);
  }
  
  function run() {
    const fn = tests.shift();
    if (fn) fn(run);
  }
  
  function done(server, socket, cb) {
    socket.destroy();
    server.close(cb);
  }
  
  function serverTest(withPipeline, cb) {
    let gotAll = false;
    let timedout = false;
    const server = http.createServer(common.mustCall((req, res) => {
      if (withPipeline)
        res.end();
      if (req.url === '/3') {
        gotAll = true;
        if (timedout)
          done(server, req.socket, cb);
      }
    }, 3));
    server.setTimeout(500, common.mustCallAtLeast((socket) => {
      // End this test and call `run()` for the next test (if any).
      timedout = true;
      if (gotAll)
        done(server, socket, cb);
    }));
    server.keepAliveTimeout = 50;
    server.listen(0, common.mustCall(() => {
      const options = {
        port: server.address().port,
        allowHalfOpen: true
      };
      const c = net.connect(options, () => {
        c.write('GET /1 HTTP/1.1\r\nHost: localhost\r\n\r\n');
        c.write('GET /2 HTTP/1.1\r\nHost: localhost\r\n\r\n');
        c.write('GET /3 HTTP/1.1\r\nHost: localhost\r\n\r\n');
      });
    }));
  }
  
  test(function serverEndKeepAliveTimeoutWithPipeline(cb) {
    serverTest(true, cb);
  });
  
  test(function serverNoEndKeepAliveTimeoutWithPipeline(cb) {
    serverTest(false, cb);
  });
  