Browse Source

Add ability to run tests with coverage report

Kevin Sawicki 8 years ago
parent
commit
491f69df80
5 changed files with 36 additions and 27 deletions
  1. 1 0
      package.json
  2. 32 0
      script/test.py
  3. 1 1
      spec/coverage/instrument.js
  4. 1 25
      spec/coverage/reporter.js
  5. 1 1
      spec/static/index.html

+ 1 - 0
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",

+ 32 - 0
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())

+ 1 - 1
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)

+ 1 - 25
spec/static/coverage.js → 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)
-    }
-  })
-}

+ 1 - 1
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()
     });
   });
 })();