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