summaryrefslogtreecommitdiff
path: root/test/parallel/test-http-agent.js
diff options
context:
space:
mode:
authorRefael Ackermann <refack@gmail.com>2017-07-02 23:52:41 -0400
committerRefael Ackermann <refack@gmail.com>2017-07-03 15:15:43 -0400
commit4b276e985fc682dc326f27f2e3ab9ddd41814a23 (patch)
treea8535de9aa5dd42a07908a963b3aa7f25ae5ae0d /test/parallel/test-http-agent.js
parent380929ec0c4c4004b522bed5e3800ebce2b68bfd (diff)
downloadandroid-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.js82
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);
+ }
+);