diff --git a/test/common/README.md b/test/common/README.md index 73779fd5372..f0bbe7d13dc 100644 --- a/test/common/README.md +++ b/test/common/README.md @@ -380,7 +380,7 @@ Synchronous version of `spawnPwd`. The `Countdown` module provides a simple countdown mechanism for tests that require a particular action to be taken after a given number of completed tasks (for instance, shutting down an HTTP server after a specific number of -requests). +requests). The Countdown will fail the test if the remainder did not reach 0. ```js diff --git a/test/common/countdown.js b/test/common/countdown.js index 93bdbbfb16d..5fcb77c4ed6 100644 --- a/test/common/countdown.js +++ b/test/common/countdown.js @@ -4,13 +4,14 @@ const assert = require('assert'); const kLimit = Symbol('limit'); const kCallback = Symbol('callback'); +const common = require('./'); class Countdown { constructor(limit, cb) { assert.strictEqual(typeof limit, 'number'); assert.strictEqual(typeof cb, 'function'); this[kLimit] = limit; - this[kCallback] = cb; + this[kCallback] = common.mustCall(cb); } dec() { diff --git a/test/fixtures/failcounter.js b/test/fixtures/failcounter.js new file mode 100644 index 00000000000..f3bc34a7308 --- /dev/null +++ b/test/fixtures/failcounter.js @@ -0,0 +1,2 @@ +const Countdown = require('../common/countdown'); +new Countdown(2, () => {}); diff --git a/test/parallel/test-common-countdown.js b/test/parallel/test-common-countdown.js index ec0543f36fe..6a1a2f1bbce 100644 --- a/test/parallel/test-common-countdown.js +++ b/test/parallel/test-common-countdown.js @@ -3,13 +3,31 @@ const common = require('../common'); const assert = require('assert'); const Countdown = require('../common/countdown'); +const fixtures = require('../common/fixtures'); +const { execFile } = require('child_process'); let done = ''; - -const countdown = new Countdown(2, common.mustCall(() => done = true)); +const countdown = new Countdown(2, () => done = true); assert.strictEqual(countdown.remaining, 2); countdown.dec(); assert.strictEqual(countdown.remaining, 1); countdown.dec(); assert.strictEqual(countdown.remaining, 0); assert.strictEqual(done, true); + +const failFixtures = [ + [ + fixtures.path('failcounter.js'), + 'Mismatched function calls. Expected exactly 1, actual 0.', + ] +]; + +for (const p of failFixtures) { + const [file, expected] = p; + execFile(process.argv[0], [file], common.mustCall((ex, stdout, stderr) => { + assert.ok(ex); + assert.strictEqual(stderr, ''); + const firstLine = stdout.split('\n').shift(); + assert.strictEqual(firstLine, expected); + })); +} diff --git a/test/parallel/test-http-after-connect.js b/test/parallel/test-http-after-connect.js index 324186bab72..d209c82083e 100644 --- a/test/parallel/test-http-after-connect.js +++ b/test/parallel/test-http-after-connect.js @@ -32,7 +32,7 @@ const server = http.createServer(common.mustCall((req, res) => { setTimeout(() => res.end(req.url), 50); }, 2)); -const countdown = new Countdown(2, common.mustCall(() => server.close())); +const countdown = new Countdown(2, () => server.close()); server.on('connect', common.mustCall((req, socket) => { socket.write('HTTP/1.1 200 Connection established\r\n\r\n'); diff --git a/test/parallel/test-http-agent-destroyed-socket.js b/test/parallel/test-http-agent-destroyed-socket.js index 7970ce8bae0..39f4ebef537 100644 --- a/test/parallel/test-http-agent-destroyed-socket.js +++ b/test/parallel/test-http-agent-destroyed-socket.js @@ -80,7 +80,7 @@ const server = http.createServer(common.mustCall((req, res) => { assert(request1.socket.destroyed); // assert not reusing the same socket, since it was destroyed. assert.notStrictEqual(request1.socket, request2.socket); - const countdown = new Countdown(2, common.mustCall(() => server.close())); + const countdown = new Countdown(2, () => server.close()); request2.socket.on('close', common.mustCall(() => countdown.dec())); response.on('end', common.mustCall(() => countdown.dec())); response.resume(); diff --git a/test/parallel/test-http-agent-maxsockets-regress-4050.js b/test/parallel/test-http-agent-maxsockets-regress-4050.js index 57a90e4b05c..eb1c95d5200 100644 --- a/test/parallel/test-http-agent-maxsockets-regress-4050.js +++ b/test/parallel/test-http-agent-maxsockets-regress-4050.js @@ -17,7 +17,7 @@ const server = http.createServer(common.mustCall((req, res) => { res.end('hello world'); }, 6)); -const countdown = new Countdown(6, common.mustCall(() => server.close())); +const countdown = new Countdown(6, () => server.close()); function get(path, callback) { return http.get({ diff --git a/test/parallel/test-http-agent-maxsockets.js b/test/parallel/test-http-agent-maxsockets.js index 4d422f4a90b..267f820e043 100644 --- a/test/parallel/test-http-agent-maxsockets.js +++ b/test/parallel/test-http-agent-maxsockets.js @@ -26,13 +26,13 @@ function get(path, callback) { }, callback); } -const countdown = new Countdown(2, common.mustCall(() => { +const countdown = new Countdown(2, () => { const freepool = agent.freeSockets[Object.keys(agent.freeSockets)[0]]; assert.strictEqual(freepool.length, 2, `expect keep 2 free sockets, but got ${freepool.length}`); agent.destroy(); server.close(); -})); +}); function dec() { process.nextTick(() => countdown.dec()); diff --git a/test/parallel/test-http-client-abort.js b/test/parallel/test-http-client-abort.js index 71fd2ad64ca..f767189ea9d 100644 --- a/test/parallel/test-http-client-abort.js +++ b/test/parallel/test-http-client-abort.js @@ -26,7 +26,7 @@ const Countdown = require('../common/countdown'); const N = 8; -const countdown = new Countdown(N, common.mustCall(() => server.close())); +const countdown = new Countdown(N, () => server.close()); const server = http.Server(common.mustCall((req, res) => { res.writeHead(200); @@ -37,9 +37,9 @@ const server = http.Server(common.mustCall((req, res) => { server.listen(0, common.mustCall(() => { const requests = []; - const reqCountdown = new Countdown(N, common.mustCall(() => { + const reqCountdown = new Countdown(N, () => { requests.forEach((req) => req.abort()); - })); + }); const options = { port: server.address().port }; diff --git a/test/parallel/test-http-client-parse-error.js b/test/parallel/test-http-client-parse-error.js index 60f1ee45c8e..cb4e3ff0843 100644 --- a/test/parallel/test-http-client-parse-error.js +++ b/test/parallel/test-http-client-parse-error.js @@ -25,7 +25,7 @@ const http = require('http'); const net = require('net'); const Countdown = require('../common/countdown'); -const countdown = new Countdown(2, common.mustCall(() => server.close())); +const countdown = new Countdown(2, () => server.close()); const payloads = [ 'HTTP/1.1 302 Object Moved\r\nContent-Length: 0\r\n\r\nhi world', diff --git a/test/parallel/test-http-exceptions.js b/test/parallel/test-http-exceptions.js index 0b6ac5bdc1f..03e30b67e18 100644 --- a/test/parallel/test-http-exceptions.js +++ b/test/parallel/test-http-exceptions.js @@ -21,7 +21,12 @@ 'use strict'; require('../common'); +const Countdown = require('../common/countdown'); const http = require('http'); +const NUMBER_OF_EXCEPTIONS = 4; +const countdown = new Countdown(NUMBER_OF_EXCEPTIONS, () => { + process.exit(0); +}); const server = http.createServer(function(req, res) { intentionally_not_defined(); // eslint-disable-line no-undef @@ -30,16 +35,16 @@ const server = http.createServer(function(req, res) { res.end(); }); +function onUncaughtException(err) { + console.log(`Caught an exception: ${err}`); + if (err.name === 'AssertionError') throw err; + countdown.dec(); +} + +process.on('uncaughtException', onUncaughtException); + server.listen(0, function() { - for (let i = 0; i < 4; i += 1) { + for (let i = 0; i < NUMBER_OF_EXCEPTIONS; i += 1) { http.get({ port: this.address().port, path: `/busy/${i}` }); } }); - -let exception_count = 0; - -process.on('uncaughtException', function(err) { - console.log(`Caught an exception: ${err}`); - if (err.name === 'AssertionError') throw err; - if (++exception_count === 4) process.exit(0); -}); diff --git a/test/parallel/test-http2-no-more-streams.js b/test/parallel/test-http2-no-more-streams.js index dd06a709f23..ff0c8baa14c 100644 --- a/test/parallel/test-http2-no-more-streams.js +++ b/test/parallel/test-http2-no-more-streams.js @@ -23,10 +23,10 @@ server.listen(0, common.mustCall(() => { assert.strictEqual(client.state.nextStreamID, nextID); - const countdown = new Countdown(2, common.mustCall(() => { + const countdown = new Countdown(2, () => { server.close(); client.close(); - })); + }); { // This one will be ok diff --git a/test/parallel/test-http2-server-rst-stream.js b/test/parallel/test-http2-server-rst-stream.js index c2d938c22f4..4b59a5ebe85 100644 --- a/test/parallel/test-http2-server-rst-stream.js +++ b/test/parallel/test-http2-server-rst-stream.js @@ -32,10 +32,10 @@ server.on('stream', (stream, headers) => { server.listen(0, common.mustCall(() => { const client = http2.connect(`http://localhost:${server.address().port}`); - const countdown = new Countdown(tests.length, common.mustCall(() => { + const countdown = new Countdown(tests.length, () => { client.close(); server.close(); - })); + }); tests.forEach((test) => { const req = client.request({ diff --git a/test/parallel/test-performanceobserver.js b/test/parallel/test-performanceobserver.js index 196675d1f5f..2a629995227 100644 --- a/test/parallel/test-performanceobserver.js +++ b/test/parallel/test-performanceobserver.js @@ -65,10 +65,10 @@ assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_FUNCTION], 0); new PerformanceObserver(common.mustCall(callback, 3)); const countdown = - new Countdown(3, common.mustCall(() => { + new Countdown(3, () => { observer.disconnect(); assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_MARK], 1); - })); + }); function callback(list, obs) { assert.strictEqual(obs, observer); diff --git a/test/parallel/test-timers-socket-timeout-removes-other-socket-unref-timer.js b/test/parallel/test-timers-socket-timeout-removes-other-socket-unref-timer.js index 842c8180701..5dceb386fdb 100644 --- a/test/parallel/test-timers-socket-timeout-removes-other-socket-unref-timer.js +++ b/test/parallel/test-timers-socket-timeout-removes-other-socket-unref-timer.js @@ -33,7 +33,7 @@ const server = net.createServer(function onClient(client) { }); server.listen(0, common.localhostIPv4, common.mustCall(() => { - const countdown = new Countdown(2, common.mustCall(() => server.close())); + const countdown = new Countdown(2, () => server.close()); { const client = net.connect({ port: server.address().port });