Add ability to run tests with coverage report
authorKevin Sawicki <kevinsawicki@gmail.com>
Tue, 2 Aug 2016 18:53:13 +0000 (11:53 -0700)
committerKevin Sawicki <kevinsawicki@gmail.com>
Wed, 3 Aug 2016 23:23:38 +0000 (16:23 -0700)
package.json
script/test.py
spec/coverage/instrument.js
spec/coverage/reporter.js [moved from spec/static/coverage.js with 66% similarity]
spec/static/index.html

index d5bfb6d..0593301 100644 (file)
@@ -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",
index 02377f4..1d0e729 100755 (executable)
@@ -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())
index 1aee55a..566b53a 100644 (file)
@@ -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)
similarity index 66%
rename from spec/static/coverage.js
rename to spec/coverage/reporter.js
index 151824f..ec45a89 100644 (file)
@@ -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)
-    }
-  })
-}
index faa8f52..6f77c79 100644 (file)
@@ -83,7 +83,7 @@
       Mocha.utils.highlightTags('code');
       if (isCi)
         ipcRenderer.send('process.exit', runner.failures);
-      require('./coverage').generate()
+      require('../coverage/reporter').generateReport()
     });
   });
 })();