| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # 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. |
| |
| """Script to generate a list of object files. |
| |
| 0 represents a good object file. |
| 1 represents a bad object file. |
| """ |
| |
| |
| import argparse |
| import os |
| import random |
| import sys |
| |
| 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) |