From 0c6d3b7ddc238d0823853206ff5811cd6c25a32b Mon Sep 17 00:00:00 2001 From: KVS85 Date: Wed, 7 Aug 2019 22:37:00 +0300 Subject: [PATCH] Set jsunity output to gtest style (#9646) * Set jsunity output to gtest style * More pretty printing * Fix jslint * Remove unnecessary spaces --- UnitTests/unittest.js | 3 +- js/client/modules/@arangodb/test-utils.js | 6 +- js/client/modules/@arangodb/testing.js | 4 +- js/common/modules/jsunity.js | 100 +++++++++++++++++---- js/common/modules/jsunity/jsunity.js | 104 +++++++++++----------- 5 files changed, 138 insertions(+), 79 deletions(-) diff --git a/UnitTests/unittest.js b/UnitTests/unittest.js index b5b13a6d03..a7549a06c1 100644 --- a/UnitTests/unittest.js +++ b/UnitTests/unittest.js @@ -334,6 +334,7 @@ let result = main(ARGUMENTS); if (!result) { // force an error in the console - throw 'peng!'; + process.exit(1); + // throw 'peng!'; } diff --git a/js/client/modules/@arangodb/test-utils.js b/js/client/modules/@arangodb/test-utils.js index 9a79a4861e..d618647eee 100755 --- a/js/client/modules/@arangodb/test-utils.js +++ b/js/client/modules/@arangodb/test-utils.js @@ -41,10 +41,10 @@ const platform = require('internal').platform; /* Constants: */ // const BLUE = require('internal').COLORS.COLOR_BLUE; // const CYAN = require('internal').COLORS.COLOR_CYAN; -// const GREEN = require('internal').COLORS.COLOR_GREEN; +const GREEN = require('internal').COLORS.COLOR_GREEN; const RED = require('internal').COLORS.COLOR_RED; const RESET = require('internal').COLORS.COLOR_RESET; -// const YELLOW = require('internal').COLORS.COLOR_YELLOW; +const YELLOW = require('internal').COLORS.COLOR_YELLOW; let didSplitBuckets = false; @@ -221,7 +221,7 @@ function performTests (options, testList, testname, runFn, serverOptions, startS break; } - print('\n' + Date() + ' ' + runFn.info + ': Trying', te, '...'); + print('\n' + (new Date()).toISOString() + GREEN + " [============] " + runFn.info + ': Trying', te, '...', RESET); let reply = runFn(options, instanceInfo, te, env); if (reply.hasOwnProperty('forceTerminate')) { diff --git a/js/client/modules/@arangodb/testing.js b/js/client/modules/@arangodb/testing.js index b1a231fdaf..68bdf5d0c8 100755 --- a/js/client/modules/@arangodb/testing.js +++ b/js/client/modules/@arangodb/testing.js @@ -289,7 +289,7 @@ function unitTestPrettyPrintResults (res, testOutputDirectory, options) { function skipInternalMember (r, a) { return !r.hasOwnProperty(a) || internalMembers.indexOf(a) !== -1; } - print(BLUE + '================================================================================'); + print(YELLOW + '================================================================================'); print('TEST RESULTS'); print('================================================================================\n' + RESET); @@ -685,7 +685,7 @@ function iterateTests(cases, options, jsonReply) { if (options.testBuckets) { printTestName += " - " + options.testBuckets; } - print(BLUE + '================================================================================'); + print(YELLOW + '================================================================================'); print('Executing test', printTestName); print('================================================================================\n' + RESET); diff --git a/js/common/modules/jsunity.js b/js/common/modules/jsunity.js index c93751de2c..ee46bf1294 100644 --- a/js/common/modules/jsunity.js +++ b/js/common/modules/jsunity.js @@ -46,16 +46,26 @@ var TOTALTEARDOWNS = 0; var jsUnity = require('./jsunity/jsunity').jsUnity; var STARTTEST = 0.0; +var ENDTEST = 0.0; +var STARTSUITE = 0.0; +var ENDTEARDOWN = 0.0; var testFilter = "undefined"; +var currentSuiteName = "undefined"; +var testCount = 0; +var startMessage = ""; function setTestFilter(filter) { testFilter = filter; } jsUnity.results.begin = function (total, suiteName) { - print(Date() + ' Running ' + (suiteName || 'unnamed test suite')); - print(' ' + total + ' test(s) found'); - print(); + if (testCount > 0) + { + print(); + testCount = 0; + } + currentSuiteName = suiteName; + startMessage = " [------------] " + total + " tests from " + (suiteName || 'unnamed test suite'); RESULTS = {}; STARTTEST = jsUnity.env.getDate(); @@ -65,49 +75,97 @@ jsUnity.results.pass = function (index, testName) { var newtime = jsUnity.env.getDate(); RESULTS[testName].status = true; - RESULTS[testName].duration = newtime - STARTTEST; + RESULTS[testName].duration = (ENDTEST - STARTTEST); - print(newtime.toISOString() + internal.COLORS.COLOR_GREEN + ' [PASSED] ' + testName + internal.COLORS.COLOR_RESET + - ' in ' + STARTTEST.toISOString() + '+' + ((newtime - STARTTEST) / 1000).toFixed(3) + 's'); + print(newtime.toISOString() + internal.COLORS.COLOR_GREEN + ' [ PASSED ] ' + + testName + internal.COLORS.COLOR_RESET + + ' (setUp: ' + RESULTS[testName].setUpDuration + 'ms,' + + ' test: ' + RESULTS[testName].duration + 'ms,' + + ' tearDown: ' + RESULTS[testName].tearDownDuration + 'ms)'); STARTTEST = newtime; + + ++testCount; }; jsUnity.results.fail = function (index, testName, message) { var newtime = jsUnity.env.getDate(); + ++testCount; + + if (RESULTS[testName] === undefined) + { + if (testCount === 1) + { + print(newtime.toISOString() + internal.COLORS.COLOR_RED + " [ FAILED ] " + currentSuiteName + + internal.COLORS.COLOR_RESET + " (setUpAll: " + (jsUnity.env.getDate() - STARTTEST) + "ms)"); + + ENDTEST = newtime; + } + print(internal.COLORS.COLOR_RED + message + internal.COLORS.COLOR_RESET); + + return; + } + RESULTS[testName].status = false; RESULTS[testName].message = message; - RESULTS[testName].duration = newtime - STARTTEST; + RESULTS[testName].duration = (ENDTEST - STARTTEST); - print(newtime.toISOString() + internal.COLORS.COLOR_RED + ' [FAILED] ' + testName + internal.COLORS.COLOR_RESET + - ' in ' + STARTTEST.toISOString() + '+' + ((newtime - STARTTEST) / 1000).toFixed(3) + 's: ' + - internal.COLORS.COLOR_RED + message + internal.COLORS.COLOR_RESET); + if (RESULTS[testName].setUpDuration === undefined) + { + RESULTS[testName].setUpDuration = newtime - SETUPS; + RESULTS[testName].duration = 0; + } + + print(newtime.toISOString() + internal.COLORS.COLOR_RED + " [ FAILED ] " + + testName + internal.COLORS.COLOR_RESET + + ' (setUp: ' + RESULTS[testName].setUpDuration + 'ms,' + + ' test: ' + RESULTS[testName].duration + 'ms,' + + ' tearDown: ' + (newtime - ENDTEST) + 'ms)\n' + + internal.COLORS.COLOR_RED + message + internal.COLORS.COLOR_RESET); STARTTEST = newtime; }; jsUnity.results.end = function (passed, failed, duration) { - print(' ' + passed + ' test(s) passed'); - print(' ' + ((failed > 0) ? - internal.COLORS.COLOR_RED : - internal.COLORS.COLOR_RESET) + - failed + ' test(s) failed' + internal.COLORS.COLOR_RESET); - print(' ' + duration + ' millisecond(s) elapsed'); - print(); + print(jsUnity.env.getDate().toISOString() + + ((failed > 0) ? internal.COLORS.COLOR_RED : internal.COLORS.COLOR_GREEN) + " [------------] " + + (passed + failed) + " tests from " + currentSuiteName + " ran" + internal.COLORS.COLOR_RESET + + " (tearDownAll: " + (jsUnity.env.getDate() - ENDTEST) + "ms)"); + print(jsUnity.env.getDate().toISOString() + internal.COLORS.COLOR_GREEN + + " [ PASSED ] " + passed + " tests." + internal.COLORS.COLOR_RESET); + if(failed > 0) + { + print(jsUnity.env.getDate().toISOString() + internal.COLORS.COLOR_RED + + " [ FAILED ] " + failed + ' tests.' + internal.COLORS.COLOR_RESET); + } }; jsUnity.results.beginSetUp = function(index, testName) { + if (testCount === 0) + { + print(STARTTEST.toISOString() + internal.COLORS.COLOR_GREEN + + startMessage + internal.COLORS.COLOR_RESET + ' (setUpAll: ' + + (jsUnity.env.getDate() - STARTTEST) + 'ms)' + internal.COLORS.COLOR_RESET); + } RESULTS[testName] = {}; SETUPS = jsUnity.env.getDate(); + print(jsUnity.env.getDate().toISOString() + internal.COLORS.COLOR_GREEN + ' [ RUN ] ' + testName + internal.COLORS.COLOR_RESET); }; + jsUnity.results.endSetUp = function(index, testName) { RESULTS[testName].setUpDuration = jsUnity.env.getDate() - SETUPS; TOTALSETUPS += RESULTS[testName].setUpDuration; + + STARTTEST = jsUnity.env.getDate(); }; + jsUnity.results.beginTeardown = function(index, testName) { TEARDOWNS = jsUnity.env.getDate(); + + ENDTEST = jsUnity.env.getDate(); }; + jsUnity.results.endTeardown = function(index, testName) { RESULTS[testName].tearDownDuration = jsUnity.env.getDate() - TEARDOWNS; TOTALTEARDOWNS += RESULTS[testName].tearDownDuration; @@ -220,11 +278,15 @@ function Run (testsuite) { // ////////////////////////////////////////////////////////////////////////////// function Done (suiteName) { - internal.printf('%d total, %d passed, %d failed, %d ms', TOTAL, PASSED, FAILED, DURATION); - print(); + let newtime = jsUnity.env.getDate(); var ok = FAILED === 0; + print(newtime.toISOString() + (ok ? internal.COLORS.COLOR_GREEN : internal.COLORS.COLOR_RED) + + " [============] " + "Ran: " + TOTAL + " tests (" + PASSED + " passed, " + FAILED + " failed)" + + internal.COLORS.COLOR_RESET+ " (" + DURATION + "ms total)"); + print(); + COMPLETE.duration = DURATION; COMPLETE.status = ok; COMPLETE.failed = FAILED; diff --git a/js/common/modules/jsunity/jsunity.js b/js/common/modules/jsunity/jsunity.js index bb10b5e1ae..e4c26536f5 100644 --- a/js/common/modules/jsunity/jsunity.js +++ b/js/common/modules/jsunity/jsunity.js @@ -523,64 +523,60 @@ var jsUnity = exports.jsUnity = (function () { var test = suite.tests[j]; counter = 0; - - try { - this.results.beginSetUp(suite.scope, test.name); - setUp(test.name); - this.results.endSetUp(suite.scope, test.name); - - test.fn.call(suite.scope, test.name); + let didSetUp = false; + let didTest = false; + let skipTest = false; + let didTearDown = false; + let messages = []; - - this.results.beginTeardown(suite.scope, test.name); - tearDown(test.name); - this.results.endTeardown(suite.scope, test.name); - - this.results.pass(j + 1, test.name); - - results.passed++; - } catch (e) { + while (1) { try { - tearDown(test.name); // if tearDown above throws exc, will call again! - } - catch (x) { - var xstack; - if (x.stack !== undefined) { - xstack = x.stack; + if (!didSetUp) { + this.results.beginSetUp(suite.scope, test.name); + setUp(test.name); + this.results.endSetUp(suite.scope, test.name); + didSetUp = true; } - if (e.stack !== undefined) { - this.results.fail(j + 1, - test.name, - e + " - " + String(e.stack) + - " - teardown failed - " + - x + - " - " + - xstack); + if (!didTest && !skipTest) { + test.fn.call(suite.scope, test.name); + didTest = true; + } + if (!didTearDown) { + this.results.beginTeardown(suite.scope, test.name); + tearDown(test.name); + this.results.endTeardown(suite.scope, test.name); + didTearDown = true; + } + + if (messages.length === 0) { + this.results.pass(j + 1, test.name); + results.passed++; + } else { + this.results.fail(j + 1, test.name, messages.join('\n')); + } + break; + } catch (e) { + if ( typeof e === "string" ) { + e = new Error(e); + } + if (!didSetUp) { + this.results.endSetUp(suite.scope, test.name); + didSetUp = true; + messages.push(String(e.stack) + " - setUp failed"); + skipTest = true; + continue; + } + if (!didTest && !skipTest) { + didTest = true; + messages.push(String(e.stack) + " - test failed"); + continue; + } + if (!didTearDown) { + this.results.endTeardown(suite.scope, test.name); + didTearDown = true; + messages.push(String(e.stack) + " - tearDown failed"); + continue; } - else { - this.results.fail(j + 1, - test.name, - e + - " - teardown failed - " + - x + - " - " + - xstack); - } - - this.log.error("Teardown failed (again): " + - x + - " - " + - xstack + - " aborting tests"); - - i = arguments.length; j = cnt; break; - } - - if (e.stack !== undefined) { - this.results.fail(j + 1, test.name, e + " - " + String(e.stack)); - } - else { - this.results.fail(j + 1, test.name, e); } } }