aboutsummaryrefslogtreecommitdiff
path: root/dep/tests/test_dep.py
blob: 5c877c4d601d7bde94fad580a97da39ec5ebcc46 (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
129
130
131
132
133
134
"""Test deps.

Testing adds more requirements, as we use Pytest. That is not needed for running though.

"""
import json
import os
import sys
import pytest

import dep
from dep import Line, Brew, Version, MissingDependencyError, ConMan, HostOSVersion

here = os.path.dirname(os.path.realpath(__file__))


def test_simple_brew():
    """End-to-end test of a simple brew dependency."""
    dep.parse_dependencies(['./tests/Dependencies0'])


def test_main():
    """End-to-end test of larger dependency file."""
    sys.argv = ['/bin/deps', 'verify', './tests/Dependencies1']
    with pytest.raises(dep.MalformedDependency):
        dep.main()


def test_brew_cmake_requirement(mocker):
    """Detailed check of a brew cmake dependency."""
    line = Line("foo.c", 10, "brew cmake <= 3.10.0", "test")

    b = Brew(line, "brew")
    b.parse()
    assert b.operator == "<="
    assert b.command == "brew"
    assert b.package == "cmake"
    assert b.version_text == "3.10.0"
    mocker.patch('dep.brew_cmd')
    dep.brew_cmd.return_value = json.load(open(here + '/assets/brew_cmake_installed.json'))
    b.verify_and_act()
    assert dep.brew_cmd.called


def test_brew_ninja_not_installed_requirement(mocker):
    """Detailed check of a unmatched brew requirement."""
    line = Line("foo.c", 11, "brew ninja <= 1.8.2", "We use ninja as clang's build system.")

    b = Brew(line, "brew")
    b.parse()
    assert b.operator == "<="
    assert b.command == "brew"
    assert b.package == "ninja"
    assert b.version_text == "1.8.2"
    mocker.patch('dep.brew_cmd')
    dep.brew_cmd.return_value = json.load(open(here + '/assets/brew_ninja_not_installed.json'))
    # The package is not installed
    with pytest.raises(MissingDependencyError) as exception_info:
        b.verify_and_act()

    assert "missing dependency: brew ninja v1.8.2, found nothing installed" in str(exception_info)
    assert dep.brew_cmd.called


def test_versions():
    """Unittests for the version comparison objects."""
    v1 = Version("3.2.1")
    v2 = Version("3.3.1")
    v3 = Version("3.2")
    v4 = Version("3.2")

    # Check the values are parsed correctly.
    assert v1.text == "3.2.1"
    assert v1.numeric == [3, 2, 1]
    assert v3.text == "3.2"
    assert v3.numeric == [3, 2]

    # Check the operators work correctly.
    assert v2 > v1
    assert v1 < v2
    assert v2 >= v1
    assert v1 <= v2
    assert v3 == v4

    # Check that versions with different number of digits compare correctly.
    assert v2 > v3
    assert v3 < v2

    # TODO fix different digit comparisons.
    # assert v4 == v1
    assert v3 >= v4


def test_self_version_requirement():
    """Unittest of the self version check."""
    line = Line("foo.c", 10, "config_manager <= 0.1", "test")

    b = ConMan(line, "config_manager")
    b.parse()
    assert b.operator == "<="
    assert b.command == "config_manager"
    assert b.version_text == "0.1"

    b.verify_and_act()

    line = Line("foo.c", 10, "config_manager <= 0.0.1", "test")
    bad = ConMan(line, "config_manager")
    bad.parse()
    with pytest.raises(MissingDependencyError):
        bad.verify_and_act()
    line = Line("foo.c", 10, "config_manager == " + dep.VERSION, "test")
    good = ConMan(line, "config_manager")
    good.parse()
    good.verify_and_act()


def test_host_os_version_requirement(mocker):
    """Unittest of the host os version check."""
    line = Line("foo.c", 11, "os_version == 10.13.2", "test")
    mocker.patch('dep.platform.mac_ver')
    dep.platform.mac_ver.return_value = ('10.13.2', "", "")
    b = HostOSVersion(line, "os_version")
    b.parse()
    assert b.operator == "=="
    assert b.command == "os_version"
    assert b.version_text == "10.13.2"

    b.verify_and_act()

    line = Line("foo.c", 10, "os_version == 10.13.1", "test")
    bad = HostOSVersion(line, "os_version")
    bad.parse()
    with pytest.raises(MissingDependencyError):
        bad.verify_and_act()