"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",
#!/usr/bin/env python
import os
+import shutil
import subprocess
import sys
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']
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())
}
// Generate a code coverage report in out/coverage/lcov-report
-exports.generate = () => {
+exports.generateReport = () => {
const coverage = window.__coverage__
if (coverage == null) return
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)
- }
- })
-}