From d730b9f658f673d5ba45ec3cab3dcc77221878f5 Mon Sep 17 00:00:00 2001 From: Avital Oliver Date: Mon, 11 Feb 2013 22:49:54 -0800 Subject: [PATCH] tools/run-all-tests.sh and some related clarifications --- lib/meteor.js | 4 +- lib/packages.js | 2 +- .../bundler-test.sh | 4 +- .../kill-server-on-test-completion/package.js | 7 +++ .../tests_complete_hook.js | 57 +++++++++++++++++++ tools/run-all-tests.sh | 22 +++++++ 6 files changed, 93 insertions(+), 3 deletions(-) rename lib/tests/run-unit-tests.sh => tools/bundler-test.sh (73%) create mode 100644 tools/cli-test-packages/kill-server-on-test-completion/package.js create mode 100644 tools/cli-test-packages/kill-server-on-test-completion/tests_complete_hook.js create mode 100755 tools/run-all-tests.sh diff --git a/lib/meteor.js b/lib/meteor.js index 51f9674da8..29e9b9f081 100644 --- a/lib/meteor.js +++ b/lib/meteor.js @@ -99,6 +99,7 @@ Fiber(function () { .boolean('production') .describe('production', 'Run in production mode. Minify and bundle CSS and JS files.') .describe('settings', 'Set optional data for Meteor.settings on the server') + // #Once // With --once, meteor does not re-run the project if it crashes and // does not monitor for file changes. Intentionally undocumented: // intended for automated testing (eg, cli-test.sh), not end-user @@ -142,6 +143,7 @@ Fiber(function () { .describe('port', 'Port to listen on. NOTE: Also uses port N+1 and N+2.') .describe('release', 'Meteor release version to test.') .describe('deploy', 'Optionally, specify a domain to deploy to instead of running locally.') + .boolean('once') // See #Once .usage( "Usage: meteor test-packages [options] [comma delimited packages]\n" + "\n" + @@ -182,7 +184,7 @@ Fiber(function () { }; deploy.deployToServer(app_dir, bundleOptions, deployOptions); } else { - runner.run(app_dir, bundleOptions, new_argv.port); + runner.run(app_dir, bundleOptions, new_argv.port, new_argv.once); } } }); diff --git a/lib/packages.js b/lib/packages.js index 66b9fd7ef4..f55ed631b8 100644 --- a/lib/packages.js +++ b/lib/packages.js @@ -328,7 +328,7 @@ var packages = module.exports = { _.each(self._localPackageDirs(), function (dir) { _.each(fs.readdirSync(dir), function (name) { if (files.is_package_dir(path.join(dir, name))) { - if (!list[name]) + if (!list[name]) // earlier directories get precedent list[name] = packages.get(null, name); // empty manifest, we're loading from local packages } }); diff --git a/lib/tests/run-unit-tests.sh b/tools/bundler-test.sh similarity index 73% rename from lib/tests/run-unit-tests.sh rename to tools/bundler-test.sh index d49e963097..58b3d49510 100755 --- a/lib/tests/run-unit-tests.sh +++ b/tools/bundler-test.sh @@ -4,8 +4,10 @@ set -e trap 'echo FAILED' EXIT +METEOR_DIR=$(pwd)/.. + # run tests -../../tools/node.sh test_bundler.js +./node.sh $METEOR_DIR/lib/tests/test_bundler.js # cleanup trap, and print "SUCCESS" trap - EXIT diff --git a/tools/cli-test-packages/kill-server-on-test-completion/package.js b/tools/cli-test-packages/kill-server-on-test-completion/package.js new file mode 100644 index 0000000000..0fe9367d20 --- /dev/null +++ b/tools/cli-test-packages/kill-server-on-test-completion/package.js @@ -0,0 +1,7 @@ +Package.describe({ + summary: "Kill a server spawned with --once on test completion, after printing results" +}); + +Package.on_test(function (api) { + api.add_files('tests_complete_hook.js', ['client', 'server']); +}); diff --git a/tools/cli-test-packages/kill-server-on-test-completion/tests_complete_hook.js b/tools/cli-test-packages/kill-server-on-test-completion/tests_complete_hook.js new file mode 100644 index 0000000000..8745512f94 --- /dev/null +++ b/tools/cli-test-packages/kill-server-on-test-completion/tests_complete_hook.js @@ -0,0 +1,57 @@ +if (Meteor.isServer) { + + Meteor.methods({ + packageTestsComplete: function(results) { + console.log("Package test results"); + console.log("---"); + console.log(); + console.log(results); + if (results.indexOf('FAIL') === -1) + process.exit(0); + else + process.exit(1); + } + }); +} else { // isClient + + // Copied from test-in-browser/driver.js + expandFailures = function() { + // walk whole tree to look for failed tests + var walk = function (groups) { + var ret = true; + + _.each(groups || [], function (group) { + if (!ret) + return; + + _.each(group.tests || [], function (t) { + if (!ret) + return; + if (_testStatus(t) === "failed") + t.expanded = true; + }); + + if (!walk(group.groups)) + ret = false; + }); + + return ret; + }; + + walk(resultTree); + _resultsChanged(); + }; + + Meteor.onTestsComplete = function() { + // XXX I couldn't get this to work without setTimeout + // (it saw "running..." in the DOM); even with a call to + // Meteor.flush() + setTimeout(function() { + expandFailures(); + setTimeout(function() { + var results = document.body.innerText; + Meteor.call('packageTestsComplete', results); + }, 1000); + }, 1000); + }; +} \ No newline at end of file diff --git a/tools/run-all-tests.sh b/tools/run-all-tests.sh new file mode 100755 index 0000000000..8094d6a35a --- /dev/null +++ b/tools/run-all-tests.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +METEOR_DIR=`pwd`/.. + +trap 'echo FAILED' EXIT + +# Die on failure, print commands being executed +set -e -x + +# Test the Meteor CLI +./cli-test.sh + +# Run bundler unit tests +./bundler-test.sh + +# Test all packages, adding 'kill-server-on-test-completion' +(sleep 1; open http://localhost:3000) & +PACKAGE_DIRS=$METEOR_DIR/tools/cli-test-packages/ $METEOR_DIR/meteor test-packages --once + +trap - EXIT +echo PASSED +