cert_audit: Clarify the abstraction of Auditor
Signed-off-by: Pengyu Lv <pengyu.lv@arm.com>
diff --git a/tests/scripts/audit-validity-dates.py b/tests/scripts/audit-validity-dates.py
index ea67959..1517bab 100755
--- a/tests/scripts/audit-validity-dates.py
+++ b/tests/scripts/audit-validity-dates.py
@@ -173,10 +173,25 @@
class Auditor:
- """A base class for audit."""
+ """
+ A base class that uses X509Parser to parse files to a list of AuditData.
+
+ A subclass must implement the following methods:
+ - collect_default_files: Return a list of file names that are defaultly
+ used for parsing (auditing). The list will be stored in
+ Auditor.default_files.
+ - parse_file: Method that parses a single file to a list of AuditData.
+
+ A subclass may override the following methods:
+ - parse_bytes: Defaultly, it parses `bytes` that contains only one valid
+ X.509 data(DER/PEM format) to an X.509 object.
+ - walk_all: Defaultly, it iterates over all the files in the provided
+ file name list, calls `parse_file` for each file and stores the results
+ by extending Auditor.audit_data.
+ """
def __init__(self, logger):
self.logger = logger
- self.default_files = [] # type: typing.List[str]
+ self.default_files = self.collect_default_files()
# A list to store the parsed audit_data.
self.audit_data = [] # type: typing.List[AuditData]
self.parser = X509Parser({
@@ -194,6 +209,10 @@
},
})
+ def collect_default_files(self) -> typing.List[str]:
+ """Collect the default files for parsing."""
+ raise NotImplementedError
+
def parse_file(self, filename: str) -> typing.List[AuditData]:
"""
Parse a list of AuditData from file.
@@ -201,14 +220,7 @@
:param filename: name of the file to parse.
:return list of AuditData parsed from the file.
"""
- with open(filename, 'rb') as f:
- data = f.read()
- result = self.parse_bytes(data)
- if result is not None:
- result.location = filename
- return [result]
- else:
- return []
+ raise NotImplementedError
def parse_bytes(self, data: bytes):
"""Parse AuditData from bytes."""
@@ -240,19 +252,32 @@
class TestDataAuditor(Auditor):
- """Class for auditing files in tests/data_files/"""
- def __init__(self, verbose):
- super().__init__(verbose)
- self.default_files = self.collect_default_files()
+ """Class for auditing files in `tests/data_files/`"""
def collect_default_files(self):
- """Collect all files in tests/data_files/"""
+ """Collect all files in `tests/data_files/`"""
test_dir = self.find_test_dir()
test_data_glob = os.path.join(test_dir, 'data_files/**')
data_files = [f for f in glob.glob(test_data_glob, recursive=True)
if os.path.isfile(f)]
return data_files
+ def parse_file(self, filename: str) -> typing.List[AuditData]:
+ """
+ Parse a list of AuditData from data file.
+
+ :param filename: name of the file to parse.
+ :return list of AuditData parsed from the file.
+ """
+ with open(filename, 'rb') as f:
+ data = f.read()
+ result = self.parse_bytes(data)
+ if result is not None:
+ result.location = filename
+ return [result]
+ else:
+ return []
+
def parse_suite_data(data_f):
"""
@@ -280,13 +305,10 @@
class SuiteDataAuditor(Auditor):
- """Class for auditing files in tests/suites/*.data"""
- def __init__(self, options):
- super().__init__(options)
- self.default_files = self.collect_default_files()
+ """Class for auditing files in `tests/suites/*.data`"""
def collect_default_files(self):
- """Collect all files in tests/suites/*.data"""
+ """Collect all files in `tests/suites/*.data`"""
test_dir = self.find_test_dir()
suites_data_folder = os.path.join(test_dir, 'suites')
data_files = glob.glob(os.path.join(suites_data_folder, '*.data'))
@@ -294,7 +316,7 @@
def parse_file(self, filename: str):
"""
- Parse a list of AuditData from file.
+ Parse a list of AuditData from test suite data file.
:param filename: name of the file to parse.
:return list of AuditData parsed from the file.