|
|
|
|
@@ -1,114 +1,29 @@
|
|
|
|
|
// Test runner - runs test suites in parallel and reports results
|
|
|
|
|
|
|
|
|
|
var parseq = use("parseq");
|
|
|
|
|
var time = use("time");
|
|
|
|
|
var def = arg
|
|
|
|
|
|
|
|
|
|
// Get test names from command line arguments
|
|
|
|
|
var tests = arg || [];
|
|
|
|
|
if (arg.length === 0)
|
|
|
|
|
arg = [
|
|
|
|
|
'send',
|
|
|
|
|
'stop',
|
|
|
|
|
'blob',
|
|
|
|
|
'clock',
|
|
|
|
|
'couple',
|
|
|
|
|
'disrupt',
|
|
|
|
|
'empty', // this one should be an error
|
|
|
|
|
'text',
|
|
|
|
|
'http',
|
|
|
|
|
'use',
|
|
|
|
|
'parseq'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
// Track overall results
|
|
|
|
|
var totalPassed = 0;
|
|
|
|
|
var totalFailed = 0;
|
|
|
|
|
var totalTests = 0;
|
|
|
|
|
var allFailures = [];
|
|
|
|
|
var startTime = time.number();
|
|
|
|
|
|
|
|
|
|
// Create a requestor for each test
|
|
|
|
|
function run_test_requestor(testName) {
|
|
|
|
|
return function (cb, val) {
|
|
|
|
|
// Start the test actor
|
|
|
|
|
$_.start(function (greet) {
|
|
|
|
|
log.console('senging start to ' + json.encode(greet))
|
|
|
|
|
// Send run_tests message
|
|
|
|
|
send(greet.actor, {
|
|
|
|
|
type: 'run_tests',
|
|
|
|
|
test_name: testName
|
|
|
|
|
}, function (result) {
|
|
|
|
|
// Handle test results
|
|
|
|
|
if (result && result.type === 'test_results') {
|
|
|
|
|
cb(result);
|
|
|
|
|
} else {
|
|
|
|
|
cb(null, "Test " + testName + " did not return valid results");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}, "tests/" + testName, $_);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Build array of requestors
|
|
|
|
|
var requestors = tests.map(function (t) {
|
|
|
|
|
return run_test_requestor(t);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Run tests in parallel
|
|
|
|
|
if (requestors.length === 0) {
|
|
|
|
|
log.error("No tests specified. Usage: cell test <test1> <test2> ...");
|
|
|
|
|
quit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var concurrency = 5;
|
|
|
|
|
var all_tests_job = parseq.par_all(requestors, undefined, concurrency);
|
|
|
|
|
|
|
|
|
|
// Handle results
|
|
|
|
|
all_tests_job(function (results, reason) {
|
|
|
|
|
if (!results) {
|
|
|
|
|
log.error("\n❌ Test suite failed:", reason);
|
|
|
|
|
quit(1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Aggregate results
|
|
|
|
|
log.console("\n" + "=".repeat(60));
|
|
|
|
|
log.console("TEST RESULTS");
|
|
|
|
|
log.console("=".repeat(60));
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < tests.length; i++) {
|
|
|
|
|
var result = results[i];
|
|
|
|
|
var testName = tests[i];
|
|
|
|
|
for (var test of def)
|
|
|
|
|
$_.start(e => {
|
|
|
|
|
|
|
|
|
|
if (result && result.type === 'test_results') {
|
|
|
|
|
totalPassed += result.passed;
|
|
|
|
|
totalFailed += result.failed;
|
|
|
|
|
totalTests += result.total;
|
|
|
|
|
|
|
|
|
|
var status = result.failed === 0 ? "✅ PASSED" : "❌ FAILED";
|
|
|
|
|
log.console("\n" + testName + ": " + status);
|
|
|
|
|
log.console(" Passed: " + result.passed + "/" + result.total);
|
|
|
|
|
|
|
|
|
|
if (result.failures && result.failures.length > 0) {
|
|
|
|
|
log.console(" Failures:");
|
|
|
|
|
for (var j = 0; j < result.failures.length; j++) {
|
|
|
|
|
var failure = result.failures[j];
|
|
|
|
|
allFailures.push({test: testName, failure: failure});
|
|
|
|
|
log.console(" - " + failure.name);
|
|
|
|
|
if (failure.error) {
|
|
|
|
|
log.console(" " + failure.error.split("\n").join("\n "));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.duration) {
|
|
|
|
|
log.console(" Duration: " + result.duration + "ms");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, 'tests/' + test, $_)
|
|
|
|
|
|
|
|
|
|
// Summary
|
|
|
|
|
var elapsed = time.now() - startTime;
|
|
|
|
|
log.console("\n" + "=".repeat(60));
|
|
|
|
|
log.console("SUMMARY");
|
|
|
|
|
log.console("=".repeat(60));
|
|
|
|
|
log.console("Total: " + totalPassed + "/" + totalTests + " tests passed");
|
|
|
|
|
log.console("Failed: " + totalFailed + " tests");
|
|
|
|
|
log.console("Time: " + elapsed + "ms");
|
|
|
|
|
log.console("=".repeat(60) + "\n");
|
|
|
|
|
|
|
|
|
|
// Exit with appropriate code
|
|
|
|
|
quit(totalFailed === 0 ? 0 : 1);
|
|
|
|
|
});
|
|
|
|
|
$_.delay($_.stop, 1)
|
|
|
|
|
|
|
|
|
|
// Timeout protection
|
|
|
|
|
$_.delay(function() {
|
|
|
|
|
log.error("\n⏰ TEST TIMEOUT: Tests did not complete within 30 seconds");
|
|
|
|
|
quit(1);
|
|
|
|
|
}, 30);
|
|
|
|
|
$_.receiver(e => {
|
|
|
|
|
log.console(json.encode(e))
|
|
|
|
|
})
|