1#!/usr/bin/env python2 2# SPDX-License-Identifier: GPL-2.0+ 3 4# Copyright (c) 2016 Google, Inc 5# Written by Simon Glass <sjg@chromium.org> 6# 7# Creates binary images from input files controlled by a description 8# 9 10"""See README for more information""" 11 12import glob 13import os 14import sys 15import traceback 16import unittest 17 18# Bring in the patman and dtoc libraries 19our_path = os.path.dirname(os.path.realpath(__file__)) 20for dirname in ['../patman', '../dtoc', '..']: 21 sys.path.insert(0, os.path.join(our_path, dirname)) 22 23# Bring in the libfdt module 24sys.path.insert(0, 'scripts/dtc/pylibfdt') 25 26import cmdline 27import command 28import control 29import test_util 30 31def RunTests(debug, args): 32 """Run the functional tests and any embedded doctests 33 34 Args: 35 debug: True to enable debugging, which shows a full stack trace on error 36 args: List of positional args provided to binman. This can hold a test 37 name to execute (as in 'binman -t testSections', for example) 38 """ 39 import elf_test 40 import entry_test 41 import fdt_test 42 import ftest 43 import image_test 44 import test 45 import doctest 46 47 result = unittest.TestResult() 48 for module in []: 49 suite = doctest.DocTestSuite(module) 50 suite.run(result) 51 52 sys.argv = [sys.argv[0]] 53 if debug: 54 sys.argv.append('-D') 55 56 # Run the entry tests first ,since these need to be the first to import the 57 # 'entry' module. 58 test_name = args and args[0] or None 59 for module in (entry_test.TestEntry, ftest.TestFunctional, fdt_test.TestFdt, 60 elf_test.TestElf, image_test.TestImage): 61 if test_name: 62 try: 63 suite = unittest.TestLoader().loadTestsFromName(test_name, module) 64 except AttributeError: 65 continue 66 else: 67 suite = unittest.TestLoader().loadTestsFromTestCase(module) 68 suite.run(result) 69 70 print result 71 for test, err in result.errors: 72 print test.id(), err 73 for test, err in result.failures: 74 print err, result.failures 75 if result.errors or result.failures: 76 print 'binman tests FAILED' 77 return 1 78 return 0 79 80def RunTestCoverage(): 81 """Run the tests and check that we get 100% coverage""" 82 glob_list = glob.glob(os.path.join(our_path, 'etype/*.py')) 83 all_set = set([os.path.splitext(os.path.basename(item))[0] 84 for item in glob_list if '_testing' not in item]) 85 test_util.RunTestCoverage('tools/binman/binman.py', None, 86 ['*test*', '*binman.py', 'tools/patman/*', 'tools/dtoc/*'], 87 options.build_dir, all_set) 88 89def RunBinman(options, args): 90 """Main entry point to binman once arguments are parsed 91 92 Args: 93 options: Command-line options 94 args: Non-option arguments 95 """ 96 ret_code = 0 97 98 # For testing: This enables full exception traces. 99 #options.debug = True 100 101 if not options.debug: 102 sys.tracebacklimit = 0 103 104 if options.test: 105 ret_code = RunTests(options.debug, args[1:]) 106 107 elif options.test_coverage: 108 RunTestCoverage() 109 110 elif options.full_help: 111 pager = os.getenv('PAGER') 112 if not pager: 113 pager = 'more' 114 fname = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 115 'README') 116 command.Run(pager, fname) 117 118 else: 119 try: 120 ret_code = control.Binman(options, args) 121 except Exception as e: 122 print 'binman: %s' % e 123 if options.debug: 124 print 125 traceback.print_exc() 126 ret_code = 1 127 return ret_code 128 129 130if __name__ == "__main__": 131 (options, args) = cmdline.ParseArgs(sys.argv) 132 ret_code = RunBinman(options, args) 133 sys.exit(ret_code) 134