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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#!/usr/bin/env python3
import io
import sys
import os
import re
import difflib
import subprocess
def assert_files_no_diff(a, b, ignore=None):
if ignore is None:
ignore = []
def filter_lines(lines):
filtered = []
for line in lines:
do_ignore = False
for pattern in ignore:
if re.search(pattern, line) is not None:
do_ignore = True
break
if not do_ignore:
filtered.append(line)
return filtered
with io.open(a, encoding="utf-8") as ah, \
io.open(b, encoding="utf-8") as bh:
result = difflib.unified_diff(
filter_lines(ah.readlines()),
filter_lines(bh.readlines()),
fromfile=a, tofile=b)
result = "".join(result)
if result:
raise AssertionError(result)
def assert_dirs_no_diff(a, b, ignore=None):
list_a = sorted(os.listdir(a))
list_b = sorted(os.listdir(b))
result = difflib.unified_diff(
[l + "\n" for l in list_a],
[l + "\n" for l in list_b],
fromfile=a, tofile=b)
result = "".join(result)
if result:
raise AssertionError(result)
for entry in list_a:
assert_files_no_diff(
os.path.join(a, entry),
os.path.join(b, entry),
ignore=ignore)
def assert_no_diff(a, b, ignore=None):
"""
Args:
a (str): file or directory
b (str): file or directory
ignore (list): a list of regexes for lines in files to ignore
"""
if os.path.isdir(a) != os.path.isdir(b):
raise AssertionError
if os.path.isdir(a):
assert_dirs_no_diff(a, b, ignore=ignore)
else:
assert_files_no_diff(a, b, ignore=ignore)
def main(argv):
if len(argv) != 2:
raise SystemError("exactly one arg, not %r" % argv[1:])
targetname = argv[1]
targetbase = os.path.basename(targetname)
srcdir = os.environ.get("srcdir", "")
builddir = os.environ.get("builddir", "")
if targetname.endswith(".typelib"):
# Do nothing for typelibs, this just ensures they build as part of
# the tests
if not os.path.exists(targetname):
raise SystemError("%s does not exist" % targetname)
elif targetname.endswith(".gir"):
# The "shared-library" field of the GIR is platform-dependent.
# For example, on OSX, shared libraries have the extension .dylib.
# Ignore this field when determining whether the output succeeded.
ignore = [r'shared-library=".*"$']
expected = os.path.join(
srcdir, os.path.splitext(targetbase)[0] + "-expected.gir")
actual = os.path.join(builddir, targetname)
assert_no_diff(expected, actual, ignore=ignore)
elif targetname.rsplit("-")[-1] in ("C", "Python", "Gjs"):
expected = os.path.join(srcdir, targetbase + "-expected")
actual = os.path.join(builddir, targetbase)
assert_no_diff(expected, actual, ignore=[r'^\s*$'])
elif targetname.endswith("-sections.txt"):
expected = os.path.join(
srcdir, os.path.splitext(targetname)[0] + "-expected.txt")
actual = os.path.join(builddir, targetname)
assert_no_diff(expected, actual, ignore=[r'^\s*$'])
elif targetname.endswith(".py"):
env = os.environ.copy()
env["PYTHONPATH"] = os.pathsep.join(
filter(
None,
[os.environ.get("top_builddir"),
os.environ.get("top_srcdir"),
os.environ.get("PYTHONPATH")]))
subprocess.check_call([env["PYTHON"], targetname], env=env)
else:
raise SystemError("Unknown file type: %s" % targetbase)
if __name__ == "__main__":
sys.exit(main(sys.argv))
|