diff options
Diffstat (limited to 'binary_search_tool/run_bisect_tests.py')
-rwxr-xr-x | binary_search_tool/run_bisect_tests.py | 279 |
1 files changed, 150 insertions, 129 deletions
diff --git a/binary_search_tool/run_bisect_tests.py b/binary_search_tool/run_bisect_tests.py index 9172d678..ca7077d3 100755 --- a/binary_search_tool/run_bisect_tests.py +++ b/binary_search_tool/run_bisect_tests.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright 2020 The Chromium OS Authors. All rights reserved. +# Copyright 2020 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Run full bisection test.""" -from __future__ import print_function import argparse import os @@ -14,81 +13,88 @@ import sys from cros_utils import command_executer -TEST_DIR = 'full_bisect_test' -DEFAULT_BISECT_DIR = '/tmp/sysroot_bisect' +TEST_DIR = "full_bisect_test" +DEFAULT_BISECT_DIR = "/tmp/sysroot_bisect" -def populate_good_files(top_dir, ce, bisect_dir=DEFAULT_BISECT_DIR): - # 'make clean' - work_dir = os.path.join(top_dir, TEST_DIR, 'work') - cmd = 'rm -f %s/*.o' % work_dir - status = ce.RunCommand(cmd) - if status != 0: - print('Error trying to clean out work directory: %s' % cmd) - return status - # set up the 'good' source files - script = os.path.join(top_dir, TEST_DIR, 'make_sources_good.sh') - status = ce.RunCommand(script) - if status != 0: - print('Error setting up "good" source files: %s' % script) +def populate_good_files(top_dir, ce, bisect_dir=DEFAULT_BISECT_DIR): + # 'make clean' + work_dir = os.path.join(top_dir, TEST_DIR, "work") + cmd = "rm -f %s/*.o" % work_dir + status = ce.RunCommand(cmd) + if status != 0: + print("Error trying to clean out work directory: %s" % cmd) + return status + + # set up the 'good' source files + script = os.path.join(top_dir, TEST_DIR, "make_sources_good.sh") + status = ce.RunCommand(script) + if status != 0: + print('Error setting up "good" source files: %s' % script) + return status + + export_bisect = "export BISECT_DIR=%s; " % bisect_dir + # build the good source files + script_path = os.path.join(top_dir, TEST_DIR) + if os.path.exists("/usr/bin/x86_64-cros-linux-gnu-gcc"): + build_script = "chromeos_build.sh" + else: + build_script = "build.sh" + cmd = "%s export BISECT_STAGE=POPULATE_GOOD; pushd %s; ./%s; popd" % ( + export_bisect, + script_path, + build_script, + ) + status = ce.RunCommand(cmd) return status - export_bisect = 'export BISECT_DIR=%s; ' % bisect_dir - # build the good source files - script_path = os.path.join(top_dir, TEST_DIR) - if os.path.exists('/usr/bin/x86_64-cros-linux-gnu-gcc'): - build_script = 'chromeos_build.sh' - else: - build_script = 'build.sh' - cmd = ('%s export BISECT_STAGE=POPULATE_GOOD; pushd %s; ./%s; popd' % - (export_bisect, script_path, build_script)) - status = ce.RunCommand(cmd) - return status - def populate_bad_files(top_dir, ce, bisect_dir=DEFAULT_BISECT_DIR): - # 'make clean' - work_dir = os.path.join(top_dir, TEST_DIR, 'work') - cmd = 'rm -f %s/*.o' % work_dir - status = ce.RunCommand(cmd) - if status != 0: - print('Error trying to clean out work directory: %s' % cmd) + # 'make clean' + work_dir = os.path.join(top_dir, TEST_DIR, "work") + cmd = "rm -f %s/*.o" % work_dir + status = ce.RunCommand(cmd) + if status != 0: + print("Error trying to clean out work directory: %s" % cmd) + return status + + # set up the 'bad' source files + script = os.path.join(top_dir, TEST_DIR, "make_sources_bad.sh") + status = ce.RunCommand(script) + if status != 0: + print('Error setting up "bad" source files: %s' % script) + return status + + export_bisect = "export BISECT_DIR=%s; " % bisect_dir + # build the bad source files + script_path = os.path.join(top_dir, TEST_DIR) + if os.path.exists("/usr/bin/x86_64-cros-linux-gnu-gcc"): + build_script = "chromeos_build.sh" + else: + build_script = "build.sh" + cmd = "%s export BISECT_STAGE=POPULATE_BAD; pushd %s; ./%s ; popd" % ( + export_bisect, + script_path, + build_script, + ) + status = ce.RunCommand(cmd) return status - # set up the 'bad' source files - script = os.path.join(top_dir, TEST_DIR, 'make_sources_bad.sh') - status = ce.RunCommand(script) - if status != 0: - print('Error setting up "bad" source files: %s' % script) - return status - - export_bisect = 'export BISECT_DIR=%s; ' % bisect_dir - # build the bad source files - script_path = os.path.join(top_dir, TEST_DIR) - if os.path.exists('/usr/bin/x86_64-cros-linux-gnu-gcc'): - build_script = 'chromeos_build.sh' - else: - build_script = 'build.sh' - cmd = ('%s export BISECT_STAGE=POPULATE_BAD; pushd %s; ./%s ; popd' % - (export_bisect, script_path, build_script)) - status = ce.RunCommand(cmd) - return status - def run_main_bisection_test(top_dir, ce): - test_script = os.path.join(top_dir, TEST_DIR, 'main-bisect-test.sh') - status = ce.RunCommand(test_script) - return status + test_script = os.path.join(top_dir, TEST_DIR, "main-bisect-test.sh") + status = ce.RunCommand(test_script) + return status def verify_compiler_and_wrapper(): - # We don't need to do any special setup if running inside a ChromeOS - # chroot. - if os.path.exists('/usr/bin/x86_64-cros-linux-gnu-gcc'): - return True + # We don't need to do any special setup if running inside a ChromeOS + # chroot. + if os.path.exists("/usr/bin/x86_64-cros-linux-gnu-gcc"): + return True - message = """ + message = """ *** IMPORTANT --- READ THIS CAREFULLY!! *** This test uses the command 'gcc' to compile the good/bad versions of the @@ -100,78 +106,93 @@ thing". Is your compiler wrapper properly set up? [Y/n] """ - print(message) - inp = sys.stdin.readline() - inp = inp.strip() - inp = inp.lower() - return not inp or inp == 'y' or inp == 'yes' + print(message) + inp = sys.stdin.readline() + inp = inp.strip() + inp = inp.lower() + return not inp or inp == "y" or inp == "yes" def Main(argv): - parser = argparse.ArgumentParser() - parser.add_argument( - '--dir', - dest='directory', - help='Bisection work tree, where good & bad object ' - 'files go. Default is /tmp/sysroot_bisect') - - options = parser.parse_args(argv) - - # Make sure the compiler wrapper & soft links are properly set up. - wrapper_is_setup = verify_compiler_and_wrapper() - if not wrapper_is_setup: - print('Exiting now. Please re-run after you have set up the compiler ' - 'wrapper.') - return 0 - - # Make sure we're in the correct directory for running this test. - cwd = os.getcwd() - if not os.path.exists(os.path.join(cwd, 'full_bisect_test')): - print('Error: Wrong directory. This script must be run from the top level' - ' of the binary_search_tool tree (under toolchain_utils).') - return 1 - - ce = command_executer.GetCommandExecuter() - bisect_dir = options.directory - if not bisect_dir: - bisect_dir = DEFAULT_BISECT_DIR - - # Make sure BISECT_DIR is clean - if os.path.exists(bisect_dir): - cmd = 'rm -Rf %s/*' % bisect_dir - retv = ce.RunCommand(cmd) + parser = argparse.ArgumentParser() + parser.add_argument( + "--dir", + dest="directory", + help="Bisection work tree, where good & bad object " + "files go. Default is /tmp/sysroot_bisect", + ) + + options = parser.parse_args(argv) + + # Make sure the compiler wrapper & soft links are properly set up. + wrapper_is_setup = verify_compiler_and_wrapper() + if not wrapper_is_setup: + print( + "Exiting now. Please re-run after you have set up the compiler " + "wrapper." + ) + return 0 + + # Make sure we're in the correct directory for running this test. + cwd = os.getcwd() + if not os.path.exists(os.path.join(cwd, "full_bisect_test")): + print( + "Error: Wrong directory. This script must be run from the top level" + " of the binary_search_tool tree (under toolchain_utils)." + ) + return 1 + + ce = command_executer.GetCommandExecuter() + bisect_dir = options.directory + if not bisect_dir: + bisect_dir = DEFAULT_BISECT_DIR + + # Make sure BISECT_DIR is clean + if os.path.exists(bisect_dir): + cmd = "rm -Rf %s/*" % bisect_dir + retv = ce.RunCommand(cmd) + if retv != 0: + return retv + + retv = populate_good_files(cwd, ce, bisect_dir) if retv != 0: - return retv - - retv = populate_good_files(cwd, ce, bisect_dir) - if retv != 0: - return retv + return retv - retv = populate_bad_files(cwd, ce, bisect_dir) - if retv != 0: + retv = populate_bad_files(cwd, ce, bisect_dir) + if retv != 0: + return retv + + # Set up good/bad work soft links + cmd = "rm -f %s/%s/good-objects; ln -s %s/good %s/%s/good-objects" % ( + cwd, + TEST_DIR, + bisect_dir, + cwd, + TEST_DIR, + ) + + status = ce.RunCommand(cmd) + if status != 0: + print("Error executing: %s; exiting now." % cmd) + return status + + cmd = "rm -f %s/%s/bad-objects; ln -s %s/bad %s/%s/bad-objects" % ( + cwd, + TEST_DIR, + bisect_dir, + cwd, + TEST_DIR, + ) + + status = ce.RunCommand(cmd) + if status != 0: + print("Error executing: %s; exiting now." % cmd) + return status + + retv = run_main_bisection_test(cwd, ce) return retv - # Set up good/bad work soft links - cmd = ('rm -f %s/%s/good-objects; ln -s %s/good %s/%s/good-objects' % - (cwd, TEST_DIR, bisect_dir, cwd, TEST_DIR)) - - status = ce.RunCommand(cmd) - if status != 0: - print('Error executing: %s; exiting now.' % cmd) - return status - - cmd = ('rm -f %s/%s/bad-objects; ln -s %s/bad %s/%s/bad-objects' % - (cwd, TEST_DIR, bisect_dir, cwd, TEST_DIR)) - - status = ce.RunCommand(cmd) - if status != 0: - print('Error executing: %s; exiting now.' % cmd) - return status - - retv = run_main_bisection_test(cwd, ce) - return retv - -if __name__ == '__main__': - retval = Main(sys.argv[1:]) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv[1:]) + sys.exit(retval) |