cert_audit: Support audit on test suite data files

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 67d4096..0d1425b 100755
--- a/tests/scripts/audit-validity-dates.py
+++ b/tests/scripts/audit-validity-dates.py
@@ -29,6 +29,7 @@
 import types
 import argparse
 import datetime
+import glob
 from enum import Enum
 
 from cryptography import x509
@@ -226,7 +227,7 @@
         self.default_files = self.collect_default_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_folder = os.path.join(test_dir, 'data_files')
         data_files = []
@@ -235,6 +236,38 @@
                               for file_name in file_names)
         return data_files
 
+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()
+
+    def collect_default_files(self):
+        """Collect all files in tests/suites/*.data"""
+        test_dir = self.find_test_dir()
+        suites_data_folder = os.path.join(test_dir, 'suites')
+        # collect all data files in tests/suites (114 in total)
+        data_files = glob.glob(os.path.join(suites_data_folder, '*.data'))
+        return data_files
+
+    def parse_file(self, filename: str):
+        """Parse AuditData from file."""
+        with open(filename, 'r') as f:
+            data = f.read()
+        audit_data_list = []
+        # extract hex strings from the data file.
+        hex_strings = re.findall(r'"(?P<data>[0-9a-fA-F]+)"', data)
+        for hex_str in hex_strings:
+            # We regard hex string with odd number length as invaild data.
+            if len(hex_str) & 1:
+                continue
+            bytes_data = bytes.fromhex(hex_str)
+            audit_data = self.parse_bytes(bytes_data)
+            if audit_data is None:
+                continue
+            audit_data.filename = filename
+            audit_data_list.append(audit_data)
+        return audit_data_list
 
 def list_all(audit_data: AuditData):
     print("{}\t{}\t{}\t{}".format(
@@ -265,16 +298,24 @@
 
     # start main routine
     td_auditor = TestDataAuditor(args.verbose)
+    sd_auditor = SuiteDataAuditor(args.verbose)
 
     if args.file:
         data_files = [args.file]
+        suite_data_files = [args.file]
     else:
         data_files = td_auditor.default_files
+        suite_data_files = sd_auditor.default_files
 
     td_auditor.walk_all(data_files)
+    # TODO: Improve the method for auditing test suite data files
+    #       It takes 6 times longer than td_auditor.walk_all(),
+    #       typically 0.827 s VS 0.147 s.
+    sd_auditor.walk_all(suite_data_files)
 
     if args.all:
         td_auditor.for_each(list_all)
+        sd_auditor.for_each(list_all)
 
     print("\nDone!\n")