summaryrefslogtreecommitdiff
path: root/tests/test_dist.py
blob: 197d12de7af55fac5d5a533761d78c6e404473f9 (plain)
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
123
124
125
126
127
128
# Copyright (C) 2013 Red Hat, Inc.
#
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.

import glob
import subprocess
import xml.etree.ElementTree as ET


def test_validate_po_files():
    """
    Validate that po translations don't mess up python format strings,
    which has broken the app in the past:
    https://bugzilla.redhat.com/show_bug.cgi?id=1350185
    https://bugzilla.redhat.com/show_bug.cgi?id=1433800
    """
    failures = []
    for pofile in glob.glob("po/*.po"):
        proc = subprocess.Popen(["msgfmt", "--output-file=/dev/null",
            "--check", pofile],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        ignore, stderr = proc.communicate()
        if proc.wait():
            failures.append("%s: %s" % (pofile, stderr))

    if not failures:
        return

    msg = "The following po files have errors:\n"
    msg += "\n".join(failures)
    raise AssertionError(msg)


def test_validate_pot_strings():
    """
    Validate that xgettext via `setup.py extract_messages` don't print
    any warnings
    """
    potfile = "po/virt-manager.pot"
    origpot = open(potfile).read()
    try:
        out = subprocess.check_output(
                ["./setup.py", "extract_messages"],
                stderr=subprocess.STDOUT)
        warnings = [l for l in out.decode("utf-8").splitlines()
                    if "warning:" in l]
        warnings = [w for w in warnings
                    if "a fallback ITS rule file" not in w]
        if warnings:
            raise AssertionError("xgettext has warnings:\n\n%s" %
                    "\n".join(warnings))
    finally:
        open(potfile, "w").write(origpot)


def test_ui_minimum_version():
    """
    Ensure all glade XML files don't _require_ UI bits later than
    our minimum supported version
    """
    # Minimum dep is 3.22 to fix popups on some wayland window managers.
    # 3.22 is from Sep 2016, so coupled with python3 deps this seems fine
    # to enforce
    minimum_version_major = 3
    minimum_version_minor = 22
    minimum_version_str = "%s.%s" % (minimum_version_major,
                                     minimum_version_minor)

    failures = []
    for filename in glob.glob("ui/*.ui"):
        required_version = None
        for line in open(filename).readlines():
            # This is much faster than XML parsing the whole file
            if not line.strip().startswith('<requires '):
                continue

            req = ET.fromstring(line)
            if (req.tag != "requires" or
                req.attrib.get("lib") != "gtk+"):
                continue
            required_version = req.attrib["version"]

        if required_version is None:
            raise AssertionError("ui file=%s doesn't have a <requires> "
                "tag for gtk+")

        if (int(required_version.split(".")[0]) != minimum_version_major or
            int(required_version.split(".")[1]) != minimum_version_minor):
            failures.append((filename, required_version))

    if not failures:
        return

    err = ("The following files should require version of gtk-%s:\n" %
        minimum_version_str)
    err += "\n".join([("%s version=%s" % tup) for tup in failures])
    raise AssertionError(err)


def test_ui_translatable_atknames():
    """
    We only use accessible names for uitests, they shouldn't be
    marked as translatable
    """
    failures = []
    atkstr = "AtkObject::accessible-name"
    for filename in glob.glob("ui/*.ui"):
        for line in open(filename).readlines():
            if atkstr not in line:
                continue
            if "translatable=" in line:
                failures.append(filename)
                break

    if not failures:
        return
    err = "Some files incorrectly have translatable ATK names.\n"
    err += "Run this command to fix:\n\n"
    err += ("""sed -i -e 's/%s" translatable="yes"/%s"/g' """ %
            (atkstr, atkstr))
    err += " ".join(failures)
    raise AssertionError(err)


def test_appstream_validate():
    subprocess.check_call(["appstream-util", "validate",
        "data/virt-manager.appdata.xml.in"])