diff options
author | Refael Ackermann <refack@gmail.com> | 2017-07-02 23:52:41 -0400 |
---|---|---|
committer | Refael Ackermann <refack@gmail.com> | 2017-07-03 15:15:43 -0400 |
commit | 4b276e985fc682dc326f27f2e3ab9ddd41814a23 (patch) | |
tree | a8535de9aa5dd42a07908a963b3aa7f25ae5ae0d /test/parallel/test-http-agent.js | |
parent | 380929ec0c4c4004b522bed5e3800ebce2b68bfd (diff) | |
download | android-node-v8-4b276e985fc682dc326f27f2e3ab9ddd41814a23.tar.gz android-node-v8-4b276e985fc682dc326f27f2e3ab9ddd41814a23.tar.bz2 android-node-v8-4b276e985fc682dc326f27f2e3ab9ddd41814a23.zip |
http: guard against failed sockets creation
PR-URL: https://github.com/nodejs/node/pull/13839
Fixes: https://github.com/nodejs/node/issues/13045
Fixes: https://github.com/nodejs/node/issues/13831
Refs: https://github.com/nodejs/node/issues/13352
Refs: https://github.com/nodejs/node/issues/13548#issuecomment-307177400
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'test/parallel/test-http-agent.js')
-rw-r--r-- | test/parallel/test-http-agent.js | 82 |
1 files changed, 53 insertions, 29 deletions
diff --git a/test/parallel/test-http-agent.js b/test/parallel/test-http-agent.js index 23878673aa..d7cb56fb45 100644 --- a/test/parallel/test-http-agent.js +++ b/test/parallel/test-http-agent.js @@ -20,41 +20,65 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const http = require('http'); -const server = http.Server(function(req, res) { - res.writeHead(200); - res.end('hello world\n'); -}); - -let responses = 0; const N = 4; const M = 4; +const server = http.Server(common.mustCall(function(req, res) { + res.writeHead(200); + res.end('hello world\n'); +}, (N * M))); // N * M = good requests (the errors will not be counted) -server.listen(0, function() { - const port = this.address().port; - for (let i = 0; i < N; i++) { - setTimeout(function() { - for (let j = 0; j < M; j++) { - http.get({ port: port, path: '/' }, function(res) { - console.log('%d %d', responses, res.statusCode); - if (++responses === N * M) { - console.error('Received all responses, closing server'); - server.close(); - } - res.resume(); - }).on('error', function(e) { - console.log('Error!', e); - process.exit(1); - }); +function makeRequests(outCount, inCount, shouldFail) { + let responseCount = outCount * inCount; + let onRequest = common.mustNotCall(); // Temporary + const p = new Promise((resolve) => { + onRequest = common.mustCall((res) => { + if (--responseCount === 0) { + server.close(); + resolve(); } - }, i); - } -}); + if (!shouldFail) + res.resume(); + }, outCount * inCount); + }); + + server.listen(0, () => { + const port = server.address().port; + for (let i = 0; i < outCount; i++) { + setTimeout(() => { + for (let j = 0; j < inCount; j++) { + const req = http.get({ port: port, path: '/' }, onRequest); + if (shouldFail) + req.on('error', common.mustCall(onRequest)); + else + req.on('error', (e) => assert.fail(e)); + } + }, i); + } + }); + return p; +} +const test1 = makeRequests(N, M); -process.on('exit', function() { - assert.strictEqual(N * M, responses); -}); +const test2 = () => { + // Should not explode if can not create sockets. + // Ref: https://github.com/nodejs/node/issues/13045 + // Ref: https://github.com/nodejs/node/issues/13831 + http.Agent.prototype.createConnection = function createConnection(_, cb) { + process.nextTick(cb, new Error('nothing')); + }; + return makeRequests(N, M, true); +}; + +test1 + .then(test2) + .catch((e) => { + // This is currently the way to fail a test with a Promise. + console.error(e); + process.exit(1); + } +); |