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
65
66
67
68
69
|
from difflib import unified_diff
import os
import sys
from conf import hook
from exc.test_failed import TestFailed
""" Post-Test Hook: ExpectedFiles
This is a Post-Test hook that checks the test directory for the files it
contains. A dictionary object is passed to it, which contains a mapping of
filenames and contents of all the files that the directory is expected to
contain.
Raises a TestFailed exception if the expected files are not found or if extra
files are found, else returns gracefully.
"""
@hook()
class ExpectedFiles:
def __init__(self, expected_fs):
self.expected_fs = expected_fs
@staticmethod
def gen_local_fs_snapshot():
snapshot = {}
for parent, dirs, files in os.walk("."):
for name in files:
# pubring.gpg, pubring.kbx, common.conf, dirmngr.conf, gpg.conf will be created by libgpgme
# if $HOME doesn't contain the .gnupg directory.
# setting $HOME to CWD (in base_test.py) breaks two Metalink tests, so we skip this file here.
if name in [
"pubring.gpg",
"pubring.kbx",
"common.conf",
"dirmngr.conf",
"gpg.conf",
]:
continue
f = {"content": ""}
file_path = os.path.join(parent, name)
with open(file_path) as fp:
f["content"] = fp.read()
snapshot[file_path[2:]] = f
return snapshot
def __call__(self, test_obj):
local_fs = self.gen_local_fs_snapshot()
for file in self.expected_fs:
if file.name in local_fs:
local_file = local_fs.pop(file.name)
formatted_content = test_obj._replace_substring(file.content)
if formatted_content != local_file["content"]:
diff = "".join(
unified_diff(
local_file["content"].splitlines(1),
formatted_content.splitlines(1),
fromfile="Actual",
tofile="Expected",
)
)
print(diff, file=sys.stderr)
raise TestFailed("Contents of %s do not match" % file.name)
else:
raise TestFailed("Expected file %s not found." % file.name)
if local_fs:
print(local_fs)
raise TestFailed("Extra files downloaded.")
|