diff --git a/package.json b/package.json index d5bfb6dc7387..0593301deaed 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "scripts": { "bootstrap": "python ./script/bootstrap.py", "build": "python ./script/build.py -c D", + "coverage": "npm run instrument-code-coverage && npm run test -- --use-instrumented-asar", "instrument-code-coverage": "node ./spec/coverage/instrument.js", "lint": "npm run lint-js && npm run lint-cpp && npm run lint-docs", "lint-js": "standard && cd spec && standard", diff --git a/script/test.py b/script/test.py index 02377f481c5b..1d0e7295d5ec 100755 --- a/script/test.py +++ b/script/test.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +import shutil import subprocess import sys @@ -24,17 +25,30 @@ def main(): electron = os.path.join(SOURCE_ROOT, 'out', config, '{0}.app'.format(PRODUCT_NAME), 'Contents', 'MacOS', PRODUCT_NAME) + resources_path = os.path.join(SOURCE_ROOT, 'out', config, + '{0}.app'.format(PRODUCT_NAME), 'Contents', + 'Resources') elif sys.platform == 'win32': electron = os.path.join(SOURCE_ROOT, 'out', config, '{0}.exe'.format(PROJECT_NAME)) + resources_path = os.path.join(SOURCE_ROOT, 'out', config) else: electron = os.path.join(SOURCE_ROOT, 'out', config, PROJECT_NAME) + resources_path = os.path.join(SOURCE_ROOT, 'out', config) + use_instrumented_asar = '--use-instrumented-asar' in sys.argv returncode = 0 try: + if use_instrumented_asar: + install_instrumented_asar_file(resources_path) subprocess.check_call([electron, 'spec'] + sys.argv[1:]) except subprocess.CalledProcessError as e: returncode = e.returncode + except KeyboardInterrupt: + returncode = 0 + + if use_instrumented_asar: + restore_uninstrumented_asar_file(resources_path) if os.environ.has_key('OUTPUT_TO_FILE'): output_to_file = os.environ['OUTPUT_TO_FILE'] @@ -46,5 +60,23 @@ def main(): return returncode +def install_instrumented_asar_file(resources_path): + asar_path = os.path.join(resources_path, '{0}.asar'.format(PROJECT_NAME)) + uninstrumented_path = os.path.join(resources_path, + '{0}-original.asar'.format(PROJECT_NAME)) + instrumented_path = os.path.join(SOURCE_ROOT, 'out', 'coverage', + '{0}.asar'.format(PROJECT_NAME)) + shutil.move(asar_path, uninstrumented_path) + shutil.move(instrumented_path, asar_path) + + +def restore_uninstrumented_asar_file(resources_path): + asar_path = os.path.join(resources_path, '{0}.asar'.format(PROJECT_NAME)) + uninstrumented_path = os.path.join(resources_path, + '{0}-original.asar'.format(PROJECT_NAME)) + os.remove(asar_path) + shutil.move(uninstrumented_path, asar_path) + + if __name__ == '__main__': sys.exit(main()) diff --git a/spec/coverage/instrument.js b/spec/coverage/instrument.js index 1aee55a765bd..566b53acf7c8 100644 --- a/spec/coverage/instrument.js +++ b/spec/coverage/instrument.js @@ -22,7 +22,7 @@ glob.sync('**/*.js', {cwd: libPath}).forEach(function (relativePath) { fs.writeFileSync(generatedPath, generated) }) -var asarPath = path.join(outputPath, 'electron-instrumented.asar') +var asarPath = path.join(outputPath, 'electron.asar') asar.createPackageWithOptions(path.join(outputPath, 'lib'), asarPath, {}, function (error) { if (error) { console.error(error.stack || error) diff --git a/spec/static/coverage.js b/spec/coverage/reporter.js similarity index 66% rename from spec/static/coverage.js rename to spec/coverage/reporter.js index 151824f34800..ec45a89e5da0 100644 --- a/spec/static/coverage.js +++ b/spec/coverage/reporter.js @@ -33,7 +33,7 @@ const addUnrequiredFiles = (coverage) => { } // Generate a code coverage report in out/coverage/lcov-report -exports.generate = () => { +exports.generateReport = () => { const coverage = window.__coverage__ if (coverage == null) return @@ -49,27 +49,3 @@ exports.generate = () => { reporter.addAll(['text', 'lcov']) reporter.write(collector, true, function () {}) } - -// Generate an instrumented .asar file for all the files in lib/ and save it -// to out/coverage/electron-instrumented.asar -exports.instrument = () => { - const instrumenter = new Instrumenter() - - glob.sync('**/*.js', {cwd: libPath}).forEach(function (relativePath) { - const rawPath = path.join(libPath, relativePath) - const raw = fs.readFileSync(rawPath, 'utf8') - - const generatedPath = path.join(outputPath, 'lib', relativePath) - const generated = instrumenter.instrumentSync(raw, rawPath) - mkdirp.sync(path.dirname(generatedPath)) - fs.writeFileSync(generatedPath, generated) - }) - - const asarPath = path.join(outputPath, 'electron-instrumented.asar') - asar.createPackageWithOptions(path.join(outputPath, 'lib'), asarPath, {}, function (error) { - if (error) { - console.error(error.stack || error) - process.exit(1) - } - }) -} diff --git a/spec/static/index.html b/spec/static/index.html index faa8f5261726..6f77c794cb25 100644 --- a/spec/static/index.html +++ b/spec/static/index.html @@ -83,7 +83,7 @@ Mocha.utils.highlightTags('code'); if (isCi) ipcRenderer.send('process.exit', runner.failures); - require('./coverage').generate() + require('../coverage/reporter').generateReport() }); }); })();