summaryrefslogtreecommitdiff
path: root/tests/format/optionarch.py
blob: 09f9c07c9ba2169a496bcce76da6ec3464579948 (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
import os
import pytest
from contextlib import contextmanager
from buildstream import _yaml
from buildstream._exceptions import ErrorDomain, LoadErrorReason
from tests.testutils.runcli import cli

# Project directory
DATA_DIR = os.path.dirname(os.path.realpath(__file__))


# Context manager to override the reported value of `os.uname()`
@contextmanager
def override_uname_arch(name):
    orig_uname = os.uname
    orig_tuple = tuple(os.uname())
    override_result = (orig_tuple[0], orig_tuple[1],
                       orig_tuple[2], orig_tuple[3],
                       name)

    def override():
        return override_result

    os.uname = override
    yield
    os.uname = orig_uname


@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("uname,value,expected", [
    # Test explicitly provided arches
    ('arm', 'aarch32', 'Army'),
    ('arm', 'aarch64', 'Aarchy'),

    # Test automatically derived arches
    ('arm', None, 'Army'),
    ('aarch64', None, 'Aarchy'),

    # Test that explicitly provided arches dont error out
    # when the `uname` reported arch is not supported
    ('i386', 'aarch32', 'Army'),
    ('x86_64', 'aarch64', 'Aarchy'),
])
def test_conditional(cli, datafiles, uname, value, expected):
    with override_uname_arch(uname):
        project = os.path.join(datafiles.dirname, datafiles.basename, 'option-arch')

        bst_args = []
        if value is not None:
            bst_args += ['--option', 'machine_arch', value]

        bst_args += [
            'show',
            '--deps', 'none',
            '--format', '%{vars}',
            'element.bst'
        ]
        result = cli.run(project=project, silent=True, args=bst_args)
        result.assert_success()

        loaded = _yaml.load_data(result.output)
        assert loaded['result'] == expected


@pytest.mark.datafiles(DATA_DIR)
def test_unsupported_arch(cli, datafiles):

    with override_uname_arch("x86_64"):
        project = os.path.join(datafiles.dirname, datafiles.basename, 'option-arch')
        result = cli.run(project=project, silent=True, args=[
            'show',
            '--deps', 'none',
            '--format', '%{vars}',
            'element.bst'
        ])

        result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA)


@pytest.mark.datafiles(DATA_DIR)
def test_alias(cli, datafiles):

    with override_uname_arch("arm"):
        project = os.path.join(datafiles.dirname, datafiles.basename, 'option-arch-alias')
        result = cli.run(project=project, silent=True, args=[
            'show',
            '--deps', 'none',
            '--format', '%{vars}',
            'element.bst'
        ])

        result.assert_success()


@pytest.mark.datafiles(DATA_DIR)
def test_unknown_host_arch(cli, datafiles):

    with override_uname_arch("x86_128"):
        project = os.path.join(datafiles.dirname, datafiles.basename, 'option-arch')
        result = cli.run(project=project, silent=True, args=[
            'show',
            '--deps', 'none',
            '--format', '%{vars}',
            'element.bst'
        ])

        result.assert_main_error(ErrorDomain.PLATFORM, None)


@pytest.mark.datafiles(DATA_DIR)
def test_unknown_project_arch(cli, datafiles):

    project = os.path.join(datafiles.dirname, datafiles.basename, 'option-arch-unknown')
    result = cli.run(project=project, silent=True, args=[
        'show',
        '--deps', 'none',
        '--format', '%{vars}',
        'element.bst'
    ])

    result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA)