X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e85fdc5e3b4e74c39e0255980cc7c15c1759c276..c4c82977e0a105cdf7b04010ddd21bbf15dced4d:/teshsuite/smpi/MBI/MBIutils.py diff --git a/teshsuite/smpi/MBI/MBIutils.py b/teshsuite/smpi/MBI/MBIutils.py index 33255f9e73..9a7d837293 100644 --- a/teshsuite/smpi/MBI/MBIutils.py +++ b/teshsuite/smpi/MBI/MBIutils.py @@ -33,7 +33,7 @@ class AbstractTool: """ # pass - def run(execcmd, filename, binary, num_id, timeout): + def run(self, execcmd, filename, binary, num_id, timeout, batchinfo): """Compile that test code and anaylse it with the Tool if needed (a cache system should be used)""" # pass @@ -57,6 +57,7 @@ possible_details = { # 'OutOfInitFini':'BInitFini', 'CommunicatorLeak':'BResLeak', 'DatatypeLeak':'BResLeak', 'GroupLeak':'BResLeak', 'OperatorLeak':'BResLeak', 'TypeLeak':'BResLeak', 'RequestLeak':'BResLeak', 'MissingStart':'BReqLifecycle', 'MissingWait':'BReqLifecycle', + 'MissingEpoch':'BEpochLifecycle','DoubleEpoch':'BEpochLifecycle', 'LocalConcurrency':'BLocalConcurrency', # scope: communicator 'CallMatching':'DMatch', @@ -66,6 +67,9 @@ possible_details = { 'GlobalConcurrency':'DGlobalConcurrency', # larger scope 'BufferingHazard':'EBufferingHazard', + # Input Hazard + 'IHCallMatching':'InputHazard', + 'OK':'FOK'} error_scope = { @@ -73,6 +77,7 @@ error_scope = { 'BResLeak':'single process', # 'BInitFini':'single process', 'BReqLifecycle':'single process', + 'BEpochLifecycle':'single process', 'BLocalConcurrency':'single process', 'CMatch':'multi-processes', 'DRace':'multi-processes', @@ -119,8 +124,8 @@ def parse_one_code(filename): state = 2 else: raise ValueError(f"Unexpected end of MBI_TESTS header at line {line_num}: \n{line}") - if state == 1 and re.match("\s+\$ ?.*", line): - m = re.match('\s+\$ ?(.*)', line) + if state == 1 and re.match(r'\s+\$ ?.*', line): + m = re.match(r'\s+\$ ?(.*)', line) cmd = m.group(1) nextline = next(input_file) detail = 'OK' @@ -136,7 +141,14 @@ def parse_one_code(filename): if detail not in possible_details: raise ValueError( f"\n{filename}:{line_num}: MBI parse error: Detailled outcome {detail} is not one of the allowed ones.") - test = {'filename': filename, 'id': test_num, 'cmd': cmd, 'expect': expect, 'detail': detail} + + nextline = next(input_file) + m = re.match('[ |]*(.*)', nextline) + if not m: + raise ValueError(f"\n{filename}:{line_num}: MBI parse error: Expected diagnostic of the test not found.\n") + diagnostic = m.group(1) + + test = {'filename': filename, 'id': test_num, 'cmd': cmd, 'expect': expect, 'detail': detail, 'diagnostic': diagnostic} res.append(test.copy()) test_num += 1 line_num += 1 @@ -166,32 +178,32 @@ def categorize(tool, toolname, test_id, expected): if outcome == 'timeout': res_category = 'timeout' if elapsed is None: - diagnostic = f'hard timeout' + diagnostic = 'hard timeout' else: diagnostic = f'timeout after {elapsed} sec' elif outcome == 'failure' or outcome == 'segfault': res_category = 'failure' - diagnostic = f'tool error, or test not run' + diagnostic = 'tool error, or test not run' elif outcome == 'UNIMPLEMENTED': res_category = 'unimplemented' - diagnostic = f'coverage issue' + diagnostic = 'coverage issue' elif outcome == 'other': res_category = 'other' - diagnostic = f'inconclusive run' + diagnostic = 'inconclusive run' elif expected == 'OK': if outcome == 'OK': res_category = 'TRUE_NEG' - diagnostic = f'correctly reported no error' + diagnostic = 'correctly reported no error' else: res_category = 'FALSE_POS' - diagnostic = f'reported an error in a correct code' + diagnostic = 'reported an error in a correct code' elif expected == 'ERROR': if outcome == 'OK': res_category = 'FALSE_NEG' - diagnostic = f'failed to detect an error' + diagnostic = 'failed to detect an error' else: res_category = 'TRUE_POS' - diagnostic = f'correctly detected an error' + diagnostic = 'correctly detected an error' else: raise ValueError(f"Unexpected expectation: {expected} (must be OK or ERROR)") @@ -235,7 +247,7 @@ def run_cmd(buildcmd, execcmd, cachefile, filename, binary, timeout, batchinfo, output = f"Compiling {binary}.c (batchinfo:{batchinfo})\n\n" output += f"$ {buildcmd}\n" - compil = subprocess.run(buildcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + compil = subprocess.run(buildcmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if compil.stdout is not None: output += str(compil.stdout, errors='replace') if compil.returncode != 0: @@ -260,7 +272,6 @@ def run_cmd(buildcmd, execcmd, cachefile, filename, binary, timeout, batchinfo, pid = process.pid pgid = os.getpgid(pid) # We need that to forcefully kill subprocesses when leaving - outcome = None while True: if poll_obj.poll(5): # Something to read? Do check the timeout status every 5 sec if not line = process.stdout.readline() @@ -271,7 +282,6 @@ def run_cmd(buildcmd, execcmd, cachefile, filename, binary, timeout, batchinfo, if read_line_lambda != None: read_line_lambda(line, process) if time.time() - start_time > timeout: - outcome = 'timeout' with open(f'{cachefile}.timeout', 'w') as outfile: outfile.write(f'{time.time() - start_time} seconds') break