forked from keylime/keylime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
64 lines (46 loc) · 1.86 KB
/
Copy pathutils.py
File metadata and controls
64 lines (46 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import sys
import unittest
from io import StringIO
from keylime.policy import logger
def assertDigestsEqual(d1, d2):
# Ensuring we have only unique values in the digest lists.
d1_unique = {k: sorted(list(set(v))) for k, v in d1.items()}
d2_unique = {k: sorted(list(set(v))) for k, v in d2.items()}
unittest.TestCase().assertEqual(len(d1_unique), len(d2_unique), msg="number of files must match")
for file in d1_unique:
unittest.TestCase().assertTrue(file in d2_unique)
unittest.TestCase().assertEqual(
len(d1_unique[file]),
len(d2_unique[file]),
msg=f"number of files/digests for {file}",
)
for d in d1_unique[file]:
unittest.TestCase().assertTrue(d in d2_unique[file], msg=f"file={file} digest={d}")
# keylime policy logging.
class _KeylimePolicyAssertLogsContext:
"""A context manager for assertLogs() and assertNoLogs()"""
def __init__(self, no_logs):
self.logger = logger.Logger(verbose=True)
self.no_logs = no_logs
self.stderr = StringIO()
def __enter__(self):
self.logger.setStream(self.stderr)
return self.stderr
def __exit__(self, exc_type, exc_value, _tb):
self.logger.setStream(sys.stderr)
if exc_type is not None:
# Let unexpected exceptions pass through.
return False
logs = "\n".join(self.stderr.getvalue())
if self.no_logs:
# assertNoLogs
if len(logs) > 0:
raise ValueError(f"Unexpected logs found: {logs}")
else:
if len(logs) == 0:
raise ValueError("No logs triggered on keylime-policy")
return True
def keylimePolicyAssertNoLogs():
return _KeylimePolicyAssertLogsContext(no_logs=True)
def keylimePolicyAssertLogs():
return _KeylimePolicyAssertLogsContext(no_logs=False)