#!/usr/bin/env python3 import os import sys import re import pprint import collections os.chdir(os.path.join(os.path.dirname(sys.argv[0]), "results")) scsi_logs = filter(lambda x: x.endswith(".log"), os.listdir("./")) scsi_1_pattern = re.compile(r"(ASSERTION\s[1-9][\d+]?\.\d+\s)(.+\s)([\w\W]+?)(Result:\s)(\w+)", re.I | re.M) scsi_2_pattern = re.compile(r"(?:Start:\s)(ASSERTION:\s)?(.+)(?:,.+=\s)([\w\W]+?)(End:\s)(\w+)(,.*)", re.I | re.M) fails = [] warns = [] expected_warns = [ "MODE_SELECT_6_MODE_SENSE_6_Checking_Parameters_Savable_PS_bit", "MODE_SELECT_10_MODE_SENSE_10_Checking_Parameters_Savable_PS_bit", "MODE_SELECT_10_Changing_WCE", "MODE_SELECT_10_MODE_SENSE_10_Checking_that_WCE_has_been_cleared", "MODE_SELECT_10_MODE_SENSE_10_Checking_that_Saved_Values_have_changed", "MODE_SELECT_10_setting_WCE", "MODE_SELECT_10_MODE_SENSE_10_Checking_that_WCE_has_been_set", "MODE_SELECT_10_Attempting_to_restore_original_values", "MODE_SELECT_10_MODE_SENSE_10_Verifying_values_were_restored", "ASSERTION_VERIFY_16_Support_Test", ] expected_fails = [ "ASSERTION_READ_6_Read-With-Disk-Cache-Cleared_Test", "ASSERTION_READ_10_Read-With-Disk-Cache-Cleared_Test", "ASSERTION_READ_16_Read-With-Disk-Cache-Cleared_Test", "ASSERTION_INQUIRY_Checking_Identification_Descriptors_in_VPD_page_0x83", "ASSERTION_VERIFY_10_Support_Test", ] results = {"1": collections.OrderedDict(), "2": collections.OrderedDict()} for log in scsi_logs: # Choose regex pattern depending on tests version pattern = scsi_1_pattern if "WIN_SCSI_1" in log else scsi_2_pattern # Read log file contents try: with open(log, 'r') as fh: fh = open(log, 'r') log_text = fh.read() # Dir name for saving split result files of currently processed log file d_name = log.split(".")[0] try: os.mkdir(d_name) except OSError: pass except IOError as e: print("ERROR: While opening log file: {log_file}".format(log_file=log)) exit(1) # Parse log file contents matches_found = re.findall(pattern, log_text) if len(matches_found) < 1: print("ERROR: No results found in file {log_file}!".format(log_file=log)) exit(1) # Go through output for each test from log file; parse and save to dict for m in matches_found: test_name = re.sub(r"\s+", "_", (m[0] + m[1]).strip()) test_name = re.sub(r"[():]", "", test_name) test_name = test_name[0:-1] if "." in test_name[-1] else test_name tc_result = m[4].upper() if "FAIL" in tc_result.upper(): fails.append([log, test_name, tc_result]) elif "WARN" in tc_result.upper(): warns.append([log, test_name, tc_result]) # Save output to separate file with open(os.path.join("./", d_name, test_name), 'w') as fh: for line in m: fh.write(line) # Also save in dictionary for later use in generating HTML results summary ver = "1" if "WIN_SCSI_1" in log else "2" try: results[ver][test_name][d_name] = tc_result except KeyError: results[ver][test_name] = collections.OrderedDict() results[ver][test_name][d_name] = tc_result # Generate HTML file with results table with open(os.path.join("./", "results.html"), 'a') as fh: html = "" for suite_ver in results.keys(): html += """"

WIN_SCSI_{ver}

\"""".format(ver=suite_ver) # Print header html += "" disks_header = set() for _ in results[suite_ver].keys(): for disk in results[suite_ver][_].keys(): disks_header.add(disk) for disk in disks_header: html += "".format(disk=disk) html += "" # Print results for test in results[suite_ver].keys(): html += "".format(f_name=test) for disk in disks_header: try: result = results[suite_ver][test][disk] html += "" else: html += " bgcolor=\"#ff5050\">" html += "{result}".format(result=result, file=os.path.join("./", disk, test)) html += "" except KeyError: html += "" html += "" html += "
Test name{disk}
{f_name}

" html += "" fh.write(html) if warns: not_expected_warns = [w for w in warns if w[1] not in expected_warns and "WIN_SCSI_2" in w[0]] print("INFO: Windows SCSI compliance warnings:") pprint.pprint(warns, width=150) if fails: not_expected_fails = [f for f in fails if f[1] not in expected_fails and "WIN_SCSI_2" in f[0]] print("INFO: Windows SCSI compliance fails:") pprint.pprint(fails, width=150) if not_expected_warns or not_expected_fails: print("Not expected fails / warnings:") pprint.pprint(not_expected_warns, width=150) pprint.pprint(not_expected_fails, width=150) exit(1)