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