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