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