summaryrefslogtreecommitdiff
path: root/scripts/kconfig/tests/randconfig_probability/__init__.py
blob: e6e5dda10ad92953800bc71a4f9fdd8962e0a120 (plain) (blame)
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
# SPDX-License-Identifier: GPL-2.0-only
"""Validate KCONFIG_PROBABILITY without changing the supported distributions."""


def test_malformed_warns(conf):
    probabilities = [
        'invalid', ' ', '50%', '50 ', '0x32', '10 20', '10:20x',
        '10:20:invalid', '10:20:30x',
        ':50', '50:', '10::20', '10:20:', '10:20:30:', '10:20:30:40',
        '-0', '+0', '+', '-', '+100:0', ' \t100:0', '0: \t100:0',
    ]
    for probability in probabilities:
        assert conf._run_conf('--randconfig', extra_env={
            'KCONFIG_PROBABILITY': probability,
            'KCONFIG_SEED': '0',
        }) == 0, repr(probability)
        assert ('warning: KCONFIG_PROBABILITY has malformed format' in
                conf.stderr), repr(probability)
        assert conf.stderr.count('warning:') == 1, repr(probability)
        assert conf.config is not None, repr(probability)


def test_malformed_preserves_config(conf):
    probabilities = [('50%', '50:0:0'), ('-0', '0')]
    for seed in range(20):
        for probability, equivalent in probabilities:
            context = 'probability={!r}, equivalent={!r}, seed={}'.format(
                probability, equivalent, seed)
            assert conf._run_conf('--randconfig', extra_env={
                'KCONFIG_PROBABILITY': probability,
                'KCONFIG_SEED': hex(seed),
            }) == 0, context
            assert ('warning: KCONFIG_PROBABILITY has malformed format' in
                    conf.stderr), context
            assert conf.stderr.count('warning:') == 1, context
            malformed = conf.config

            assert conf._run_conf('--randconfig', extra_env={
                'KCONFIG_PROBABILITY': equivalent,
                'KCONFIG_SEED': hex(seed),
            }) == 0, context
            assert 'warning:' not in conf.stderr, context
            assert conf.config == malformed, context


def test_werror(conf):
    probabilities = [
        ('', 0), ('50', 0), ('50%', 1), ('-0', 1), ('10:20:30:40', 1),
    ]
    for probability, status in probabilities:
        for werror in ['', '0', '1']:
            context = 'probability={!r}, werror={!r}'.format(
                probability, werror)
            assert conf._run_conf('--randconfig', extra_env={
                'KCONFIG_PROBABILITY': probability,
                'KCONFIG_SEED': '0',
                'KCONFIG_WERROR': werror,
            }) == status, context
            if status:
                assert ('warning: KCONFIG_PROBABILITY has malformed format' in
                        conf.stderr), context
                assert conf.stderr.count('warning:') == 1, context
            else:
                assert 'warning:' not in conf.stderr, context


def test_out_of_range(conf):
    probabilities = [
        '-1', '101', '+101', '0:101', '0:0:101', '60:41', '0:60:41',
        '4294967296', '-4294967296',
        '999999999999999999999999', '-999999999999999999999999',
    ]
    for probability in probabilities:
        assert conf._run_conf('--randconfig', extra_env={
            'KCONFIG_PROBABILITY': probability,
            'KCONFIG_SEED': '0',
        }) == 1, repr(probability)
        assert 'KCONFIG_PROBABILITY:' in conf.stderr, repr(probability)


def test_valid(conf):
    probabilities = [
        ('0', 'n', 'n'),
        ('0:0', 'n', 'n'),
        ('100:0', 'y', 'y'),
        ('0:100', 'y', 'm'),
        ('100:0:0', 'y', 'n'),
        ('0:100:0', 'n', 'y'),
        ('0:0:100', 'n', 'm'),
        ('000:000:100', 'n', 'm'),
    ]
    for probability, boolean, tristate in probabilities:
        assert conf._run_conf('--randconfig', extra_env={
            'KCONFIG_PROBABILITY': probability,
            'KCONFIG_SEED': '0',
        }) == 0, repr(probability)
        assert 'warning:' not in conf.stderr, repr(probability)
        for symbol, value in [('BOOL', boolean), ('TRI', tristate)]:
            if value == 'n':
                expected = '# CONFIG_{} is not set'.format(symbol)
            else:
                expected = 'CONFIG_{}={}'.format(symbol, value)
            assert expected in conf.config.splitlines(), repr(probability)


def test_single_probability_matches_tristate_split(conf):
    for seed in range(20):
        context = 'seed={}'.format(seed)
        assert conf._run_conf('--randconfig', extra_env={
            'KCONFIG_PROBABILITY': '50',
            'KCONFIG_SEED': hex(seed),
        }) == 0, context
        assert 'warning:' not in conf.stderr, context
        single = conf.config

        # 50% boolean y; 25% tristate y, 25% m, and 50% n.
        assert conf._run_conf('--randconfig', extra_env={
            'KCONFIG_PROBABILITY': '50:25:25',
            'KCONFIG_SEED': hex(seed),
        }) == 0, context
        assert 'warning:' not in conf.stderr, context
        assert conf.config == single, context


def test_empty(conf):
    assert conf._run_conf('--randconfig', extra_env={
        'KCONFIG_PROBABILITY': '',
        'KCONFIG_SEED': '0',
    }) == 0
    assert 'warning:' not in conf.stderr