From 65d824b488793ba8b92dfcf6edc6e87f41745580 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 31 Jul 2012 17:47:53 +0200 Subject: [PATCH] test: add common.mustCall function Verifies that the callback gets invoked times during the lifetime of the test script. This is a back-port of commit d0e6c3f from the master branch. --- test/common.js | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/test/common.js b/test/common.js index e0ac7a09e1..4f96369f37 100644 --- a/test/common.js +++ b/test/common.js @@ -139,8 +139,43 @@ process.on('exit', function() { }); -// This function allows one two run an HTTP test agaist both HTTPS and -// normal HTTP modules. This ensures they fit the same API. -exports.httpTest = function httpTest(cb) { -}; +var mustCallChecks = []; + + +function runCallChecks() { + var failed = mustCallChecks.filter(function(context) { + return context.actual !== context.expected; + }); + + failed.forEach(function(context) { + console.log('Mismatched %s function calls. Expected %d, actual %d.', + context.name, + context.expected, + context.actual); + console.log(context.stack.split('\n').slice(2).join('\n')); + }); + + if (failed.length) process.exit(1); +} + +exports.mustCall = function(fn, expected) { + if (typeof expected !== 'number') expected = 1; + + var context = { + expected: expected, + actual: 0, + stack: (new Error).stack, + name: fn.name || '' + }; + + // add the exit listener only once to avoid listener leak warnings + if (mustCallChecks.length === 0) process.on('exit', runCallChecks); + + mustCallChecks.push(context); + + return function() { + context.actual++; + return fn.apply(this, arguments); + }; +};