| ############################################################################ |
| # Copyright (C) SchedMD LLC. |
| ############################################################################ |
| import argparse |
| import re |
| from collections import OrderedDict |
| |
| |
| def get_args(argv=None): |
| parser = argparse.ArgumentParser(prog="app", description="host", epilog="") |
| |
| # TODO add number of recursions, continue, prompt before start |
| |
| parser.add_argument( |
| "-i", |
| "--include", |
| dest="include", |
| default="unit, expect, python", |
| type=str, |
| # help="include these tests", |
| ) |
| |
| parser.add_argument( |
| "-e", |
| "--exclude", |
| dest="exclude", |
| default="", |
| type=str, |
| help="exclude these tests", |
| ) |
| |
| parser.add_argument( |
| "-o", |
| "--output", |
| dest="output_dir", |
| type=str, |
| help="where you'd like the logs stored (supply absolute path)", |
| ) |
| |
| parser.add_argument( |
| "-r", |
| "--resume", |
| dest="resume", |
| default=False, |
| action="store_true", |
| help="resume from the last run", |
| ) |
| |
| parser.add_argument( |
| "-R", |
| "--reset", |
| dest="reset", |
| default=False, |
| action="store_true", |
| help="reset the local db", |
| ) |
| |
| return parser.parse_args() |
| |
| |
| def test_parser(value, unit_tests_list): |
| """Function for parsing suite / test lists from args |
| |
| Takes a string of suites and / or tests and returns a unique list |
| to be used lated. |
| |
| If a whole suite is chosen (ie 'expect') and individual tests within |
| that suite are chosen as well, the whole suite wins out rather than doing the |
| suite (with that test in it) and that test again in isolation. |
| |
| Some examples of exceptable options are: |
| |
| '1.5' |
| 'test9.8' |
| '2.6 test3.1 14.2' |
| '3.4,6.7,8.3' |
| '1.*' |
| '*.2' |
| '1.*,3.8,9.2' |
| 'expect,unit,python,1.1,111_1,1.*' -> 'expect,unit,python' |
| """ |
| |
| result = OrderedDict() |
| result["slurm_unit"] = [] |
| result["expect"] = [] |
| result["python"] = [] |
| |
| # Remove commas |
| value = value.replace(",", " ") |
| |
| # Split the suites (if any) and remove from value string |
| suite_re = re.compile(r"\bunit\b | \bexpect\b | \bpython\b", flags=re.I | re.X) |
| chosen_suites = [] |
| if suites := list(set(suite_re.findall(value))): |
| for suite in suites: |
| out_val = suite |
| |
| # Rename unit suite to slurm_unit to use later |
| # (so it matches the dir structure) |
| if suite == "unit": |
| out_val = "slurm_unit" |
| result["slurm_unit"] = [] |
| |
| result[out_val].append("all") |
| chosen_suites.append(suite) |
| value = value.replace(suite, "").strip() |
| |
| # Split the user's option string into a series of tuples that represent |
| # each test, and add each tuple to the destination array. |
| if len(value) > 0: |
| test_re = re.compile(r"(?=test)?(\d+|\*)(\.|_)(\d+|\*).*$") |
| splitter = re.compile(r"[,\s]+") |
| val = splitter.split(value) |
| |
| for v in val: |
| matches = test_re.findall(v) |
| |
| if len(matches) > 0: |
| m = matches[0] |
| |
| # expect tests: |
| if m[1] == ".": |
| if "expect" not in chosen_suites: |
| result["expect"].append(f"expect/test{''.join(m)}") |
| |
| # python tests: |
| if m[1] == "_": |
| if "python" not in chosen_suites: |
| result["python"].append(f"python/tests/test_{''.join(m)}.py") |
| |
| value = value.replace(v, "") |
| |
| # Handle individual unit tests that may exists |
| if len(value) > 0 and "slurm_unit" not in chosen_suites: |
| val = splitter.split(value) |
| |
| for unit_test_name in val: |
| if len(unit_test_name) > 0: |
| for unit_test_path in unit_tests_list: |
| if unit_test_name in unit_test_path: |
| result["slurm_unit"].append(unit_test_path) |
| |
| # Remove duplicates |
| for k, v in result.items(): |
| result[k] = list(set(v)) |
| |
| return result |