test: add test for missing `close`/`finish` event
authorMark Plomer <mark.plomer@boerse-go.de>
Mon, 13 Apr 2015 14:28:47 +0000 (16:28 +0200)
committerFedor Indutny <fedor@indutny.com>
Sat, 4 Jul 2015 03:31:07 +0000 (20:31 -0700)
See next commit for the actual fix.

PR-URL: https://github.com/iojs/io.js/pull/1373
Reviewed-By: Fedor Indutny <fedor@indutny.com>
test/parallel/test-http-response-close-event-race.js [new file with mode: 0644]

diff --git a/test/parallel/test-http-response-close-event-race.js b/test/parallel/test-http-response-close-event-race.js
new file mode 100644 (file)
index 0000000..b83a303
--- /dev/null
@@ -0,0 +1,90 @@
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var clientRequest = null;
+var eventCount = 0;
+var testTickCount = 3;
+
+var server = http.createServer(function(req, res) {
+  console.log('server: request');
+
+  res.on('finish', function() {
+    console.log('server: response finish');
+    eventCount++;
+  });
+  res.on('close', function() {
+    console.log('server: response close');
+    eventCount++;
+  });
+
+  console.log('client: aborting request');
+  clientRequest.abort();
+
+  var ticks = 0;
+  function tick() {
+    console.log('server: tick ' + ticks +
+                (req.connection.destroyed ? ' (connection destroyed!)' : ''));
+
+    if (ticks < testTickCount) {
+      ticks++;
+      setImmediate(tick);
+    } else {
+      sendResponse();
+    }
+  }
+  tick();
+
+  function sendResponse() {
+    console.log('server: sending response');
+    res.writeHead(200, {'Content-Type': 'text/plain'});
+    res.end('Response\n');
+    console.log('server: res.end() returned');
+
+    handleResponseEnd();
+  }
+});
+
+server.on('listening', function() {
+  console.log('server: listening on port ' + common.PORT);
+  console.log('-----------------------------------------------------');
+  startRequest();
+});
+
+server.on('connection', function(connection) {
+  console.log('server: connection');
+  connection.on('close', function() {
+    console.log('server: connection close');
+  });
+});
+
+server.on('close', function() {
+  console.log('server: close');
+});
+
+server.listen(common.PORT);
+
+function startRequest() {
+  console.log('client: starting request - testing with %d ticks after abort()',
+              testTickCount);
+  eventCount = 0;
+
+  var options = {port: common.PORT, path: '/'};
+  clientRequest = http.get(options, function() {});
+  clientRequest.on('error', function() {});
+}
+
+function handleResponseEnd() {
+  setImmediate(function() {
+    setImmediate(function() {
+      assert.equal(eventCount, 1);
+
+      if (testTickCount > 0) {
+        testTickCount--;
+        startRequest();
+      } else {
+        server.close();
+      }
+    });
+  });
+}