#!/usr/bin/env python # 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/. """ run mozbase tests from a manifest, by default https://github.com/mozilla/mozbase/blob/master/test-manifest.ini """ import imp import manifestparser import mozinfo import optparse import os import sys import unittest import mozlog from moztest.results import TestResultCollection from moztest.adapters.unit import StructuredTestRunner here = os.path.dirname(os.path.abspath(__file__)) def unittests(path): """return the unittests in a .py file""" path = os.path.abspath(path) unittests = [] assert os.path.exists(path) directory = os.path.dirname(path) sys.path.insert(0, directory) # insert directory into path for top-level imports modname = os.path.splitext(os.path.basename(path))[0] module = imp.load_source(modname, path) sys.path.pop(0) # remove directory from global path loader = unittest.TestLoader() suite = loader.loadTestsFromModule(module) for test in suite: unittests.append(test) return unittests def main(args=sys.argv[1:]): # parse command line options usage = '%prog [options] manifest.ini <...>' parser = optparse.OptionParser(usage=usage, description=__doc__) parser.add_option('-b', "--binary", dest="binary", help="Binary path", metavar=None, default=None) parser.add_option('--list', dest='list_tests', action='store_true', default=False, help="list paths of tests to be run") mozlog.commandline.add_logging_group(parser) options, args = parser.parse_args(args) logger = mozlog.commandline.setup_logging("mozbase", options, {"tbpl": sys.stdout}) # read the manifest if args: manifests = args else: manifests = [os.path.join(here, 'test-manifest.ini')] missing = [] for manifest in manifests: # ensure manifests exist if not os.path.exists(manifest): missing.append(manifest) assert not missing, 'manifest(s) not found: %s' % ', '.join(missing) manifest = manifestparser.TestManifest(manifests=manifests) if options.binary: # A specified binary should override the environment variable os.environ['BROWSER_PATH'] = options.binary # gather the tests tests = manifest.active_tests(disabled=False, **mozinfo.info) tests = [test['path'] for test in tests] logger.suite_start(tests) if options.list_tests: # print test paths print '\n'.join(tests) sys.exit(0) # create unittests unittestlist = [] for test in tests: unittestlist.extend(unittests(test)) # run the tests suite = unittest.TestSuite(unittestlist) runner = StructuredTestRunner(logger=logger) unittest_results = runner.run(suite) results = TestResultCollection.from_unittest_results(None, unittest_results) logger.suite_end() # exit according to results sys.exit(1 if results.num_failures else 0) if __name__ == '__main__': main()