69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
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.")
|