diff --git a/lib/karma-parallelizer.js b/lib/karma-parallelizer.js index 5073943..f4563d5 100644 --- a/lib/karma-parallelizer.js +++ b/lib/karma-parallelizer.js @@ -8,10 +8,21 @@ function initKarmaParallelizer(root, shardIndexInfo) { return; } - const overrideSpecSuite = getSpecSuiteOverrider(shardIndexInfo); - ['describe', 'ddescribe', 'fdescribe'].forEach(function(methodName) { - replaceMethod(root, methodName, overrideSpecSuite); + const strategy = getSpecSuiteStrategy(shardIndexInfo); + const overrideSpecSuite = createSpecSuiteOverrider(strategy); + + // Mocha uses describe.only|skip + // Jasmine uses fdescribe|ddescribe|xdescribe + + replaceMethod(root, 'describe', function(method) { + const overriden = overrideSpecSuite(method); + replaceMethod(overriden, 'only', overrideSpecSuite); + replaceMethod(overriden, 'skip', overrideSpecSuite); + return overriden; }); + replaceMethod(root, 'xdescribe', overrideSpecSuite); + replaceMethod(root, 'fdescribe', overrideSpecSuite); + replaceMethod(root, 'ddescribe', overrideSpecSuite); } function replaceMethod(root, methodName, overrider) { @@ -35,23 +46,23 @@ function replaceMethod(root, methodName, overrider) { } } -function getSpecSuiteOverrider(shardIndexInfo) { +function getSpecSuiteStrategy(shardIndexInfo) { switch (shardIndexInfo.shardStrategy) { case 'description-length': - return createDescriptionLengthSpecSuiteOverrider(shardIndexInfo); + return createDescriptionLengthStragegy(shardIndexInfo); case 'round-robin': /* falls through */ default: - return createRoundRobinBasedSpecSuiteOverrider(shardIndexInfo); + return createRoundRobinStrategy(shardIndexInfo); } } -function createDescriptionLengthSpecSuiteOverrider({shardIndex, executors}) { +function createSpecSuiteOverrider(strategy) { let depth = 0; return function overrideSpecSuite(origDescribe) { return function(description, specDefinitions) { - // If we are a top-level describe but our description doesn't match our responsibility, skip it - if (depth === 0 && description.length % executors !== shardIndex) { + // If we are a top-level, ask our strategy if we should be interested in this suite + if (depth === 0 && !strategy(description, specDefinitions)) { // console.log('[skipping]', description); } else { origDescribe(description, function() { @@ -64,23 +75,18 @@ function createDescriptionLengthSpecSuiteOverrider({shardIndex, executors}) { }; } -function createRoundRobinBasedSpecSuiteOverrider({shardIndex, executors}) { - let depth = 0; - let count = 0; +function createDescriptionLengthStragegy({shardIndex, executors}) { + return function overrideSpecSuite(description/*, specDefinitions*/) { + return description.length % executors === shardIndex; + }; +} - return function overrideSpecSuite(origDescribe) { - return function(description, specDefinitions) { - // If we are a top-level describe but our description doesn't match our responsibility, skip it - if (depth === 0 && count++ % executors !== shardIndex) { - // console.log('[skipping]', description); - } else { - origDescribe(description, function() { - depth++; - specDefinitions(); - depth--; - }); - } - }; +function createRoundRobinStrategy({shardIndex, executors}) { + // Increment the count on each top level describe to determine + // round-robin responsibility + let count = 0; + return function(/*description, specDefinitions*/) { + return count++ % executors === shardIndex; }; }