'use strict'; var fs = require('fs'); /* Note: because this plugin uses process.on('uncaughtException'), only one * of these can exist at any given time. This plugin and anything else that * uses process.on('uncaughtException') will conflict. */ exports.attachToRunner = function(runner, outputFile) { var smokeOutput = { results: [] }; var runningTests = {}; var integraPlugin = { beforeTest: function(test, callback) { test.startTime = Date.now(); runningTests[test.name] = test; callback(); }, afterTest: function(test, callback) { smokeOutput.results.push({ status: test.status, start: test.startTime, end: Date.now(), test_file: test.name, exit_code: 0, url: '' }); delete runningTests[test.name]; callback(); }, beforeExit: function(obj, callback) { fs.writeFile(outputFile, JSON.stringify(smokeOutput), function() { callback(); }); } }; // In case of exception, make sure we write file process.on('uncaughtException', function(err) { // Mark all currently running tests as failed for (var testName in runningTests) { smokeOutput.results.push({ status: 'fail', start: runningTests[testName].startTime, end: Date.now(), test_file: testName, exit_code: 0, url: '' }); } // write file fs.writeFileSync(outputFile, JSON.stringify(smokeOutput)); // Standard NodeJS uncaught exception handler console.error(err.stack); process.exit(1); }); runner.plugin(integraPlugin); return integraPlugin; };