166a7a246SJörg Krause#!/usr/bin/env python2 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')) 2280d2ae5eSEmmanuel Vadotsys.path.append(os.path.join(our_path, '../')) 23bf7fd50bSSimon Glass 24*b4360206SSimon Glass# Bring in the libfdt module 25*b4360206SSimon Glasssys.path.append('tools') 26*b4360206SSimon Glass 27bf7fd50bSSimon Glass# Also allow entry-type modules to be brought in from the etype directory. 28bf7fd50bSSimon Glasssys.path.append(os.path.join(our_path, 'etype')) 29bf7fd50bSSimon Glass 30bf7fd50bSSimon Glassimport cmdline 31bf7fd50bSSimon Glassimport command 32bf7fd50bSSimon Glassimport control 33bf7fd50bSSimon Glass 34bf7fd50bSSimon Glassdef RunTests(): 35bf7fd50bSSimon Glass """Run the functional tests and any embedded doctests""" 36bf7fd50bSSimon Glass import entry_test 37bf7fd50bSSimon Glass import fdt_test 38bf7fd50bSSimon Glass import func_test 39bf7fd50bSSimon Glass import test 40bf7fd50bSSimon Glass import doctest 41bf7fd50bSSimon Glass 42bf7fd50bSSimon Glass result = unittest.TestResult() 43bf7fd50bSSimon Glass for module in []: 44bf7fd50bSSimon Glass suite = doctest.DocTestSuite(module) 45bf7fd50bSSimon Glass suite.run(result) 46bf7fd50bSSimon Glass 47bf7fd50bSSimon Glass sys.argv = [sys.argv[0]] 48bf7fd50bSSimon Glass for module in (func_test.TestFunctional, fdt_test.TestFdt, 49bf7fd50bSSimon Glass entry_test.TestEntry): 50bf7fd50bSSimon Glass suite = unittest.TestLoader().loadTestsFromTestCase(module) 51bf7fd50bSSimon Glass suite.run(result) 52bf7fd50bSSimon Glass 53bf7fd50bSSimon Glass print result 54bf7fd50bSSimon Glass for test, err in result.errors: 55bf7fd50bSSimon Glass print test.id(), err 56bf7fd50bSSimon Glass for test, err in result.failures: 57bf7fd50bSSimon Glass print err 58bf7fd50bSSimon Glass 59bf7fd50bSSimon Glassdef RunTestCoverage(): 60bf7fd50bSSimon Glass """Run the tests and check that we get 100% coverage""" 61bf7fd50bSSimon Glass # This uses the build output from sandbox_spl to get _libfdt.so 62bf7fd50bSSimon Glass cmd = ('PYTHONPATH=%s/sandbox_spl/tools coverage run ' 63bf7fd50bSSimon Glass '--include "tools/binman/*.py" --omit "*test*,*binman.py" ' 64bf7fd50bSSimon Glass 'tools/binman/binman.py -t' % options.build_dir) 65bf7fd50bSSimon Glass os.system(cmd) 66bf7fd50bSSimon Glass stdout = command.Output('coverage', 'report') 67bf7fd50bSSimon Glass coverage = stdout.splitlines()[-1].split(' ')[-1] 68bf7fd50bSSimon Glass if coverage != '100%': 69bf7fd50bSSimon Glass print stdout 70bf7fd50bSSimon Glass print "Type 'coverage html' to get a report in htmlcov/index.html" 71bf7fd50bSSimon Glass raise ValueError('Coverage error: %s, but should be 100%%' % coverage) 72bf7fd50bSSimon Glass 73bf7fd50bSSimon Glass 74bf7fd50bSSimon Glassdef RunBinman(options, args): 75bf7fd50bSSimon Glass """Main entry point to binman once arguments are parsed 76bf7fd50bSSimon Glass 77bf7fd50bSSimon Glass Args: 78bf7fd50bSSimon Glass options: Command-line options 79bf7fd50bSSimon Glass args: Non-option arguments 80bf7fd50bSSimon Glass """ 81bf7fd50bSSimon Glass ret_code = 0 82bf7fd50bSSimon Glass 83bf7fd50bSSimon Glass # For testing: This enables full exception traces. 84bf7fd50bSSimon Glass #options.debug = True 85bf7fd50bSSimon Glass 86bf7fd50bSSimon Glass if not options.debug: 87bf7fd50bSSimon Glass sys.tracebacklimit = 0 88bf7fd50bSSimon Glass 89bf7fd50bSSimon Glass if options.test: 90bf7fd50bSSimon Glass RunTests() 91bf7fd50bSSimon Glass 92bf7fd50bSSimon Glass elif options.test_coverage: 93bf7fd50bSSimon Glass RunTestCoverage() 94bf7fd50bSSimon Glass 95bf7fd50bSSimon Glass elif options.full_help: 96bf7fd50bSSimon Glass pager = os.getenv('PAGER') 97bf7fd50bSSimon Glass if not pager: 98bf7fd50bSSimon Glass pager = 'more' 99bf7fd50bSSimon Glass fname = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 100bf7fd50bSSimon Glass 'README') 101bf7fd50bSSimon Glass command.Run(pager, fname) 102bf7fd50bSSimon Glass 103bf7fd50bSSimon Glass else: 104bf7fd50bSSimon Glass try: 105bf7fd50bSSimon Glass ret_code = control.Binman(options, args) 106bf7fd50bSSimon Glass except Exception as e: 107bf7fd50bSSimon Glass print 'binman: %s' % e 108bf7fd50bSSimon Glass if options.debug: 109bf7fd50bSSimon Glass print 110bf7fd50bSSimon Glass traceback.print_exc() 111bf7fd50bSSimon Glass ret_code = 1 112bf7fd50bSSimon Glass return ret_code 113bf7fd50bSSimon Glass 114bf7fd50bSSimon Glass 115bf7fd50bSSimon Glassif __name__ == "__main__": 116bf7fd50bSSimon Glass (options, args) = cmdline.ParseArgs(sys.argv) 117bf7fd50bSSimon Glass ret_code = RunBinman(options, args) 118bf7fd50bSSimon Glass sys.exit(ret_code) 119