From 6106256f69e7cb5ac3bc8849426abb74854c0425 Mon Sep 17 00:00:00 2001 From: Nick Bottomley Date: Thu, 13 Aug 2015 17:12:22 -0700 Subject: [PATCH] groundwork around parallelizing mocha child runner --- .jshintrc | 96 -------------------------------------- Makefile | 5 +- bin/_perturb | 3 ++ lib/index.js | 4 +- lib/run-mutant.js | 1 + lib/runners/mocha-child.js | 11 +++-- lib/types/mutator.js | 2 - 7 files changed, 17 insertions(+), 105 deletions(-) delete mode 100644 .jshintrc diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index e596821..0000000 --- a/.jshintrc +++ /dev/null @@ -1,96 +0,0 @@ -{ - // JSHint Default Configuration File (as on JSHint website) - // See http://jshint.com/docs/ for more details - - "maxerr" : 50, // {int} Maximum error before stopping - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : false, // true: Identifiers must be in camelCase - "curly" : false, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 2, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : true, // true: Requires all functions run in ES5 Strict Mode - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : false, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : true, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : true, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements - "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "noyield" : false, // true: Tolerate generator functions with no yield statement in them. - "notypeof" : false, // true: Tolerate invalid typeof operator values - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - // Environments - "browser" : true, // Web Browser (window, document, etc) - "couch" : false, // CouchDB - "devel" : true, // Development/debugging (alert, confirm, etc) - "dojo" : false, // Dojo Toolkit - "jasmine" : false, // Jasmine - "jquery" : false, // jQuery - "mocha" : true, // Mocha - "mootools" : false, // MooTools - "node" : true, // Node.js - "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) - "prototypejs" : false, // Prototype and Scriptaculous - "qunit" : false, // QUnit - "rhino" : false, // Rhino - "shelljs" : false, // ShellJS - "worker" : false, // Web Workers - "wsh" : false, // Windows Scripting Host - "yui" : false, // Yahoo User Interface - - // Custom Globals - "globals" : { - /* MOCHA */ - "describe" : false, - "xdescribe" : false, - "it" : false, - "xit" : false, - "before" : false, - "beforeEach" : false, - "after" : false, - "afterEach" : false - } -} diff --git a/Makefile b/Makefile index 908b28b..9a92068 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,10 @@ events: ./bin/perturb -r ./examples/event-emitter dogfood: - NODE_ENV=testing ./bin/perturb -r ./ -c 'make test' + NODE_ENV=testing ./bin/perturb --rootDir ./ --testCmd 'make test' + +dogfood-parallel: + NODE_ENV=testing ./bin/perturb --rootDir ./ --testCmd 'make test' --runner mochaChild --parallel dogfood-i: NODE_ENV=testing ./bin/perturb -r ./ -i diff --git a/bin/_perturb b/bin/_perturb index b646ede..13e9269 100755 --- a/bin/_perturb +++ b/bin/_perturb @@ -25,6 +25,8 @@ program .option("-i, --interception", "use interception strategy (no disk I/O)") .option("-v, --verbose", "lots of logging") .option("-k, --killRate", "minimum kill rate to exit with code 0") + .option("-p, --parallel", "run mutants in parallel (careful!)") + .option("-u, --runner ") .parse(process.argv); if (program.rootDir && program.rootDir[0] !== "/") { @@ -39,6 +41,7 @@ var userConfig = omitUndefined({ sourceGlob: program.sourceGlob, testCmd: program.testCmd, interception: program.interception, + runner: program.runner, }); // this will become the default reporter diff --git a/lib/index.js b/lib/index.js index d39709c..ba1a082 100644 --- a/lib/index.js +++ b/lib/index.js @@ -96,8 +96,10 @@ function makeSourceGroupHandler (config) { var sourceCode = mutants[0].sourceCode; var sourceFile = mutants[0].sourceFile; + var mapMethod = config.parallel ? async.map : async.mapSeries; + console.log(sourceFile, "starting...."); - async.mapSeries(mutants, runMutant(config), function (err, processedMutants) { + mapMethod(mutants, runMutant(config), function (err, processedMutants) { if (err) { console.log("ERR!", err); return done(err); diff --git a/lib/run-mutant.js b/lib/run-mutant.js index c86b86f..ab38491 100644 --- a/lib/run-mutant.js +++ b/lib/run-mutant.js @@ -42,6 +42,7 @@ function createMultiMutantRunner (config) { var last = finish(config, _done); var tests = mutant.testFiles.slice(); + console.log("RUNNER:", config.runner); var runner = runners[config.runner || DEFAULT_RUNNER]; if (runner == null) { throw new Error(ERRORS.InvalidReporter); diff --git a/lib/runners/mocha-child.js b/lib/runners/mocha-child.js index b313736..f979f5b 100644 --- a/lib/runners/mocha-child.js +++ b/lib/runners/mocha-child.js @@ -8,12 +8,13 @@ function mochaChildProcessRunner (testFile, done) { var exited; var child = exec(cmd, opts, function (err, stdout, stderr) { - if (!exited && err) { - console.log("child error callback"); - exited = true; - done(err.toString()); - } + // if (!exited && err) { + // console.log("child error callback"); + // exited = true; + // return done(err.toString()); + // } + console.log("CHILD EXITED WITH 0?", child.exitCode === 0, err); done(); }); diff --git a/lib/types/mutator.js b/lib/types/mutator.js index 5385879..1f2951b 100644 --- a/lib/types/mutator.js +++ b/lib/types/mutator.js @@ -61,8 +61,6 @@ function assertValidMutator (mutator) { // console.log("Validation failed", msg); throw new FmtError(ERRORS.InvalidMutator, msg); } - // if (isMutatorValid(mutator)) return; - // throw new FmtError(ERRORS.InvalidMutator); } module.exports = assertValidMutator;