scripts/lib/verify_test_results.py (78 lines of code) (raw):

import sys import argparse def main(): parser = argparse.ArgumentParser() parser.add_argument("-f", "--file-name",default="", dest="file_name",help="Cyclonus results log file") parser.add_argument("-ip", "--ip-family",default="IPv4", dest="ip_family",help="IP Family of the cluster") args = parser.parse_args() # Cyclonus runs 112 test cases in total with each having some steps. Each step runs 81 probes in total across TCP, UDP and SCTP protocol # AWS Network Policy doesn't support all these combinations. We maintain a mapping of the test number and the number of # probes that are expected to pass on each testcase+step combination for IPv4 and IPv6 cluster. # For the test numbers not included in this map, it is expected that all the probes should be passing if args.ip_family == "IPv6": expected_results={ 2:{'Step 1': 80}, 3:{'Step 1': 80}, 8:{'Step 1': 80}, 12:{'Step 1': 64}, 23:{'Step 1': 80}, 25:{'Step 1': 80}, 26:{'Step 1': 80}, 28:{'Step 1': 80}, 29:{'Step 1': 80}, 31:{'Step 1': 50}, 32:{'Step 1': 64}, 98:{'Step 1': 79}, 102:{'Step 1': 71}, 104:{'Step 1': 71}, 106:{'Step 1': 71}, 108:{'Step 1': 71}, 111:{'Step 1': 79}, 112:{'Step 1': 80} } else: expected_results={ 2:{'Step 1': 80}, 3:{'Step 1': 80}, 8:{'Step 1': 80}, 12:{'Step 1': 80}, 23:{'Step 1': 80}, 25:{'Step 1': 80}, 26:{'Step 1': 80}, 28:{'Step 1': 80}, 29:{'Step 1': 80}, 31:{'Step 1': 50}, 32:{'Step 1': 64}, 98:{'Step 1': 80}, 111:{'Step 1': 80}, 112:{'Step 1': 80}} results = capture_results(args.file_name) verify_results(results,expected_results) def capture_results(file_name): results = {} rowbreak = False start_capture = False test_number = 0 with open(file_name, 'r') as filedata: for data in filedata: if start_capture: if len(data.strip()) == 0: break elif data.startswith("+---"): rowbreak = True else: keys = [x.strip() for x in data.split('|')] print(keys) if keys[1] == "TEST": continue elif rowbreak: if keys[2] in ["passed", "failed"]: test_number = int(keys[1].split(":")[0]) results[test_number] = {} else: # Capture all retries for a testcase+step combination to verify step = keys[3].split(",")[0] if step not in results[test_number]: results[test_number][step] = [] results[test_number][step].append([int(keys[4]),int(keys[5]),int(keys[6])]) rowbreak = False else: continue elif "SummaryTable:" in data: start_capture = True else: continue return results def verify_results(results,expected_results): is_test_run_failed = False for test_number in results.keys(): for step in results[test_number].keys(): is_test_case_failed = True expected_correct = 0 # Verifiying result from each retry for testcase+step for try_result in results[test_number][step]: count_failed, count_correct, count_ignored = try_result # Expected correct count by default for a testcase+step expected_correct = count_failed + count_correct + count_ignored if test_number in expected_results.keys(): if step in expected_results[test_number]: expected_correct = expected_results[test_number][step] # Check if the number of probes passed in testcase+step are as expected if count_correct >= expected_correct: print("Test Number:{test_number} | {step} | Passed -> Correct:{count_correct} Expected:{expected_correct}".format( test_number=test_number,step=step, count_correct=try_result[1],expected_correct=expected_correct )) is_test_case_failed = False break if is_test_case_failed: print("Test Number:{test_number} | {step} | Failed -> Try results: {probes} Expected:{expected_correct}".format( test_number=test_number,step=step, probes=results[test_number][step],expected_correct=expected_correct )) # Mark the entire test run as fail since atleast one test deviated from the expected results is_test_run_failed=True if is_test_run_failed or len(results) !=112: sys.exit(1) else: sys.exit(0) if __name__ == "__main__": main()