#!/usr/bin/env python # ***** BEGIN LICENSE BLOCK ***** # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. # ***** END LICENSE BLOCK ***** import os import sys import glob import subprocess import json # load modules from parent dir sys.path.insert(1, os.path.dirname(sys.path[0])) from mozharness.mozilla.testing.gaia_test import GaiaTest from mozharness.mozilla.testing.unittest import TestSummaryOutputParserHelper class GaiaUnitTest(GaiaTest): def __init__(self, require_config_file=False): GaiaTest.__init__(self, require_config_file) def pull(self, **kwargs): GaiaTest.pull(self, **kwargs) def run_tests(self): """ Run the unit test suite. """ dirs = self.query_abs_dirs() self.make_node_modules() # make the gaia profile self.make_gaia(dirs['abs_gaia_dir'], self.config.get('xre_path'), xre_url=self.config.get('xre_url'), debug=True) # build the testrunner command arguments python = self.query_python_path('python') cmd = [python, '-u', os.path.join(dirs['abs_runner_dir'], 'gaia_unit_test', 'main.py')] executable = 'firefox' if 'b2g' in self.binary_path: executable = 'b2g-bin' profile = os.path.join(dirs['abs_gaia_dir'], 'profile-debug') binary = os.path.join(os.path.dirname(self.binary_path), executable) cmd.extend(self._build_arg('--binary', binary)) cmd.extend(self._build_arg('--profile', profile)) cmd.extend(self._build_arg('--symbols-path', self.symbols_path)) cmd.extend(self._build_arg('--browser-arg', self.config.get('browser_arg'))) # Add support for chunking if self.config.get('total_chunks') and self.config.get('this_chunk'): chunker = [ os.path.join(dirs['abs_gaia_dir'], 'bin', 'chunk'), self.config.get('total_chunks'), self.config.get('this_chunk') ] disabled_tests = [] disabled_manifest = os.path.join(dirs['abs_runner_dir'], 'gaia_unit_test', 'disabled.json') with open(disabled_manifest, 'r') as m: try: disabled_tests = json.loads(m.read()) except: print "Error while decoding disabled.json; please make sure this file has valid JSON syntax." sys.exit(1) # Construct a list of all tests unit_tests = [] for path in ('apps', 'tv_apps'): test_root = os.path.join(dirs['abs_gaia_dir'], path) full_paths = glob.glob(os.path.join(test_root, '*/test/unit/*_test.js')) unit_tests += map(lambda x: os.path.relpath(x, test_root), full_paths) # Remove the tests that are disabled active_unit_tests = filter(lambda x: x not in disabled_tests, unit_tests) # Chunk the list as requested tests_to_run = subprocess.check_output(chunker + active_unit_tests).strip().split(' ') cmd.extend(tests_to_run) output_parser = TestSummaryOutputParserHelper(config=self.config, log_obj=self.log_obj, error_list=self.error_list) upload_dir = self.query_abs_dirs()['abs_blob_upload_dir'] if not os.path.isdir(upload_dir): self.mkdir_p(upload_dir) env = self.query_env() env['MOZ_UPLOAD_DIR'] = upload_dir # I don't like this output_timeout hardcode, but bug 920153 code = self.run_command(cmd, env=env, output_parser=output_parser, output_timeout=1760) output_parser.print_summary('gaia-unit-tests') self.publish(code) if __name__ == '__main__': gaia_unit_test = GaiaUnitTest() gaia_unit_test.run_and_exit()