diff options
author | George Burgess IV <gbiv@google.com> | 2022-09-02 16:59:27 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-09-07 21:15:07 +0000 |
commit | 74bd380a27f4f0e8e90ff2dc1cef0b502d74961b (patch) | |
tree | be028f89ec1e2eca735bb4aa1610530147a53625 /binary_search_tool/test | |
parent | 8448c60a6a2337ec993923837e1d55b41f49dabc (diff) | |
download | toolchain-utils-74bd380a27f4f0e8e90ff2dc1cef0b502d74961b.tar.gz |
Autoformat all Python code
This autoformats all Python code with our new Python formatter, `black`.
BUG=b:244644217
TEST=None
Change-Id: I15ee49233d98fb6295c0c53c129bbf8e78e0d9ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3877337
Tested-by: George Burgess <gbiv@chromium.org>
Reviewed-by: Jordan Abrahams-Whitehead <ajordanr@google.com>
Commit-Queue: George Burgess <gbiv@chromium.org>
Diffstat (limited to 'binary_search_tool/test')
-rwxr-xr-x | binary_search_tool/test/binary_search_tool_test.py | 1102 | ||||
-rwxr-xr-x | binary_search_tool/test/cmd_script.py | 113 | ||||
-rw-r--r-- | binary_search_tool/test/cmd_script_no_support.py | 23 | ||||
-rwxr-xr-x | binary_search_tool/test/common.py | 40 | ||||
-rwxr-xr-x | binary_search_tool/test/gen_init_list.py | 17 | ||||
-rwxr-xr-x | binary_search_tool/test/gen_obj.py | 166 | ||||
-rwxr-xr-x | binary_search_tool/test/generate_cmd.py | 18 | ||||
-rwxr-xr-x | binary_search_tool/test/is_good.py | 24 | ||||
-rwxr-xr-x | binary_search_tool/test/is_good_noinc_prune.py | 42 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_tmp.py | 24 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_bad.py | 22 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_bad_noinc_prune.py | 24 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_bad_set_file.py | 28 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_good.py | 18 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_good_noinc_prune.py | 20 | ||||
-rwxr-xr-x | binary_search_tool/test/switch_to_good_set_file.py | 24 | ||||
-rwxr-xr-x | binary_search_tool/test/test_setup.py | 14 | ||||
-rwxr-xr-x | binary_search_tool/test/test_setup_bad.py | 8 |
18 files changed, 898 insertions, 829 deletions
diff --git a/binary_search_tool/test/binary_search_tool_test.py b/binary_search_tool/test/binary_search_tool_test.py index 493c2e35..f9070989 100755 --- a/binary_search_tool/test/binary_search_tool_test.py +++ b/binary_search_tool/test/binary_search_tool_test.py @@ -9,7 +9,7 @@ from __future__ import division from __future__ import print_function -__author__ = 'shenhan@google.com (Han Shen)' +__author__ = "shenhan@google.com (Han Shen)" import os import random @@ -25,545 +25,597 @@ from binary_search_tool.test import gen_obj def GenObj(): - obj_num = random.randint(100, 1000) - bad_obj_num = random.randint(obj_num // 100, obj_num // 20) - if bad_obj_num == 0: - bad_obj_num = 1 - gen_obj.Main(['--obj_num', str(obj_num), '--bad_obj_num', str(bad_obj_num)]) + obj_num = random.randint(100, 1000) + bad_obj_num = random.randint(obj_num // 100, obj_num // 20) + if bad_obj_num == 0: + bad_obj_num = 1 + gen_obj.Main(["--obj_num", str(obj_num), "--bad_obj_num", str(bad_obj_num)]) def CleanObj(): - os.remove(common.OBJECTS_FILE) - os.remove(common.WORKING_SET_FILE) - print('Deleted "{0}" and "{1}"'.format(common.OBJECTS_FILE, - common.WORKING_SET_FILE)) + os.remove(common.OBJECTS_FILE) + os.remove(common.WORKING_SET_FILE) + print( + 'Deleted "{0}" and "{1}"'.format( + common.OBJECTS_FILE, common.WORKING_SET_FILE + ) + ) class BisectTest(unittest.TestCase): - """Tests for run_bisect.py""" - - def setUp(self): - with open('./is_setup', 'w', encoding='utf-8'): - pass - - try: - os.remove(binary_search_state.STATE_FILE) - except OSError: - pass - - def tearDown(self): - try: - os.remove('./is_setup') - os.remove(os.readlink(binary_search_state.STATE_FILE)) - os.remove(binary_search_state.STATE_FILE) - except OSError: - pass - - class FullBisector(run_bisect.Bisector): - """Test bisector to test run_bisect.py with""" - - def __init__(self, options, overrides): - super(BisectTest.FullBisector, self).__init__(options, overrides) - - def PreRun(self): - GenObj() - return 0 - - def Run(self): - return binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - prune=True, - file_args=True) - - def PostRun(self): - CleanObj() - return 0 - - def test_full_bisector(self): - ret = run_bisect.Run(self.FullBisector({}, {})) - self.assertEqual(ret, 0) - self.assertFalse(os.path.exists(common.OBJECTS_FILE)) - self.assertFalse(os.path.exists(common.WORKING_SET_FILE)) - - def check_output(self): - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - ('grep "Bad items are: " logs/binary_search_tool_test.py.out | ' - 'tail -n1')) - ls = out.splitlines() - self.assertEqual(len(ls), 1) - line = ls[0] - - _, _, bad_ones = line.partition('Bad items are: ') - bad_ones = bad_ones.split() - expected_result = common.ReadObjectsFile() - - # Reconstruct objects file from bad_ones and compare - actual_result = [0] * len(expected_result) - for bad_obj in bad_ones: - actual_result[int(bad_obj)] = 1 - - self.assertEqual(actual_result, expected_result) + """Tests for run_bisect.py""" + + def setUp(self): + with open("./is_setup", "w", encoding="utf-8"): + pass + + try: + os.remove(binary_search_state.STATE_FILE) + except OSError: + pass + + def tearDown(self): + try: + os.remove("./is_setup") + os.remove(os.readlink(binary_search_state.STATE_FILE)) + os.remove(binary_search_state.STATE_FILE) + except OSError: + pass + + class FullBisector(run_bisect.Bisector): + """Test bisector to test run_bisect.py with""" + + def __init__(self, options, overrides): + super(BisectTest.FullBisector, self).__init__(options, overrides) + + def PreRun(self): + GenObj() + return 0 + + def Run(self): + return binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + prune=True, + file_args=True, + ) + + def PostRun(self): + CleanObj() + return 0 + + def test_full_bisector(self): + ret = run_bisect.Run(self.FullBisector({}, {})) + self.assertEqual(ret, 0) + self.assertFalse(os.path.exists(common.OBJECTS_FILE)) + self.assertFalse(os.path.exists(common.WORKING_SET_FILE)) + + def check_output(self): + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + ( + 'grep "Bad items are: " logs/binary_search_tool_test.py.out | ' + "tail -n1" + ) + ) + ls = out.splitlines() + self.assertEqual(len(ls), 1) + line = ls[0] + + _, _, bad_ones = line.partition("Bad items are: ") + bad_ones = bad_ones.split() + expected_result = common.ReadObjectsFile() + + # Reconstruct objects file from bad_ones and compare + actual_result = [0] * len(expected_result) + for bad_obj in bad_ones: + actual_result[int(bad_obj)] = 1 + + self.assertEqual(actual_result, expected_result) class BisectingUtilsTest(unittest.TestCase): - """Tests for bisecting tool.""" - - def setUp(self): - """Generate [100-1000] object files, and 1-5% of which are bad ones.""" - GenObj() - - with open('./is_setup', 'w', encoding='utf-8'): - pass - - try: - os.remove(binary_search_state.STATE_FILE) - except OSError: - pass - - def tearDown(self): - """Cleanup temp files.""" - CleanObj() - - try: - os.remove(os.readlink(binary_search_state.STATE_FILE)) - except OSError: - pass - - cleanup_list = [ - './is_setup', binary_search_state.STATE_FILE, 'noinc_prune_bad', - 'noinc_prune_good', './cmd_script.sh' - ] - for f in cleanup_list: - if os.path.exists(f): - os.remove(f) - - def runTest(self): - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - prune=True, - file_args=True) - self.assertEqual(ret, 0) - self.check_output() - - def test_arg_parse(self): - args = [ - '--get_initial_items', './gen_init_list.py', '--switch_to_good', - './switch_to_good.py', '--switch_to_bad', './switch_to_bad.py', - '--test_script', './is_good.py', '--prune', '--file_args' - ] - ret = binary_search_state.Main(args) - self.assertEqual(ret, 0) - self.check_output() - - def test_test_setup_script(self): - os.remove('./is_setup') - with self.assertRaises(AssertionError): - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - prune=True, - file_args=True) - - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - test_setup_script='./test_setup.py', - prune=True, - file_args=True) - self.assertEqual(ret, 0) - self.check_output() - - def test_bad_test_setup_script(self): - with self.assertRaises(AssertionError): - binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - test_setup_script='./test_setup_bad.py', - prune=True, - file_args=True) - - def test_bad_save_state(self): - state_file = binary_search_state.STATE_FILE - hidden_state_file = os.path.basename(binary_search_state.HIDDEN_STATE_FILE) - - with open(state_file, 'w', encoding='utf-8') as f: - f.write('test123') - - bss = binary_search_state.MockBinarySearchState() - with self.assertRaises(OSError): - bss.SaveState() - - with open(state_file, 'r', encoding='utf-8') as f: - self.assertEqual(f.read(), 'test123') - - os.remove(state_file) - - # Cleanup generated save state that has no symlink - files = os.listdir(os.getcwd()) - save_states = [x for x in files if x.startswith(hidden_state_file)] - _ = [os.remove(x) for x in save_states] - - def test_save_state(self): - state_file = binary_search_state.STATE_FILE - - bss = binary_search_state.MockBinarySearchState() - bss.SaveState() - self.assertTrue(os.path.exists(state_file)) - first_state = os.readlink(state_file) - - bss.SaveState() - second_state = os.readlink(state_file) - self.assertTrue(os.path.exists(state_file)) - self.assertTrue(second_state != first_state) - self.assertFalse(os.path.exists(first_state)) - - bss.RemoveState() - self.assertFalse(os.path.islink(state_file)) - self.assertFalse(os.path.exists(second_state)) - - def test_load_state(self): - test_items = [1, 2, 3, 4, 5] - - bss = binary_search_state.MockBinarySearchState() - bss.all_items = test_items - bss.currently_good_items = set([1, 2, 3]) - bss.currently_bad_items = set([4, 5]) - bss.SaveState() - - bss = None - - bss2 = binary_search_state.MockBinarySearchState.LoadState() - self.assertEqual(bss2.all_items, test_items) - self.assertEqual(bss2.currently_good_items, set([])) - self.assertEqual(bss2.currently_bad_items, set([])) - - def test_tmp_cleanup(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='echo "0\n1\n2\n3"', - switch_to_good='./switch_tmp.py', - file_args=True) - bss.SwitchToGood(['0', '1', '2', '3']) - - tmp_file = None - with open('tmp_file', 'r', encoding='utf-8') as f: - tmp_file = f.read() - os.remove('tmp_file') - - self.assertFalse(os.path.exists(tmp_file)) - ws = common.ReadWorkingSet() - for i in range(3): - self.assertEqual(ws[i], 42) - - def test_verify_fail(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_bad.py', - switch_to_bad='./switch_to_good.py', - test_script='./is_good.py', - prune=True, - file_args=True, - verify=True) - with self.assertRaises(AssertionError): - bss.DoVerify() - - def test_early_terminate(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - prune=True, - file_args=True, - iterations=1) - bss.DoSearchBadItems() - self.assertFalse(bss.found_items) - - def test_no_prune(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - test_setup_script='./test_setup.py', - prune=False, - file_args=True) - bss.DoSearchBadItems() - self.assertEqual(len(bss.found_items), 1) - - bad_objs = common.ReadObjectsFile() - found_obj = int(bss.found_items.pop()) - self.assertEqual(bad_objs[found_obj], 1) - - def test_set_file(self): - binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good_set_file.py', - switch_to_bad='./switch_to_bad_set_file.py', - test_script='./is_good.py', - prune=True, - file_args=True, - verify=True) - self.check_output() - - def test_noincremental_prune(self): - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good_noinc_prune.py', - switch_to_bad='./switch_to_bad_noinc_prune.py', - test_script='./is_good_noinc_prune.py', - test_setup_script='./test_setup.py', - prune=True, - noincremental=True, - file_args=True, - verify=False) - self.assertEqual(ret, 0) - self.check_output() - - def check_output(self): - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - ('grep "Bad items are: " logs/binary_search_tool_test.py.out | ' - 'tail -n1')) - ls = out.splitlines() - self.assertEqual(len(ls), 1) - line = ls[0] - - _, _, bad_ones = line.partition('Bad items are: ') - bad_ones = bad_ones.split() - expected_result = common.ReadObjectsFile() - - # Reconstruct objects file from bad_ones and compare - actual_result = [0] * len(expected_result) - for bad_obj in bad_ones: - actual_result[int(bad_obj)] = 1 - - self.assertEqual(actual_result, expected_result) + """Tests for bisecting tool.""" + + def setUp(self): + """Generate [100-1000] object files, and 1-5% of which are bad ones.""" + GenObj() + + with open("./is_setup", "w", encoding="utf-8"): + pass + + try: + os.remove(binary_search_state.STATE_FILE) + except OSError: + pass + + def tearDown(self): + """Cleanup temp files.""" + CleanObj() + + try: + os.remove(os.readlink(binary_search_state.STATE_FILE)) + except OSError: + pass + + cleanup_list = [ + "./is_setup", + binary_search_state.STATE_FILE, + "noinc_prune_bad", + "noinc_prune_good", + "./cmd_script.sh", + ] + for f in cleanup_list: + if os.path.exists(f): + os.remove(f) + + def runTest(self): + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + prune=True, + file_args=True, + ) + self.assertEqual(ret, 0) + self.check_output() + + def test_arg_parse(self): + args = [ + "--get_initial_items", + "./gen_init_list.py", + "--switch_to_good", + "./switch_to_good.py", + "--switch_to_bad", + "./switch_to_bad.py", + "--test_script", + "./is_good.py", + "--prune", + "--file_args", + ] + ret = binary_search_state.Main(args) + self.assertEqual(ret, 0) + self.check_output() + + def test_test_setup_script(self): + os.remove("./is_setup") + with self.assertRaises(AssertionError): + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + prune=True, + file_args=True, + ) + + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + test_setup_script="./test_setup.py", + prune=True, + file_args=True, + ) + self.assertEqual(ret, 0) + self.check_output() + + def test_bad_test_setup_script(self): + with self.assertRaises(AssertionError): + binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + test_setup_script="./test_setup_bad.py", + prune=True, + file_args=True, + ) + + def test_bad_save_state(self): + state_file = binary_search_state.STATE_FILE + hidden_state_file = os.path.basename( + binary_search_state.HIDDEN_STATE_FILE + ) + + with open(state_file, "w", encoding="utf-8") as f: + f.write("test123") + + bss = binary_search_state.MockBinarySearchState() + with self.assertRaises(OSError): + bss.SaveState() + + with open(state_file, "r", encoding="utf-8") as f: + self.assertEqual(f.read(), "test123") + + os.remove(state_file) + + # Cleanup generated save state that has no symlink + files = os.listdir(os.getcwd()) + save_states = [x for x in files if x.startswith(hidden_state_file)] + _ = [os.remove(x) for x in save_states] + + def test_save_state(self): + state_file = binary_search_state.STATE_FILE + + bss = binary_search_state.MockBinarySearchState() + bss.SaveState() + self.assertTrue(os.path.exists(state_file)) + first_state = os.readlink(state_file) + + bss.SaveState() + second_state = os.readlink(state_file) + self.assertTrue(os.path.exists(state_file)) + self.assertTrue(second_state != first_state) + self.assertFalse(os.path.exists(first_state)) + + bss.RemoveState() + self.assertFalse(os.path.islink(state_file)) + self.assertFalse(os.path.exists(second_state)) + + def test_load_state(self): + test_items = [1, 2, 3, 4, 5] + + bss = binary_search_state.MockBinarySearchState() + bss.all_items = test_items + bss.currently_good_items = set([1, 2, 3]) + bss.currently_bad_items = set([4, 5]) + bss.SaveState() + + bss = None + + bss2 = binary_search_state.MockBinarySearchState.LoadState() + self.assertEqual(bss2.all_items, test_items) + self.assertEqual(bss2.currently_good_items, set([])) + self.assertEqual(bss2.currently_bad_items, set([])) + + def test_tmp_cleanup(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items='echo "0\n1\n2\n3"', + switch_to_good="./switch_tmp.py", + file_args=True, + ) + bss.SwitchToGood(["0", "1", "2", "3"]) + + tmp_file = None + with open("tmp_file", "r", encoding="utf-8") as f: + tmp_file = f.read() + os.remove("tmp_file") + + self.assertFalse(os.path.exists(tmp_file)) + ws = common.ReadWorkingSet() + for i in range(3): + self.assertEqual(ws[i], 42) + + def test_verify_fail(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_bad.py", + switch_to_bad="./switch_to_good.py", + test_script="./is_good.py", + prune=True, + file_args=True, + verify=True, + ) + with self.assertRaises(AssertionError): + bss.DoVerify() + + def test_early_terminate(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + prune=True, + file_args=True, + iterations=1, + ) + bss.DoSearchBadItems() + self.assertFalse(bss.found_items) + + def test_no_prune(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + test_setup_script="./test_setup.py", + prune=False, + file_args=True, + ) + bss.DoSearchBadItems() + self.assertEqual(len(bss.found_items), 1) + + bad_objs = common.ReadObjectsFile() + found_obj = int(bss.found_items.pop()) + self.assertEqual(bad_objs[found_obj], 1) + + def test_set_file(self): + binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good_set_file.py", + switch_to_bad="./switch_to_bad_set_file.py", + test_script="./is_good.py", + prune=True, + file_args=True, + verify=True, + ) + self.check_output() + + def test_noincremental_prune(self): + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good_noinc_prune.py", + switch_to_bad="./switch_to_bad_noinc_prune.py", + test_script="./is_good_noinc_prune.py", + test_setup_script="./test_setup.py", + prune=True, + noincremental=True, + file_args=True, + verify=False, + ) + self.assertEqual(ret, 0) + self.check_output() + + def check_output(self): + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + ( + 'grep "Bad items are: " logs/binary_search_tool_test.py.out | ' + "tail -n1" + ) + ) + ls = out.splitlines() + self.assertEqual(len(ls), 1) + line = ls[0] + + _, _, bad_ones = line.partition("Bad items are: ") + bad_ones = bad_ones.split() + expected_result = common.ReadObjectsFile() + + # Reconstruct objects file from bad_ones and compare + actual_result = [0] * len(expected_result) + for bad_obj in bad_ones: + actual_result[int(bad_obj)] = 1 + + self.assertEqual(actual_result, expected_result) class BisectingUtilsPassTest(BisectingUtilsTest): - """Tests for bisecting tool at pass/transformation level.""" - - def check_pass_output(self, pass_name, pass_num, trans_num): - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - ('grep "Bad pass: " logs/binary_search_tool_test.py.out | ' - 'tail -n1')) - ls = out.splitlines() - self.assertEqual(len(ls), 1) - line = ls[0] - _, _, bad_info = line.partition('Bad pass: ') - actual_info = pass_name + ' at number ' + str(pass_num) - self.assertEqual(actual_info, bad_info) - - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - ('grep "Bad transformation number: ' - '" logs/binary_search_tool_test.py.out | ' - 'tail -n1')) - ls = out.splitlines() - self.assertEqual(len(ls), 1) - line = ls[0] - _, _, bad_info = line.partition('Bad transformation number: ') - actual_info = str(trans_num) - self.assertEqual(actual_info, bad_info) - - def test_with_prune(self): - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=True, - file_args=True) - self.assertEqual(ret, 1) - - def test_gen_cmd_script(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - bss.DoSearchBadItems() - cmd_script_path = bss.cmd_script - self.assertTrue(os.path.exists(cmd_script_path)) - - def test_no_pass_support(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - bss.cmd_script = './cmd_script_no_support.py' - # No support for -opt-bisect-limit - with self.assertRaises(RuntimeError): - bss.BuildWithPassLimit(-1) - - def test_no_transform_support(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - bss.cmd_script = './cmd_script_no_support.py' - # No support for -print-debug-counter - with self.assertRaises(RuntimeError): - bss.BuildWithTransformLimit(-1, 'counter_name') - - def test_pass_transform_bisect(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - pass_num = 4 - trans_num = 19 - bss.cmd_script = './cmd_script.py %d %d' % (pass_num, trans_num) - bss.DoSearchBadPass() - self.check_pass_output('instcombine-visit', pass_num, trans_num) - - def test_result_not_reproduced_pass(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - # Fails reproducing at pass level. - pass_num = 0 - trans_num = 19 - bss.cmd_script = './cmd_script.py %d %d' % (pass_num, trans_num) - with self.assertRaises(ValueError): - bss.DoSearchBadPass() - - def test_result_not_reproduced_transform(self): - bss = binary_search_state.MockBinarySearchState( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - pass_bisect='./generate_cmd.py', - prune=False, - file_args=True) - # Fails reproducing at transformation level. - pass_num = 4 - trans_num = 0 - bss.cmd_script = './cmd_script.py %d %d' % (pass_num, trans_num) - with self.assertRaises(ValueError): - bss.DoSearchBadPass() + """Tests for bisecting tool at pass/transformation level.""" + + def check_pass_output(self, pass_name, pass_num, trans_num): + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + ( + 'grep "Bad pass: " logs/binary_search_tool_test.py.out | ' + "tail -n1" + ) + ) + ls = out.splitlines() + self.assertEqual(len(ls), 1) + line = ls[0] + _, _, bad_info = line.partition("Bad pass: ") + actual_info = pass_name + " at number " + str(pass_num) + self.assertEqual(actual_info, bad_info) + + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + ( + 'grep "Bad transformation number: ' + '" logs/binary_search_tool_test.py.out | ' + "tail -n1" + ) + ) + ls = out.splitlines() + self.assertEqual(len(ls), 1) + line = ls[0] + _, _, bad_info = line.partition("Bad transformation number: ") + actual_info = str(trans_num) + self.assertEqual(actual_info, bad_info) + + def test_with_prune(self): + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=True, + file_args=True, + ) + self.assertEqual(ret, 1) + + def test_gen_cmd_script(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + bss.DoSearchBadItems() + cmd_script_path = bss.cmd_script + self.assertTrue(os.path.exists(cmd_script_path)) + + def test_no_pass_support(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + bss.cmd_script = "./cmd_script_no_support.py" + # No support for -opt-bisect-limit + with self.assertRaises(RuntimeError): + bss.BuildWithPassLimit(-1) + + def test_no_transform_support(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + bss.cmd_script = "./cmd_script_no_support.py" + # No support for -print-debug-counter + with self.assertRaises(RuntimeError): + bss.BuildWithTransformLimit(-1, "counter_name") + + def test_pass_transform_bisect(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + pass_num = 4 + trans_num = 19 + bss.cmd_script = "./cmd_script.py %d %d" % (pass_num, trans_num) + bss.DoSearchBadPass() + self.check_pass_output("instcombine-visit", pass_num, trans_num) + + def test_result_not_reproduced_pass(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + # Fails reproducing at pass level. + pass_num = 0 + trans_num = 19 + bss.cmd_script = "./cmd_script.py %d %d" % (pass_num, trans_num) + with self.assertRaises(ValueError): + bss.DoSearchBadPass() + + def test_result_not_reproduced_transform(self): + bss = binary_search_state.MockBinarySearchState( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + pass_bisect="./generate_cmd.py", + prune=False, + file_args=True, + ) + # Fails reproducing at transformation level. + pass_num = 4 + trans_num = 0 + bss.cmd_script = "./cmd_script.py %d %d" % (pass_num, trans_num) + with self.assertRaises(ValueError): + bss.DoSearchBadPass() class BisectStressTest(unittest.TestCase): - """Stress tests for bisecting tool.""" - - def test_every_obj_bad(self): - amt = 25 - gen_obj.Main(['--obj_num', str(amt), '--bad_obj_num', str(amt)]) - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_script='./is_good.py', - prune=True, - file_args=True, - verify=False) - self.assertEqual(ret, 0) - self.check_output() - - def test_every_index_is_bad(self): - amt = 25 - for i in range(amt): - obj_list = ['0'] * amt - obj_list[i] = '1' - obj_list = ','.join(obj_list) - gen_obj.Main(['--obj_list', obj_list]) - ret = binary_search_state.Run( - get_initial_items='./gen_init_list.py', - switch_to_good='./switch_to_good.py', - switch_to_bad='./switch_to_bad.py', - test_setup_script='./test_setup.py', - test_script='./is_good.py', - prune=True, - file_args=True) - self.assertEqual(ret, 0) - self.check_output() - - def check_output(self): - _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( - ('grep "Bad items are: " logs/binary_search_tool_test.py.out | ' - 'tail -n1')) - ls = out.splitlines() - self.assertEqual(len(ls), 1) - line = ls[0] - - _, _, bad_ones = line.partition('Bad items are: ') - bad_ones = bad_ones.split() - expected_result = common.ReadObjectsFile() - - # Reconstruct objects file from bad_ones and compare - actual_result = [0] * len(expected_result) - for bad_obj in bad_ones: - actual_result[int(bad_obj)] = 1 - - self.assertEqual(actual_result, expected_result) + """Stress tests for bisecting tool.""" + + def test_every_obj_bad(self): + amt = 25 + gen_obj.Main(["--obj_num", str(amt), "--bad_obj_num", str(amt)]) + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_script="./is_good.py", + prune=True, + file_args=True, + verify=False, + ) + self.assertEqual(ret, 0) + self.check_output() + + def test_every_index_is_bad(self): + amt = 25 + for i in range(amt): + obj_list = ["0"] * amt + obj_list[i] = "1" + obj_list = ",".join(obj_list) + gen_obj.Main(["--obj_list", obj_list]) + ret = binary_search_state.Run( + get_initial_items="./gen_init_list.py", + switch_to_good="./switch_to_good.py", + switch_to_bad="./switch_to_bad.py", + test_setup_script="./test_setup.py", + test_script="./is_good.py", + prune=True, + file_args=True, + ) + self.assertEqual(ret, 0) + self.check_output() + + def check_output(self): + _, out, _ = command_executer.GetCommandExecuter().RunCommandWOutput( + ( + 'grep "Bad items are: " logs/binary_search_tool_test.py.out | ' + "tail -n1" + ) + ) + ls = out.splitlines() + self.assertEqual(len(ls), 1) + line = ls[0] + + _, _, bad_ones = line.partition("Bad items are: ") + bad_ones = bad_ones.split() + expected_result = common.ReadObjectsFile() + + # Reconstruct objects file from bad_ones and compare + actual_result = [0] * len(expected_result) + for bad_obj in bad_ones: + actual_result[int(bad_obj)] = 1 + + self.assertEqual(actual_result, expected_result) def Main(argv): - num_tests = 2 - if len(argv) > 1: - num_tests = int(argv[1]) - - suite = unittest.TestSuite() - for _ in range(0, num_tests): - suite.addTest(BisectingUtilsTest()) - suite.addTest(BisectingUtilsTest('test_arg_parse')) - suite.addTest(BisectingUtilsTest('test_test_setup_script')) - suite.addTest(BisectingUtilsTest('test_bad_test_setup_script')) - suite.addTest(BisectingUtilsTest('test_bad_save_state')) - suite.addTest(BisectingUtilsTest('test_save_state')) - suite.addTest(BisectingUtilsTest('test_load_state')) - suite.addTest(BisectingUtilsTest('test_tmp_cleanup')) - suite.addTest(BisectingUtilsTest('test_verify_fail')) - suite.addTest(BisectingUtilsTest('test_early_terminate')) - suite.addTest(BisectingUtilsTest('test_no_prune')) - suite.addTest(BisectingUtilsTest('test_set_file')) - suite.addTest(BisectingUtilsTest('test_noincremental_prune')) - suite.addTest(BisectingUtilsPassTest('test_with_prune')) - suite.addTest(BisectingUtilsPassTest('test_gen_cmd_script')) - suite.addTest(BisectingUtilsPassTest('test_no_pass_support')) - suite.addTest(BisectingUtilsPassTest('test_no_transform_support')) - suite.addTest(BisectingUtilsPassTest('test_pass_transform_bisect')) - suite.addTest(BisectingUtilsPassTest('test_result_not_reproduced_pass')) - suite.addTest(BisectingUtilsPassTest('test_result_not_reproduced_transform')) - suite.addTest(BisectTest('test_full_bisector')) - suite.addTest(BisectStressTest('test_every_obj_bad')) - suite.addTest(BisectStressTest('test_every_index_is_bad')) - runner = unittest.TextTestRunner() - runner.run(suite) - - -if __name__ == '__main__': - Main(sys.argv) + num_tests = 2 + if len(argv) > 1: + num_tests = int(argv[1]) + + suite = unittest.TestSuite() + for _ in range(0, num_tests): + suite.addTest(BisectingUtilsTest()) + suite.addTest(BisectingUtilsTest("test_arg_parse")) + suite.addTest(BisectingUtilsTest("test_test_setup_script")) + suite.addTest(BisectingUtilsTest("test_bad_test_setup_script")) + suite.addTest(BisectingUtilsTest("test_bad_save_state")) + suite.addTest(BisectingUtilsTest("test_save_state")) + suite.addTest(BisectingUtilsTest("test_load_state")) + suite.addTest(BisectingUtilsTest("test_tmp_cleanup")) + suite.addTest(BisectingUtilsTest("test_verify_fail")) + suite.addTest(BisectingUtilsTest("test_early_terminate")) + suite.addTest(BisectingUtilsTest("test_no_prune")) + suite.addTest(BisectingUtilsTest("test_set_file")) + suite.addTest(BisectingUtilsTest("test_noincremental_prune")) + suite.addTest(BisectingUtilsPassTest("test_with_prune")) + suite.addTest(BisectingUtilsPassTest("test_gen_cmd_script")) + suite.addTest(BisectingUtilsPassTest("test_no_pass_support")) + suite.addTest(BisectingUtilsPassTest("test_no_transform_support")) + suite.addTest(BisectingUtilsPassTest("test_pass_transform_bisect")) + suite.addTest(BisectingUtilsPassTest("test_result_not_reproduced_pass")) + suite.addTest( + BisectingUtilsPassTest("test_result_not_reproduced_transform") + ) + suite.addTest(BisectTest("test_full_bisector")) + suite.addTest(BisectStressTest("test_every_obj_bad")) + suite.addTest(BisectStressTest("test_every_index_is_bad")) + runner = unittest.TextTestRunner() + runner.run(suite) + + +if __name__ == "__main__": + Main(sys.argv) diff --git a/binary_search_tool/test/cmd_script.py b/binary_search_tool/test/cmd_script.py index 2f026edd..b668280e 100755 --- a/binary_search_tool/test/cmd_script.py +++ b/binary_search_tool/test/cmd_script.py @@ -20,57 +20,62 @@ from binary_search_tool.test import common def Main(argv): - if not os.path.exists('./is_setup'): - return 1 - - if len(argv) != 3: - return 1 - - limit_flags = os.environ['LIMIT_FLAGS'] - opt_bisect_exist = False - debug_counter_exist = False - - for option in limit_flags.split(): - if '-opt-bisect-limit' in option: - opt_bisect_limit = int(option.split('=')[-1]) - opt_bisect_exist = True - if '-debug-counter=' in option: - debug_counter = int(option.split('=')[-1]) - debug_counter_exist = True - - if not opt_bisect_exist: - return 1 - - # Manually set total number and bad number - total_pass = 10 - total_transform = 20 - bad_pass = int(argv[1]) - bad_transform = int(argv[2]) - - if opt_bisect_limit == -1: - opt_bisect_limit = total_pass - - for i in range(1, total_pass + 1): - bisect_str = 'BISECT: %srunning pass (%d) Combine redundant ' \ - 'instructions on function (f1)' \ - % ('NOT ' if i > opt_bisect_limit else '', i) - print(bisect_str, file=sys.stderr) - - if debug_counter_exist: - print('Counters and values:', file=sys.stderr) - print( - 'instcombine-visit : {%d, 0, %d}' % (total_transform, debug_counter), - file=sys.stderr) - - if opt_bisect_limit > bad_pass or \ - (debug_counter_exist and debug_counter > bad_transform): - common.WriteWorkingSet([1]) - else: - common.WriteWorkingSet([0]) - - return 0 - - -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) + if not os.path.exists("./is_setup"): + return 1 + + if len(argv) != 3: + return 1 + + limit_flags = os.environ["LIMIT_FLAGS"] + opt_bisect_exist = False + debug_counter_exist = False + + for option in limit_flags.split(): + if "-opt-bisect-limit" in option: + opt_bisect_limit = int(option.split("=")[-1]) + opt_bisect_exist = True + if "-debug-counter=" in option: + debug_counter = int(option.split("=")[-1]) + debug_counter_exist = True + + if not opt_bisect_exist: + return 1 + + # Manually set total number and bad number + total_pass = 10 + total_transform = 20 + bad_pass = int(argv[1]) + bad_transform = int(argv[2]) + + if opt_bisect_limit == -1: + opt_bisect_limit = total_pass + + for i in range(1, total_pass + 1): + bisect_str = ( + "BISECT: %srunning pass (%d) Combine redundant " + "instructions on function (f1)" + % ("NOT " if i > opt_bisect_limit else "", i) + ) + print(bisect_str, file=sys.stderr) + + if debug_counter_exist: + print("Counters and values:", file=sys.stderr) + print( + "instcombine-visit : {%d, 0, %d}" + % (total_transform, debug_counter), + file=sys.stderr, + ) + + if opt_bisect_limit > bad_pass or ( + debug_counter_exist and debug_counter > bad_transform + ): + common.WriteWorkingSet([1]) + else: + common.WriteWorkingSet([0]) + + return 0 + + +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/cmd_script_no_support.py b/binary_search_tool/test/cmd_script_no_support.py index 0cc9fedc..d2c8c39b 100644 --- a/binary_search_tool/test/cmd_script_no_support.py +++ b/binary_search_tool/test/cmd_script_no_support.py @@ -16,14 +16,15 @@ import sys def Main(): - if not os.path.exists('./is_setup'): - return 1 - print( - 'No support for -opt-bisect-limit or -print-debug-counter.', - file=sys.stderr) - return 0 - - -if __name__ == '__main__': - retval = Main() - sys.exit(retval) + if not os.path.exists("./is_setup"): + return 1 + print( + "No support for -opt-bisect-limit or -print-debug-counter.", + file=sys.stderr, + ) + return 0 + + +if __name__ == "__main__": + retval = Main() + sys.exit(retval) diff --git a/binary_search_tool/test/common.py b/binary_search_tool/test/common.py index 98f40096..fa33f20c 100755 --- a/binary_search_tool/test/common.py +++ b/binary_search_tool/test/common.py @@ -8,35 +8,35 @@ DEFAULT_OBJECT_NUMBER = 1238 DEFAULT_BAD_OBJECT_NUMBER = 23 -OBJECTS_FILE = 'objects.txt' -WORKING_SET_FILE = 'working_set.txt' +OBJECTS_FILE = "objects.txt" +WORKING_SET_FILE = "working_set.txt" def ReadWorkingSet(): - working_set = [] - with open(WORKING_SET_FILE, 'r', encoding='utf-8') as f: - for l in f: - working_set.append(int(l)) - return working_set + working_set = [] + with open(WORKING_SET_FILE, "r", encoding="utf-8") as f: + for l in f: + working_set.append(int(l)) + return working_set def WriteWorkingSet(working_set): - with open(WORKING_SET_FILE, 'w', encoding='utf-8') as f: - for o in working_set: - f.write('{0}\n'.format(o)) + with open(WORKING_SET_FILE, "w", encoding="utf-8") as f: + for o in working_set: + f.write("{0}\n".format(o)) def ReadObjectsFile(): - objects_file = [] - with open(OBJECTS_FILE, 'r', encoding='utf-8') as f: - for l in f: - objects_file.append(int(l)) - return objects_file + objects_file = [] + with open(OBJECTS_FILE, "r", encoding="utf-8") as f: + for l in f: + objects_file.append(int(l)) + return objects_file def ReadObjectIndex(filename): - object_index = [] - with open(filename, 'r', encoding='utf-8') as f: - for o in f: - object_index.append(int(o)) - return object_index + object_index = [] + with open(filename, "r", encoding="utf-8") as f: + for o in f: + object_index.append(int(o)) + return object_index diff --git a/binary_search_tool/test/gen_init_list.py b/binary_search_tool/test/gen_init_list.py index 718ac877..1fe1b43e 100755 --- a/binary_search_tool/test/gen_init_list.py +++ b/binary_search_tool/test/gen_init_list.py @@ -15,13 +15,14 @@ from binary_search_tool.test import common def Main(): - ce = command_executer.GetCommandExecuter() - _, l, _ = ce.RunCommandWOutput( - 'cat {0} | wc -l'.format(common.OBJECTS_FILE), print_to_console=False) - for i in range(0, int(l)): - print(i) + ce = command_executer.GetCommandExecuter() + _, l, _ = ce.RunCommandWOutput( + "cat {0} | wc -l".format(common.OBJECTS_FILE), print_to_console=False + ) + for i in range(0, int(l)): + print(i) -if __name__ == '__main__': - Main() - sys.exit(0) +if __name__ == "__main__": + Main() + sys.exit(0) diff --git a/binary_search_tool/test/gen_obj.py b/binary_search_tool/test/gen_obj.py index 7ea91788..aa9a9344 100755 --- a/binary_search_tool/test/gen_obj.py +++ b/binary_search_tool/test/gen_obj.py @@ -21,81 +21,91 @@ from binary_search_tool.test import common def Main(argv): - """Generates a list, the value of each element is 0 or 1. - - The number of 1s in the list is specified by bad_obj_num. - The others are all 0s. The total number of 0s and 1s is specified by obj_num. - - Args: - argv: argument from command line - - Returns: - 0 always. - """ - parser = argparse.ArgumentParser() - parser.add_argument( - '-n', - '--obj_num', - dest='obj_num', - default=common.DEFAULT_OBJECT_NUMBER, - help=('Number of total objects.')) - parser.add_argument( - '-b', - '--bad_obj_num', - dest='bad_obj_num', - default=common.DEFAULT_BAD_OBJECT_NUMBER, - help=('Number of bad objects. Must be great than or ' - 'equal to zero and less than total object ' - 'number.')) - parser.add_argument( - '-o', - '--obj_list', - dest='obj_list', - default='', - help=('List of comma seperated objects to generate. ' - 'A 0 means the object is good, a 1 means the ' - 'object is bad.')) - options = parser.parse_args(argv) - - obj_num = int(options.obj_num) - bad_obj_num = int(options.bad_obj_num) - bad_to_gen = int(options.bad_obj_num) - obj_list = options.obj_list - if not obj_list: - obj_list = [] - for i in range(obj_num): - if bad_to_gen > 0 and random.randint(1, obj_num) <= bad_obj_num: - obj_list.append(1) - bad_to_gen -= 1 - else: - obj_list.append(0) - while bad_to_gen > 0: - t = random.randint(0, obj_num - 1) - if obj_list[t] == 0: - obj_list[t] = 1 - bad_to_gen -= 1 - else: - obj_list = obj_list.split(',') - - if os.path.isfile(common.OBJECTS_FILE): - os.remove(common.OBJECTS_FILE) - if os.path.isfile(common.WORKING_SET_FILE): - os.remove(common.WORKING_SET_FILE) - - with open(common.OBJECTS_FILE, 'w', encoding='utf-8') as f: - with open(common.WORKING_SET_FILE, 'w', encoding='utf-8') as w: - for i in obj_list: - f.write('{0}\n'.format(i)) - w.write('{0}\n'.format(i)) - - obj_num = len(obj_list) - bad_obj_num = obj_list.count(1) - print('Generated {0} object files, with {1} bad ones.'.format( - obj_num, bad_obj_num)) - - return 0 - - -if __name__ == '__main__': - retval = Main(sys.argv[1:]) - sys.exit(retval) + """Generates a list, the value of each element is 0 or 1. + + The number of 1s in the list is specified by bad_obj_num. + The others are all 0s. The total number of 0s and 1s is specified by obj_num. + + Args: + argv: argument from command line + + Returns: + 0 always. + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "-n", + "--obj_num", + dest="obj_num", + default=common.DEFAULT_OBJECT_NUMBER, + help=("Number of total objects."), + ) + parser.add_argument( + "-b", + "--bad_obj_num", + dest="bad_obj_num", + default=common.DEFAULT_BAD_OBJECT_NUMBER, + help=( + "Number of bad objects. Must be great than or " + "equal to zero and less than total object " + "number." + ), + ) + parser.add_argument( + "-o", + "--obj_list", + dest="obj_list", + default="", + help=( + "List of comma seperated objects to generate. " + "A 0 means the object is good, a 1 means the " + "object is bad." + ), + ) + options = parser.parse_args(argv) + + obj_num = int(options.obj_num) + bad_obj_num = int(options.bad_obj_num) + bad_to_gen = int(options.bad_obj_num) + obj_list = options.obj_list + if not obj_list: + obj_list = [] + for i in range(obj_num): + if bad_to_gen > 0 and random.randint(1, obj_num) <= bad_obj_num: + obj_list.append(1) + bad_to_gen -= 1 + else: + obj_list.append(0) + while bad_to_gen > 0: + t = random.randint(0, obj_num - 1) + if obj_list[t] == 0: + obj_list[t] = 1 + bad_to_gen -= 1 + else: + obj_list = obj_list.split(",") + + if os.path.isfile(common.OBJECTS_FILE): + os.remove(common.OBJECTS_FILE) + if os.path.isfile(common.WORKING_SET_FILE): + os.remove(common.WORKING_SET_FILE) + + with open(common.OBJECTS_FILE, "w", encoding="utf-8") as f: + with open(common.WORKING_SET_FILE, "w", encoding="utf-8") as w: + for i in obj_list: + f.write("{0}\n".format(i)) + w.write("{0}\n".format(i)) + + obj_num = len(obj_list) + bad_obj_num = obj_list.count(1) + print( + "Generated {0} object files, with {1} bad ones.".format( + obj_num, bad_obj_num + ) + ) + + return 0 + + +if __name__ == "__main__": + retval = Main(sys.argv[1:]) + sys.exit(retval) diff --git a/binary_search_tool/test/generate_cmd.py b/binary_search_tool/test/generate_cmd.py index 08b8c646..bcfe176d 100755 --- a/binary_search_tool/test/generate_cmd.py +++ b/binary_search_tool/test/generate_cmd.py @@ -17,14 +17,14 @@ import sys def Main(): - if not os.path.exists('./is_setup'): - return 1 - file_name = 'cmd_script.sh' - with open(file_name, 'w', encoding='utf-8') as f: - f.write('Generated by generate_cmd.py') - return 0 + if not os.path.exists("./is_setup"): + return 1 + file_name = "cmd_script.sh" + with open(file_name, "w", encoding="utf-8") as f: + f.write("Generated by generate_cmd.py") + return 0 -if __name__ == '__main__': - retval = Main() - sys.exit(retval) +if __name__ == "__main__": + retval = Main() + sys.exit(retval) diff --git a/binary_search_tool/test/is_good.py b/binary_search_tool/test/is_good.py index 8212aede..3be7248f 100755 --- a/binary_search_tool/test/is_good.py +++ b/binary_search_tool/test/is_good.py @@ -15,15 +15,15 @@ from binary_search_tool.test import common def Main(): - if not os.path.exists('./is_setup'): - return 1 - working_set = common.ReadWorkingSet() - for w in working_set: - if w == 1: - return 1 ## False, linking failure - return 0 - - -if __name__ == '__main__': - retval = Main() - sys.exit(retval) + if not os.path.exists("./is_setup"): + return 1 + working_set = common.ReadWorkingSet() + for w in working_set: + if w == 1: + return 1 ## False, linking failure + return 0 + + +if __name__ == "__main__": + retval = Main() + sys.exit(retval) diff --git a/binary_search_tool/test/is_good_noinc_prune.py b/binary_search_tool/test/is_good_noinc_prune.py index 6329f493..4e520162 100755 --- a/binary_search_tool/test/is_good_noinc_prune.py +++ b/binary_search_tool/test/is_good_noinc_prune.py @@ -21,31 +21,31 @@ from binary_search_tool.test import common def Main(): - working_set = common.ReadWorkingSet() + working_set = common.ReadWorkingSet() - with open('noinc_prune_good', 'r', encoding='utf-8') as good_args: - num_good_args = len(good_args.readlines()) + with open("noinc_prune_good", "r", encoding="utf-8") as good_args: + num_good_args = len(good_args.readlines()) - with open('noinc_prune_bad', 'r', encoding='utf-8') as bad_args: - num_bad_args = len(bad_args.readlines()) + with open("noinc_prune_bad", "r", encoding="utf-8") as bad_args: + num_bad_args = len(bad_args.readlines()) - num_args = num_good_args + num_bad_args - if num_args != len(working_set): - print('Only %d args, expected %d' % (num_args, len(working_set))) - print('%d good args, %d bad args' % (num_good_args, num_bad_args)) - return 3 + num_args = num_good_args + num_bad_args + if num_args != len(working_set): + print("Only %d args, expected %d" % (num_args, len(working_set))) + print("%d good args, %d bad args" % (num_good_args, num_bad_args)) + return 3 - os.remove('noinc_prune_bad') - os.remove('noinc_prune_good') + os.remove("noinc_prune_bad") + os.remove("noinc_prune_good") - if not os.path.exists('./is_setup'): - return 1 - for w in working_set: - if w == 1: - return 1 ## False, linking failure - return 0 + if not os.path.exists("./is_setup"): + return 1 + for w in working_set: + if w == 1: + return 1 ## False, linking failure + return 0 -if __name__ == '__main__': - retval = Main() - sys.exit(retval) +if __name__ == "__main__": + retval = Main() + sys.exit(retval) diff --git a/binary_search_tool/test/switch_tmp.py b/binary_search_tool/test/switch_tmp.py index 1d4ccc88..2ff35427 100755 --- a/binary_search_tool/test/switch_tmp.py +++ b/binary_search_tool/test/switch_tmp.py @@ -20,20 +20,20 @@ from binary_search_tool.test import common def Main(argv): - working_set = common.ReadWorkingSet() - object_index = common.ReadObjectIndex(argv[1]) + working_set = common.ReadWorkingSet() + object_index = common.ReadObjectIndex(argv[1]) - # Random number so the results can be checked - for oi in object_index: - working_set[int(oi)] = 42 + # Random number so the results can be checked + for oi in object_index: + working_set[int(oi)] = 42 - common.WriteWorkingSet(working_set) - with open('tmp_file', 'w', encoding='utf-8') as f: - f.write(argv[1]) + common.WriteWorkingSet(working_set) + with open("tmp_file", "w", encoding="utf-8") as f: + f.write(argv[1]) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_bad.py b/binary_search_tool/test/switch_to_bad.py index 3a1ec84f..17061dd3 100755 --- a/binary_search_tool/test/switch_to_bad.py +++ b/binary_search_tool/test/switch_to_bad.py @@ -14,19 +14,19 @@ from binary_search_tool.test import common def Main(argv): - """Switch part of the objects file in working set to (possible) bad ones.""" - working_set = common.ReadWorkingSet() - objects_file = common.ReadObjectsFile() - object_index = common.ReadObjectIndex(argv[1]) + """Switch part of the objects file in working set to (possible) bad ones.""" + working_set = common.ReadWorkingSet() + objects_file = common.ReadObjectsFile() + object_index = common.ReadObjectIndex(argv[1]) - for oi in object_index: - working_set[oi] = objects_file[oi] + for oi in object_index: + working_set[oi] = objects_file[oi] - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_bad_noinc_prune.py b/binary_search_tool/test/switch_to_bad_noinc_prune.py index a390e9e2..dd57324f 100755 --- a/binary_search_tool/test/switch_to_bad_noinc_prune.py +++ b/binary_search_tool/test/switch_to_bad_noinc_prune.py @@ -27,21 +27,21 @@ from binary_search_tool.test import common def Main(argv): - """Switch part of the objects file in working set to (possible) bad ones.""" - working_set = common.ReadWorkingSet() - objects_file = common.ReadObjectsFile() - object_index = common.ReadObjectIndex(argv[1]) + """Switch part of the objects file in working set to (possible) bad ones.""" + working_set = common.ReadWorkingSet() + objects_file = common.ReadObjectsFile() + object_index = common.ReadObjectIndex(argv[1]) - for oi in object_index: - working_set[oi] = objects_file[oi] + for oi in object_index: + working_set[oi] = objects_file[oi] - shutil.copy(argv[1], './noinc_prune_bad') + shutil.copy(argv[1], "./noinc_prune_bad") - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_bad_set_file.py b/binary_search_tool/test/switch_to_bad_set_file.py index a0dbb67b..6a4f9131 100755 --- a/binary_search_tool/test/switch_to_bad_set_file.py +++ b/binary_search_tool/test/switch_to_bad_set_file.py @@ -19,24 +19,24 @@ from binary_search_tool.test import common def Main(_): - """Switch part of the objects file in working set to (possible) bad ones.""" - working_set = common.ReadWorkingSet() - objects_file = common.ReadObjectsFile() + """Switch part of the objects file in working set to (possible) bad ones.""" + working_set = common.ReadWorkingSet() + objects_file = common.ReadObjectsFile() - if not os.path.exists(os.environ['BISECT_BAD_SET']): - print('Bad set file does not exist!') - return 1 + if not os.path.exists(os.environ["BISECT_BAD_SET"]): + print("Bad set file does not exist!") + return 1 - object_index = common.ReadObjectIndex(os.environ['BISECT_BAD_SET']) + object_index = common.ReadObjectIndex(os.environ["BISECT_BAD_SET"]) - for oi in object_index: - working_set[int(oi)] = objects_file[oi] + for oi in object_index: + working_set[int(oi)] = objects_file[oi] - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_good.py b/binary_search_tool/test/switch_to_good.py index 50e0ddff..bcbe5c28 100755 --- a/binary_search_tool/test/switch_to_good.py +++ b/binary_search_tool/test/switch_to_good.py @@ -19,17 +19,17 @@ from binary_search_tool.test import common def Main(argv): - working_set = common.ReadWorkingSet() - object_index = common.ReadObjectIndex(argv[1]) + working_set = common.ReadWorkingSet() + object_index = common.ReadObjectIndex(argv[1]) - for oi in object_index: - working_set[int(oi)] = 0 + for oi in object_index: + working_set[int(oi)] = 0 - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_good_noinc_prune.py b/binary_search_tool/test/switch_to_good_noinc_prune.py index 5e00a634..37976668 100755 --- a/binary_search_tool/test/switch_to_good_noinc_prune.py +++ b/binary_search_tool/test/switch_to_good_noinc_prune.py @@ -27,19 +27,19 @@ from binary_search_tool.test import common def Main(argv): - working_set = common.ReadWorkingSet() - object_index = common.ReadObjectIndex(argv[1]) + working_set = common.ReadWorkingSet() + object_index = common.ReadObjectIndex(argv[1]) - for oi in object_index: - working_set[int(oi)] = 0 + for oi in object_index: + working_set[int(oi)] = 0 - shutil.copy(argv[1], './noinc_prune_good') + shutil.copy(argv[1], "./noinc_prune_good") - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/switch_to_good_set_file.py b/binary_search_tool/test/switch_to_good_set_file.py index cc884ddc..89b8bf17 100755 --- a/binary_search_tool/test/switch_to_good_set_file.py +++ b/binary_search_tool/test/switch_to_good_set_file.py @@ -23,22 +23,22 @@ from binary_search_tool.test import common def Main(_): - working_set = common.ReadWorkingSet() + working_set = common.ReadWorkingSet() - if not os.path.exists(os.environ['BISECT_GOOD_SET']): - print('Good set file does not exist!') - return 1 + if not os.path.exists(os.environ["BISECT_GOOD_SET"]): + print("Good set file does not exist!") + return 1 - object_index = common.ReadObjectIndex(os.environ['BISECT_GOOD_SET']) + object_index = common.ReadObjectIndex(os.environ["BISECT_GOOD_SET"]) - for oi in object_index: - working_set[int(oi)] = 0 + for oi in object_index: + working_set[int(oi)] = 0 - common.WriteWorkingSet(working_set) + common.WriteWorkingSet(working_set) - return 0 + return 0 -if __name__ == '__main__': - retval = Main(sys.argv) - sys.exit(retval) +if __name__ == "__main__": + retval = Main(sys.argv) + sys.exit(retval) diff --git a/binary_search_tool/test/test_setup.py b/binary_search_tool/test/test_setup.py index fa4743a7..4fe8c661 100755 --- a/binary_search_tool/test/test_setup.py +++ b/binary_search_tool/test/test_setup.py @@ -12,13 +12,13 @@ import sys def Main(): - # create ./is_setup - with open('./is_setup', 'w', encoding='utf-8'): - pass + # create ./is_setup + with open("./is_setup", "w", encoding="utf-8"): + pass - return 0 + return 0 -if __name__ == '__main__': - retval = Main() - sys.exit(retval) +if __name__ == "__main__": + retval = Main() + sys.exit(retval) diff --git a/binary_search_tool/test/test_setup_bad.py b/binary_search_tool/test/test_setup_bad.py index 1421009b..f34753bf 100755 --- a/binary_search_tool/test/test_setup_bad.py +++ b/binary_search_tool/test/test_setup_bad.py @@ -12,9 +12,9 @@ import sys def Main(): - return 1 ## False, flashing failure + return 1 ## False, flashing failure -if __name__ == '__main__': - retval = Main() - sys.exit(retval) +if __name__ == "__main__": + retval = Main() + sys.exit(retval) |