# 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