per Intel policy to include file commit date using git cmd below. The policy does not apply to non-Intel (C) notices. git log --follow -C90% --format=%ad --date default <file> | tail -1 and then pull just the year from the result. Intel copyrights were not added to files where Intel either had no contribution ot the contribution lacked substance (ie license header updates, formatting changes, etc) Note that several files in this patch didn't end the license/(c) block with a blank comment line so these were added as the vast majority of files do have this last blank line. Simply there for consistency. Signed-off-by: paul luse <paul.e.luse@intel.com> Change-Id: I6cd3f18d1b469d5ef249d26ddb2923ca6b970bd4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15208 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
153 lines
5.4 KiB
Python
Executable File
153 lines
5.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (C) 2019 Intel Corporation
|
|
# All rights reserved.
|
|
#
|
|
|
|
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 = "<html>"
|
|
for suite_ver in results.keys():
|
|
html += """"<h2> WIN_SCSI_{ver} </h2>
|
|
<table bgcolor=\"#ffffff\" border=\"1px solid black;>\"""".format(ver=suite_ver)
|
|
|
|
# Print header
|
|
html += "<tr><th>Test name</th>"
|
|
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 += "<th>{disk}</th>".format(disk=disk)
|
|
html += "</tr>"
|
|
|
|
# Print results
|
|
for test in results[suite_ver].keys():
|
|
html += "<tr><td>{f_name}</td>".format(f_name=test)
|
|
for disk in disks_header:
|
|
try:
|
|
result = results[suite_ver][test][disk]
|
|
|
|
html += "<td"
|
|
if "PASS" in result:
|
|
html += " bgcolor=\"#99ff33\">"
|
|
else:
|
|
html += " bgcolor=\"#ff5050\">"
|
|
|
|
html += "<a href={file}>{result}</a>".format(result=result, file=os.path.join("./", disk, test))
|
|
html += "</td>"
|
|
|
|
except KeyError:
|
|
html += "<td bgcolor=\"#ffff99\"></br></td>"
|
|
html += "</tr>"
|
|
html += "</table></br>"
|
|
html += "</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)
|