Skip to content

Commit dfcf937

Browse files
committed
fix supp_file check for aasx check_example_aas
The previous check on the supplementary file was broken, as it compared the sha256 value of the TestFile to itself. Introduced a new step which checks for presence and equality of supplementary file `/TestFile.pdf` in the AASX container. Refactored the core property checks to no longer use `assert` in combination with `try ... except AssertionError`.
1 parent 5fd041c commit dfcf937

2 files changed

Lines changed: 53 additions & 56 deletions

File tree

compliance_tool/aas_compliance_tool/compliance_check_aasx.py

Lines changed: 35 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ def check_aas_example(file_path: str, state_manager: ComplianceToolStateManager,
118118
state_manager.set_step_status(Status.NOT_EXECUTED)
119119
state_manager.add_step('Check if core properties are equal')
120120
state_manager.set_step_status(Status.NOT_EXECUTED)
121+
state_manager.add_step('Check if supplementary files are equal')
122+
state_manager.set_step_status(Status.NOT_EXECUTED)
121123
return
122124

123125
checker = AASDataChecker(raise_immediately=False, **kwargs)
@@ -130,6 +132,8 @@ def check_aas_example(file_path: str, state_manager: ComplianceToolStateManager,
130132
if state_manager.status in (Status.FAILED, Status.NOT_EXECUTED):
131133
state_manager.add_step('Check if core properties are equal')
132134
state_manager.set_step_status(Status.NOT_EXECUTED)
135+
state_manager.add_step('Check if supplementary files are equal')
136+
state_manager.set_step_status(Status.NOT_EXECUTED)
133137
return
134138

135139
state_manager.add_step('Check if core properties are equal')
@@ -145,60 +149,46 @@ def check_aas_example(file_path: str, state_manager: ComplianceToolStateManager,
145149
cp.title = "Test Title"
146150

147151
checker2 = DataChecker(raise_immediately=False)
148-
try:
149-
assert isinstance(cp_new.created, datetime.datetime)
150-
checker2.check(isinstance(cp_new.created, datetime.datetime), "core property created must be of type datetime",
151-
created=type(cp_new.created))
152-
duration = cp_new.created - cp.created
152+
if checker2.check(isinstance(cp_new.created, datetime.datetime), "core property created must be of type datetime",
153+
created=type(cp_new.created)):
154+
duration = cast(datetime.datetime, cp_new.created) - cp.created
153155
checker2.check(duration.microseconds < 20, "created must be {}".format(cp.created), created=cp_new.created)
154-
except AssertionError:
155-
checker2.check(isinstance(cp_new.created, datetime.datetime), "core property created must be of type datetime",
156-
created=type(cp_new.created))
157156

158157
checker2.check(cp_new.creator == cp.creator, "creator must be {}".format(cp.creator), creator=cp_new.creator)
159158
checker2.check(cp_new.description == cp.description, "description must be {}".format(cp.description),
160159
description=cp_new.description)
161160
checker2.check(cp_new.lastModifiedBy == cp.lastModifiedBy, "lastModifiedBy must be {}".format(cp.lastModifiedBy),
162161
lastModifiedBy=cp_new.lastModifiedBy)
163-
try:
164-
assert isinstance(cp_new.modified, datetime.datetime)
165-
checker2.check(isinstance(cp_new.modified, datetime.datetime), "modified bust be of type datetime",
166-
modified=type(cp_new.modified))
167-
duration = cp_new.modified - cp.modified
162+
163+
if checker2.check(isinstance(cp_new.modified, datetime.datetime), "modified must be of type datetime",
164+
modified=type(cp_new.modified)):
165+
duration = cast(datetime.datetime, cp_new.modified) - cp.modified
168166
checker2.check(duration.microseconds < 20, "modified must be {}".format(cp.modified), modified=cp_new.modified)
169-
except AssertionError:
170-
checker2.check(isinstance(cp_new.modified, datetime.datetime), "modified bust be of type datetime",
171-
modified=type(cp_new.modified))
167+
172168
checker2.check(cp_new.revision == cp.revision, "revision must be {}".format(cp.revision), revision=cp_new.revision)
173169
checker2.check(cp_new.version == cp.version, "version must be {}".format(cp.version), version=cp_new.version)
174170
checker2.check(cp_new.title == cp.title, "title must be {}".format(cp.title), title=cp_new.title)
175171

172+
state_manager.add_log_records_from_data_checker(checker2)
173+
176174
# Check if file in file object is the same
175+
state_manager.add_step('Check if supplementary files are equal')
176+
file_checker = DataChecker(raise_immediately=False)
177+
177178
list_of_id_shorts = ["ExampleSubmodelCollection", "ExampleFile"]
178179
identifiable = example_data.get_item("https://example.org/Test_Submodel")
179180
for id_short in list_of_id_shorts:
180181
identifiable = identifiable.get_referable(id_short)
181-
obj2 = identifiable_store.get_item("https://example.org/Test_Submodel")
182-
for id_short in list_of_id_shorts:
183-
obj2 = obj2.get_referable(id_short)
184-
try:
185-
sha_file = files.get_sha256(identifiable.value)
186-
except KeyError as error:
187-
state_manager.add_log_records_from_data_checker(checker2)
188-
logger.error(error)
189-
state_manager.set_step_status(Status.FAILED)
190-
return
182+
file_name = identifiable.value
183+
if file_checker.check(file_name in files, f"Supplementary File {file_name} must exist"):
184+
test_file_checksum = 'b18229b24a4ee92c6c2b6bc6a8018563b17472f1150d35d5a5945afeb447ed44'
185+
file_checker.check(
186+
files.get_sha256(file_name).hex() == test_file_checksum,
187+
f"Supplementary File {file_name} checksum must be '{test_file_checksum}'.",
188+
value=files.get_sha256(file_name)
189+
)
191190

192-
checker2.check(
193-
sha_file == files.get_sha256(obj2.value),
194-
"File of {} must be {}.".format(identifiable.value, obj2.value),
195-
value=obj2.value
196-
)
197-
state_manager.add_log_records_from_data_checker(checker2)
198-
if state_manager.status in (Status.FAILED, Status.NOT_EXECUTED):
199-
state_manager.set_step_status(Status.FAILED)
200-
else:
201-
state_manager.set_step_status(Status.SUCCESS)
191+
state_manager.add_log_records_from_data_checker(file_checker)
202192

203193

204194
def check_aasx_files_equivalence(file_path_1: str, file_path_2: str, state_manager: ComplianceToolStateManager,
@@ -283,21 +273,21 @@ def check_aasx_files_equivalence(file_path_1: str, file_path_2: str, state_manag
283273
file_checker = DataChecker(raise_immediately=False)
284274
for file_name in files_1:
285275
both_contain = file_checker.check(file_name in files_2,
286-
"second file must contain supplementary file {}".format(file_name))
276+
"second file must contain supplementary file {}".format(file_name))
287277
if both_contain:
288278
expected_type = files_1.get_content_type(file_name)
289279
file_checker.check(expected_type == files_2.get_content_type(file_name),
290-
"second file must contain supplementary file {} with content-type {}".format(file_name,
291-
expected_type),
292-
content_type=files_2.get_content_type(file_name))
280+
f"second file must contain supplementary file {file_name}"
281+
" with content-type {expected_type}",
282+
content_type=files_2.get_content_type(file_name))
293283
expected_checksum = files_1.get_sha256(file_name)
294284
file_checker.check(expected_checksum == files_2.get_sha256(file_name),
295-
"second file must contain supplementary file {} with sha256 {}".format(file_name,
296-
expected_checksum),
297-
checksum=files_2.get_sha256(file_name))
285+
f"second file must contain supplementary file {file_name}"
286+
f" with sha256 {expected_checksum.hex()}",
287+
checksum=files_2.get_sha256(file_name).hex())
298288

299289
for file_name in files_2:
300290
file_checker.check(file_name in files_1,
301-
"first file must contain supplementary file {}".format(file_name))
291+
"first file must contain supplementary file {}".format(file_name))
302292

303-
state_manager.add_log_records_from_data_checker(file_checker)
293+
state_manager.add_log_records_from_data_checker(file_checker)

compliance_tool/test/test_compliance_check_aasx.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ def test_check_aas_example_fail_on_open(self, mock_data_checker: mock.MagicMock,
6666
mock_aasx_reader.side_effect = ValueError("Test error!")
6767
compliance_tool.check_aas_example("", manager)
6868

69-
self.assertEqual(4, len(manager.steps))
69+
self.assertEqual(5, len(manager.steps))
7070
self.assertEqual(Status.FAILED, manager.steps[0].status)
7171
self.assertEqual(Status.NOT_EXECUTED, manager.steps[1].status)
7272
self.assertEqual(Status.NOT_EXECUTED, manager.steps[2].status)
7373
self.assertEqual(Status.NOT_EXECUTED, manager.steps[3].status)
74+
self.assertEqual(Status.NOT_EXECUTED, manager.steps[4].status)
7475

7576
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
7677
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -81,11 +82,12 @@ def test_check_aas_example_fail_on_read(self, mock_data_checker: mock.MagicMock,
8182
mock_aasx_reader.return_value.read_into.side_effect = ValueError("Test error!")
8283
compliance_tool.check_aas_example("", manager)
8384

84-
self.assertEqual(4, len(manager.steps))
85+
self.assertEqual(5, len(manager.steps))
8586
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
8687
self.assertEqual(Status.FAILED, manager.steps[1].status)
8788
self.assertEqual(Status.NOT_EXECUTED, manager.steps[2].status)
8889
self.assertEqual(Status.NOT_EXECUTED, manager.steps[3].status)
90+
self.assertEqual(Status.NOT_EXECUTED, manager.steps[4].status)
8991

9092
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
9193
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -97,12 +99,13 @@ def test_check_aas_example_fail_on_data_check(self, mock_data_checker: mock.Magi
9799
mock_data_checker.return_value.failed_checks = iter(mock_data_checker.return_value.checks)
98100
compliance_tool.check_aas_example("", manager)
99101

100-
self.assertEqual(4, len(manager.steps))
102+
self.assertEqual(5, len(manager.steps))
101103
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
102104
self.assertEqual(Status.SUCCESS, manager.steps[1].status)
103105
self.assertEqual(Status.FAILED, manager.steps[2].status)
104106
self.assertIn("Expected Behavior", manager.format_step(2, verbose_level=1))
105107
self.assertEqual(Status.NOT_EXECUTED, manager.steps[3].status)
108+
self.assertEqual(Status.NOT_EXECUTED, manager.steps[4].status)
106109

107110
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
108111
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -118,12 +121,13 @@ def test_check_aas_example_fail_on_core_properties(self, mock_data_checker: mock
118121
mock_aasx_reader.return_value.get_core_properties.return_value = wrong_cp
119122
compliance_tool.check_aas_example("", manager)
120123

121-
self.assertEqual(4, len(manager.steps))
124+
self.assertEqual(5, len(manager.steps))
122125
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
123126
self.assertEqual(Status.SUCCESS, manager.steps[1].status)
124127
self.assertEqual(Status.SUCCESS, manager.steps[2].status)
125128
self.assertEqual(Status.FAILED, manager.steps[3].status)
126129
self.assertIn("Wrong Creator", manager.format_step(3, verbose_level=1))
130+
self.assertEqual(Status.SUCCESS, manager.steps[4].status)
127131

128132
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
129133
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -137,12 +141,13 @@ def test_check_aas_example_fail_on_file_missing(self, mock_data_checker: mock.Ma
137141
mock_aasx_reader.return_value.get_core_properties.return_value = create_example_aas_core_properties()
138142
compliance_tool.check_aas_example("", manager)
139143

140-
self.assertEqual(4, len(manager.steps))
144+
self.assertEqual(5, len(manager.steps))
141145
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
142146
self.assertEqual(Status.SUCCESS, manager.steps[1].status)
143147
self.assertEqual(Status.SUCCESS, manager.steps[2].status)
144-
self.assertEqual(Status.FAILED, manager.steps[3].status)
145-
self.assertIn("/TestFile.pdf", manager.format_step(3, verbose_level=1))
148+
self.assertEqual(Status.SUCCESS, manager.steps[3].status)
149+
self.assertEqual(Status.FAILED, manager.steps[4].status)
150+
self.assertIn("/TestFile.pdf", manager.format_step(4, verbose_level=1))
146151

147152
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
148153
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -156,12 +161,13 @@ def test_check_aas_example_fail_on_file_check(self, mock_data_checker: mock.Magi
156161
mock_aasx_reader.return_value.get_core_properties.return_value = create_example_aas_core_properties()
157162
compliance_tool.check_aas_example("", manager)
158163

159-
self.assertEqual(4, len(manager.steps))
164+
self.assertEqual(5, len(manager.steps))
160165
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
161166
self.assertEqual(Status.SUCCESS, manager.steps[1].status)
162167
self.assertEqual(Status.SUCCESS, manager.steps[2].status)
163-
self.assertEqual(Status.FAILED, manager.steps[3].status)
164-
self.assertIn("/TestFile.pdf", manager.format_step(3, verbose_level=1))
168+
self.assertEqual(Status.SUCCESS, manager.steps[3].status)
169+
self.assertEqual(Status.FAILED, manager.steps[4].status)
170+
self.assertIn("/TestFile.pdf", manager.format_step(4, verbose_level=1))
165171

166172
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
167173
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)
@@ -175,11 +181,12 @@ def test_check_aas_example_success(self, mock_data_checker: mock.MagicMock,
175181
mock_data_checker.return_value.failed_checks = iter([])
176182
compliance_tool.check_aas_example("", manager)
177183

178-
self.assertEqual(4, len(manager.steps))
184+
self.assertEqual(5, len(manager.steps))
179185
self.assertEqual(Status.SUCCESS, manager.steps[0].status)
180186
self.assertEqual(Status.SUCCESS, manager.steps[1].status)
181187
self.assertEqual(Status.SUCCESS, manager.steps[2].status)
182188
self.assertEqual(Status.SUCCESS, manager.steps[3].status)
189+
self.assertEqual(Status.SUCCESS, manager.steps[4].status)
183190

184191
@mock.patch("basyx.aas.adapter.aasx.AASXReader", autospec=True)
185192
@mock.patch("aas_compliance_tool.compliance_check_aasx.AASDataChecker", autospec=True)

0 commit comments

Comments
 (0)