socket_pool_spec.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. var needle = require('../'),
  2. should = require('should'),
  3. http = require('http');
  4. var server, port = 11112;
  5. describe('socket reuse', function() {
  6. before(function() {
  7. server = http.createServer(function(req, res) {
  8. res.setHeader('Content-Type', 'application/json');
  9. setTimeout(function() {
  10. res.end('{"foo":"bar"}');
  11. }, 50);
  12. }).listen(port);
  13. });
  14. after(function() {
  15. server.close();
  16. });
  17. describe('when sockets are reused', function() {
  18. var httpAgent = new http.Agent({
  19. keepAlive : true,
  20. maxSockets : 1
  21. });
  22. it('does not duplicate listeners on .end', function(done) {
  23. var last_error;
  24. var count = 10;
  25. function completed(err) {
  26. --count || done(last_error);
  27. }
  28. function send() {
  29. needle.get('localhost:' + port, { agent: httpAgent }, function(err, resp) {
  30. if (err)
  31. throw new Error("Unexpected error: " + err);
  32. // lets go through all sockets and inspect all socket objects
  33. for (hostTarget in httpAgent.sockets) {
  34. httpAgent.sockets[hostTarget].forEach(function(socket) {
  35. // normally, there are 2 internal listeners and 1 needle sets up,
  36. // but to be sure the test does not fail even if newer node versions
  37. // introduce additional listeners, we use a higher limit.
  38. try {
  39. socket.listeners('end').length.should.be.below(5, "too many listeners on the socket object's end event");
  40. } catch (e) {
  41. last_error = e;
  42. }
  43. });
  44. }
  45. completed();
  46. });
  47. }
  48. for (var i = 0; i < count; i++) {
  49. send();
  50. }
  51. });
  52. });
  53. });