1*6d799d04SEmmanuel Vadot#!/usr/bin/env python 2bf7fd50bSSimon Glass 3bf7fd50bSSimon Glass# Copyright (c) 2016 Google, Inc 4bf7fd50bSSimon Glass# Written by Simon Glass <sjg@chromium.org> 5bf7fd50bSSimon Glass# 6bf7fd50bSSimon Glass# SPDX-License-Identifier: GPL-2.0+ 7bf7fd50bSSimon Glass# 8bf7fd50bSSimon Glass# Creates binary images from input files controlled by a description 9bf7fd50bSSimon Glass# 10bf7fd50bSSimon Glass 11bf7fd50bSSimon Glass"""See README for more information""" 12bf7fd50bSSimon Glass 13bf7fd50bSSimon Glassimport os 14bf7fd50bSSimon Glassimport sys 15bf7fd50bSSimon Glassimport traceback 16bf7fd50bSSimon Glassimport unittest 17bf7fd50bSSimon Glass 18bf7fd50bSSimon Glass# Bring in the patman and dtoc libraries 19bf7fd50bSSimon Glassour_path = os.path.dirname(os.path.realpath(__file__)) 20bf7fd50bSSimon Glasssys.path.append(os.path.join(our_path, '../patman')) 21bf7fd50bSSimon Glasssys.path.append(os.path.join(our_path, '../dtoc')) 22bf7fd50bSSimon Glass 23bf7fd50bSSimon Glass# Also allow entry-type modules to be brought in from the etype directory. 24bf7fd50bSSimon Glasssys.path.append(os.path.join(our_path, 'etype')) 25bf7fd50bSSimon Glass 26bf7fd50bSSimon Glassimport cmdline 27bf7fd50bSSimon Glassimport command 28bf7fd50bSSimon Glassimport control 29bf7fd50bSSimon Glass 30bf7fd50bSSimon Glassdef RunTests(): 31bf7fd50bSSimon Glass """Run the functional tests and any embedded doctests""" 32bf7fd50bSSimon Glass import entry_test 33bf7fd50bSSimon Glass import fdt_test 34bf7fd50bSSimon Glass import func_test 35bf7fd50bSSimon Glass import test 36bf7fd50bSSimon Glass import doctest 37bf7fd50bSSimon Glass 38bf7fd50bSSimon Glass result = unittest.TestResult() 39bf7fd50bSSimon Glass for module in []: 40bf7fd50bSSimon Glass suite = doctest.DocTestSuite(module) 41bf7fd50bSSimon Glass suite.run(result) 42bf7fd50bSSimon Glass 43bf7fd50bSSimon Glass sys.argv = [sys.argv[0]] 44bf7fd50bSSimon Glass for module in (func_test.TestFunctional, fdt_test.TestFdt, 45bf7fd50bSSimon Glass entry_test.TestEntry): 46bf7fd50bSSimon Glass suite = unittest.TestLoader().loadTestsFromTestCase(module) 47bf7fd50bSSimon Glass suite.run(result) 48bf7fd50bSSimon Glass 49bf7fd50bSSimon Glass print result 50bf7fd50bSSimon Glass for test, err in result.errors: 51bf7fd50bSSimon Glass print test.id(), err 52bf7fd50bSSimon Glass for test, err in result.failures: 53bf7fd50bSSimon Glass print err 54bf7fd50bSSimon Glass 55bf7fd50bSSimon Glassdef RunTestCoverage(): 56bf7fd50bSSimon Glass """Run the tests and check that we get 100% coverage""" 57bf7fd50bSSimon Glass # This uses the build output from sandbox_spl to get _libfdt.so 58bf7fd50bSSimon Glass cmd = ('PYTHONPATH=%s/sandbox_spl/tools coverage run ' 59bf7fd50bSSimon Glass '--include "tools/binman/*.py" --omit "*test*,*binman.py" ' 60bf7fd50bSSimon Glass 'tools/binman/binman.py -t' % options.build_dir) 61bf7fd50bSSimon Glass os.system(cmd) 62bf7fd50bSSimon Glass stdout = command.Output('coverage', 'report') 63bf7fd50bSSimon Glass coverage = stdout.splitlines()[-1].split(' ')[-1] 64bf7fd50bSSimon Glass if coverage != '100%': 65bf7fd50bSSimon Glass print stdout 66bf7fd50bSSimon Glass print "Type 'coverage html' to get a report in htmlcov/index.html" 67bf7fd50bSSimon Glass raise ValueError('Coverage error: %s, but should be 100%%' % coverage) 68bf7fd50bSSimon Glass 69bf7fd50bSSimon Glass 70bf7fd50bSSimon Glassdef RunBinman(options, args): 71bf7fd50bSSimon Glass """Main entry point to binman once arguments are parsed 72bf7fd50bSSimon Glass 73bf7fd50bSSimon Glass Args: 74bf7fd50bSSimon Glass options: Command-line options 75bf7fd50bSSimon Glass args: Non-option arguments 76bf7fd50bSSimon Glass """ 77bf7fd50bSSimon Glass ret_code = 0 78bf7fd50bSSimon Glass 79bf7fd50bSSimon Glass # For testing: This enables full exception traces. 80bf7fd50bSSimon Glass #options.debug = True 81bf7fd50bSSimon Glass 82bf7fd50bSSimon Glass if not options.debug: 83bf7fd50bSSimon Glass sys.tracebacklimit = 0 84bf7fd50bSSimon Glass 85bf7fd50bSSimon Glass if options.test: 86bf7fd50bSSimon Glass RunTests() 87bf7fd50bSSimon Glass 88bf7fd50bSSimon Glass elif options.test_coverage: 89bf7fd50bSSimon Glass RunTestCoverage() 90bf7fd50bSSimon Glass 91bf7fd50bSSimon Glass elif options.full_help: 92bf7fd50bSSimon Glass pager = os.getenv('PAGER') 93bf7fd50bSSimon Glass if not pager: 94bf7fd50bSSimon Glass pager = 'more' 95bf7fd50bSSimon Glass fname = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 96bf7fd50bSSimon Glass 'README') 97bf7fd50bSSimon Glass command.Run(pager, fname) 98bf7fd50bSSimon Glass 99bf7fd50bSSimon Glass else: 100bf7fd50bSSimon Glass try: 101bf7fd50bSSimon Glass ret_code = control.Binman(options, args) 102bf7fd50bSSimon Glass except Exception as e: 103bf7fd50bSSimon Glass print 'binman: %s' % e 104bf7fd50bSSimon Glass if options.debug: 105bf7fd50bSSimon Glass print 106bf7fd50bSSimon Glass traceback.print_exc() 107bf7fd50bSSimon Glass ret_code = 1 108bf7fd50bSSimon Glass return ret_code 109bf7fd50bSSimon Glass 110bf7fd50bSSimon Glass 111bf7fd50bSSimon Glassif __name__ == "__main__": 112bf7fd50bSSimon Glass (options, args) = cmdline.ParseArgs(sys.argv) 113bf7fd50bSSimon Glass ret_code = RunBinman(options, args) 114bf7fd50bSSimon Glass sys.exit(ret_code) 115