test.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/env python
  2. import argparse
  3. import os
  4. import shutil
  5. import subprocess
  6. import sys
  7. from lib.config import enable_verbose_mode
  8. from lib.util import electron_gyp, execute_stdout, rm_rf
  9. SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
  10. PROJECT_NAME = electron_gyp()['project_name%']
  11. PRODUCT_NAME = electron_gyp()['product_name%']
  12. def main():
  13. os.chdir(SOURCE_ROOT)
  14. args = parse_args()
  15. config = args.configuration
  16. if args.verbose:
  17. enable_verbose_mode()
  18. spec_modules = os.path.join(SOURCE_ROOT, 'spec', 'node_modules')
  19. if args.rebuild_native_modules or not os.path.isdir(spec_modules):
  20. rebuild_native_modules(args.verbose, config)
  21. if sys.platform == 'darwin':
  22. electron = os.path.join(SOURCE_ROOT, 'out', config,
  23. '{0}.app'.format(PRODUCT_NAME), 'Contents',
  24. 'MacOS', PRODUCT_NAME)
  25. resources_path = os.path.join(SOURCE_ROOT, 'out', config,
  26. '{0}.app'.format(PRODUCT_NAME), 'Contents',
  27. 'Resources')
  28. elif sys.platform == 'win32':
  29. electron = os.path.join(SOURCE_ROOT, 'out', config,
  30. '{0}.exe'.format(PROJECT_NAME))
  31. resources_path = os.path.join(SOURCE_ROOT, 'out', config)
  32. else:
  33. electron = os.path.join(SOURCE_ROOT, 'out', config, PROJECT_NAME)
  34. resources_path = os.path.join(SOURCE_ROOT, 'out', config)
  35. returncode = 0
  36. try:
  37. if args.use_instrumented_asar:
  38. install_instrumented_asar_file(resources_path)
  39. subprocess.check_call([electron, 'spec'] + sys.argv[1:])
  40. except subprocess.CalledProcessError as e:
  41. returncode = e.returncode
  42. except KeyboardInterrupt:
  43. returncode = 0
  44. if args.use_instrumented_asar:
  45. restore_uninstrumented_asar_file(resources_path)
  46. if os.environ.has_key('OUTPUT_TO_FILE'):
  47. output_to_file = os.environ['OUTPUT_TO_FILE']
  48. with open(output_to_file, 'r') as f:
  49. print f.read()
  50. rm_rf(output_to_file)
  51. return returncode
  52. def parse_args():
  53. parser = argparse.ArgumentParser(description='Run Electron tests')
  54. parser.add_argument('--use_instrumented_asar',
  55. help='Run tests with coverage instructed asar file',
  56. action='store_true',
  57. required=False)
  58. parser.add_argument('--rebuild_native_modules',
  59. help='Rebuild native modules used by specs',
  60. action='store_true',
  61. required=False)
  62. parser.add_argument('--ci',
  63. help='Run tests in CI mode',
  64. action='store_true',
  65. required=False)
  66. parser.add_argument('-g', '--grep',
  67. help='Only run tests matching <pattern>',
  68. metavar='pattern',
  69. required=False)
  70. parser.add_argument('-i', '--invert',
  71. help='Inverts --grep matches',
  72. action='store_true',
  73. required=False)
  74. parser.add_argument('-v', '--verbose',
  75. action='store_true',
  76. help='Prints the output of the subprocesses')
  77. parser.add_argument('-c', '--configuration',
  78. help='Build configuration to run tests against',
  79. default='D',
  80. required=False)
  81. return parser.parse_args()
  82. def install_instrumented_asar_file(resources_path):
  83. asar_path = os.path.join(resources_path, '{0}.asar'.format(PROJECT_NAME))
  84. uninstrumented_path = os.path.join(resources_path,
  85. '{0}-original.asar'.format(PROJECT_NAME))
  86. instrumented_path = os.path.join(SOURCE_ROOT, 'out', 'coverage',
  87. '{0}.asar'.format(PROJECT_NAME))
  88. shutil.move(asar_path, uninstrumented_path)
  89. shutil.move(instrumented_path, asar_path)
  90. def restore_uninstrumented_asar_file(resources_path):
  91. asar_path = os.path.join(resources_path, '{0}.asar'.format(PROJECT_NAME))
  92. uninstrumented_path = os.path.join(resources_path,
  93. '{0}-original.asar'.format(PROJECT_NAME))
  94. os.remove(asar_path)
  95. shutil.move(uninstrumented_path, asar_path)
  96. def rebuild_native_modules(verbose, configuration):
  97. script_path = os.path.join(SOURCE_ROOT, 'script', 'rebuild-test-modules.py')
  98. args = ['--configuration', configuration]
  99. if verbose:
  100. args += ['--verbose']
  101. execute_stdout([sys.executable, script_path] + args)
  102. if __name__ == '__main__':
  103. sys.exit(main())