socket_pool_spec.js 1.75 KB
var needle  = require('../'),
    should  = require('should'),
    http    = require('http');

var server, port = 11112;

describe('socket reuse', function() {

  var httpAgent = new http.Agent({
    keepAlive  : true,
    maxSockets : 1
  });

  before(function(done) {
    server = http.createServer(function(req, res) {
      res.setHeader('Content-Type', 'application/json');
      setTimeout(function() {
        res.end('{"foo":"bar"}');
      }, 50);
    }).listen(port, done);
  });

  after(function(done) {
    httpAgent.destroy();
    server.close(done);
  });

  describe('when sockets are reused', function() {

    it('does not duplicate listeners on .end', function(done) {

      var last_error;
      var count = 10;

      function completed(err) {
        --count || done(last_error);
      }

      function send() {
        needle.get('localhost:' + port, { agent: httpAgent }, function(err, resp) {
          if (err)
            throw new Error("Unexpected error: " + err);

          // lets go through all sockets and inspect all socket objects
          for (hostTarget in httpAgent.sockets) {
            httpAgent.sockets[hostTarget].forEach(function(socket) {
              // normally, there are 2 internal listeners and 1 needle sets up,
              // but to be sure the test does not fail even if newer node versions
              // introduce additional listeners, we use a higher limit.
              try {
                socket.listeners('end').length.should.be.below(5, "too many listeners on the socket object's end event");
              } catch (e) {
                last_error = e;
              }
            });
          }

          completed();
        });
      }

      for (var i = 0; i < count; i++) {
        send();
      }
    });
  });
});