Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"diff": "~1.0.4",
"graceful-fs": "^2.0.3",
"harmonize": "~1.33.7",
"istanbul": "^0.3.2",
"jasmine-only": "0.1.0",
"jasmine-pit": "~2.0.0",
"jsdom": "~0.10.3",
Expand Down
6 changes: 4 additions & 2 deletions src/HasteModuleLoader/HasteModuleLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
* Relatedly: It's time we vastly simplify node-haste.
*/

var CoverageCollector = require('../CoverageCollector');
var fs = require('graceful-fs');
var hasteLoaders = require('node-haste/lib/loaders');
var moduleMocker = require('../lib/moduleMocker');
Expand Down Expand Up @@ -113,6 +112,7 @@ function _getCacheFilePath(config) {

function Loader(config, environment, resourceMap) {
this._config = config;
this._CoverageCollector = require(config.coverageCollector);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, the error was only because requiring undefined. And why it worked when moving it bellow because the test didn't go into shouldCollectCoverage block. But I feel it makes some sense, if you don't need to collect coverage then you don't need require collector.

this._coverageCollectors = {};
this._currentlyExecutingModulePath = '';
this._environment = environment;
Expand Down Expand Up @@ -228,7 +228,7 @@ Loader.prototype._execModule = function(moduleObj) {
if (shouldCollectCoverage) {
if (!this._coverageCollectors.hasOwnProperty(modulePath)) {
this._coverageCollectors[modulePath] =
new CoverageCollector(moduleContent);
new this._CoverageCollector(moduleContent, modulePath);
}
var collector = this._coverageCollectors[modulePath];
moduleLocalBindings[COVERAGE_STORAGE_VAR_NAME] =
Expand Down Expand Up @@ -554,6 +554,8 @@ Loader.prototype._shouldMock = function(currPath, moduleName) {
return false;
} else if (this._explicitShouldMock.hasOwnProperty(moduleID)) {
return this._explicitShouldMock[moduleID];
} else if (NODE_CORE_MODULES[moduleName]) {
return false;
} else if (this._shouldAutoMock) {

// See if the module is specified in the config as a module that should
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ describe('nodeHasteModuleLoader', function() {
var HasteModuleLoader;
var mockEnvironment;
var resources;
var mockConfig = {
coverageCollector: '../IstanbulCollector'
};

var mockResourceMap = {
getResource: function(type, name) {
Expand Down Expand Up @@ -59,7 +62,8 @@ describe('nodeHasteModuleLoader', function() {
resources.ModuleA = _generateResource('ModuleA', ['ModuleB']);
resources.ModuleB = _generateResource('ModuleB');

var loader = new HasteModuleLoader({}, mockEnvironment, mockResourceMap);
var loader = new HasteModuleLoader(mockConfig,
mockEnvironment, mockResourceMap);
var mockModules = loader.requireModule(__filename, 'mock-modules');
expect(mockModules.hasDependency('ModuleA', 'ModuleB')).toBe(true);
expect(mockModules.hasDependency('ModuleB', 'ModuleA')).toBe(false);
Expand All @@ -69,7 +73,8 @@ describe('nodeHasteModuleLoader', function() {
resources.ModuleA = _generateResource('ModuleA', ['ModuleB']);
resources.ModuleB = _generateResource('ModuleB', ['ModuleA']);

var loader = new HasteModuleLoader({}, mockEnvironment, mockResourceMap);
var loader = new HasteModuleLoader(mockConfig,
mockEnvironment, mockResourceMap);
var mockModules = loader.requireModule(__filename, 'mock-modules');
expect(mockModules.hasDependency('ModuleA', 'ModuleB')).toBe(true);
expect(mockModules.hasDependency('ModuleB', 'ModuleA')).toBe(true);
Expand All @@ -80,7 +85,8 @@ describe('nodeHasteModuleLoader', function() {
resources.ModuleB = _generateResource('ModuleB', ['ModuleC']);
resources.ModuleC = _generateResource('ModuleC');

var loader = new HasteModuleLoader({}, mockEnvironment, mockResourceMap);
var loader = new HasteModuleLoader(mockConfig,
mockEnvironment, mockResourceMap);
var mockModules = loader.requireModule(__filename, 'mock-modules');
expect(mockModules.hasDependency('ModuleA', 'ModuleC')).toBe(true);
});
Expand All @@ -90,7 +96,8 @@ describe('nodeHasteModuleLoader', function() {
resources.ModuleB = _generateResource('ModuleB', ['ModuleC']);
resources.ModuleC = _generateResource('ModuleC', ['ModuleA']);

var loader = new HasteModuleLoader({}, mockEnvironment, mockResourceMap);
var loader = new HasteModuleLoader(mockConfig,
mockEnvironment, mockResourceMap);
var mockModules = loader.requireModule(__filename, 'mock-modules');
expect(mockModules.hasDependency('ModuleA', 'ModuleC')).toBe(true);
expect(mockModules.hasDependency('ModuleC', 'ModuleA')).toBe(true);
Expand Down
33 changes: 33 additions & 0 deletions src/IstanbulCollector.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';

var istanbul = require('istanbul');

function IstanbulCollector(sourceText, filename) {
var instr = new istanbul.Instrumenter();
this._coverageDataStore = {};
this._instrumentor = instr;
this._origSourceText = sourceText;
this._instrumentedSourceText = instr.instrumentSync(sourceText, filename);
}

IstanbulCollector.prototype.getCoverageDataStore = function() {
return this._coverageDataStore;
};

IstanbulCollector.prototype.getInstrumentedSource = function(storageVarName) {
return this._instrumentedSourceText + storageVarName + '.coverState=' +
this._instrumentor.currentState.trackerVar + ';';
};

IstanbulCollector.prototype.extractRuntimeCoverageInfo = function() {
return this._coverageDataStore.coverState;
};

module.exports = IstanbulCollector;
39 changes: 39 additions & 0 deletions src/IstanbulTestReporter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';

var DefaultTestReporter = require('./DefaultTestReporter');
var istanbul = require('istanbul');
var collector = new istanbul.Collector();
var reporter = new istanbul.Reporter();

function IstanbulTestReporter(customProcess) {
this.process = customProcess || process;
}

IstanbulTestReporter.prototype = new DefaultTestReporter();

IstanbulTestReporter.prototype.onTestResult =
function(config, testResult, aggregatedResults) {
DefaultTestReporter.prototype.onTestResult.call(
this, config, testResult, aggregatedResults
);

if (config.collectCoverage && testResult.coverage) {
collector.add(testResult.coverage);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to crash if the tests failed. This can be fixed by changing the if statement to:
if (config.collectCoverage && testResult.coverage) {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, updated. I also considered about the idea coverageFolder, but I don't know how to config it in Istanbul right now. So currently in my CI, we move the folder after the coverage being generated. If you find a way, please point to me.

}
};

IstanbulTestReporter.prototype.onRunComplete =
function (config, aggregatedResults) {
DefaultTestReporter.prototype.onRunComplete.call(
this, config, aggregatedResults
);

if (config.collectCoverage) {
reporter.addAll([ 'json', 'text', 'lcov', 'clover' ]);
reporter.write(collector, true, function () {
console.log('All reports generated');
});
}
};

module.exports = IstanbulTestReporter;
6 changes: 3 additions & 3 deletions src/TestRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -401,11 +401,11 @@ TestRunner.prototype.runTest = function(testFilePath) {
* testResults: the jest result info for all tests run
*/
TestRunner.prototype.runTests = function(testPaths, reporter) {
var config = this._config;
if (!reporter) {
var DefaultTestReporter = require('./DefaultTestReporter');
reporter = new DefaultTestReporter();
var TestReporter = require(config.testReporter);
reporter = new TestReporter();
}
var config = this._config;

var aggregatedResults = {
success: null,
Expand Down
6 changes: 5 additions & 1 deletion src/lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ var DEFAULT_CONFIG_VALUES = {
globals: {},
moduleLoader: require.resolve('../HasteModuleLoader/HasteModuleLoader'),
modulePathIgnorePatterns: [],
coverageCollector: require.resolve('../IstanbulCollector'),
testDirectoryName: '__tests__',
testEnvironment: require.resolve('../JSDomEnvironment'),
testFileExtensions: ['js'],
testReporter: require.resolve('../IstanbulTestReporter'),
moduleFileExtensions: ['js', 'json'],
testPathDirs: ['<rootDir>'],
testPathIgnorePatterns: ['/node_modules/'],
testRunner: require.resolve('../jasmineTestRunner/jasmineTestRunner'),
testRunner: require.resolve('../jasmineTestRunner/jasmineTestRunner')
};

function _replaceRootDirTags(rootDir, config) {
Expand Down Expand Up @@ -205,6 +207,7 @@ function normalizeConfig(config) {
break;

case 'collectCoverage':
case 'coverageCollector':
case 'globals':
case 'moduleLoader':
case 'name':
Expand All @@ -215,6 +218,7 @@ function normalizeConfig(config) {
case 'setupJSMockLoaderOptions':
case 'testDirectoryName':
case 'testFileExtensions':
case 'testReporter':
case 'moduleFileExtensions':
value = config[key];
break;
Expand Down