summaryrefslogtreecommitdiffstats
path: root/testenv/conf/expected_files.py
diff options
context:
space:
mode:
Diffstat (limited to 'testenv/conf/expected_files.py')
-rw-r--r--testenv/conf/expected_files.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/testenv/conf/expected_files.py b/testenv/conf/expected_files.py
new file mode 100644
index 0000000..65adb70
--- /dev/null
+++ b/testenv/conf/expected_files.py
@@ -0,0 +1,58 @@
+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, 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', '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']:
+ for line in unified_diff(local_file['content'],
+ formatted_content,
+ fromfile='Actual',
+ tofile='Expected'):
+ print(line, 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.')