Commit 47ad1689 authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kconfig: tests: add a test for randconfig with dependent choices



Since commit 3b9a19e0 ("kconfig: loop as long as we changed some
symbols in randconfig"), conf_set_all_new_symbols() is repeated until
there is no more choice left to be shuffled. The motivation was to
shuffle a choice nested in another choice.

Although commit 09d5873e ("kconfig: allow only 'config', 'comment',
and 'if' inside 'choice'") disallowed the nested choice structure,
we must still keep 3b9a19e0 because there are still cases where
conf_set_all_new_symbols() must iterate.

scripts/kconfig/tests/choice_randomize/Kconfig is the test case.
The second choice depends on 'B', which is the member of the first
choice.

With 3b9a19e0 reverted, we would never get the pattern specified by
scripts/kconfig/tests/choice_randomize/expected_config2.

A real example can be found in lib/Kconfig.debug. Without 3b9a19e0,
the randconfig would not shuffle the "Compressed Debug information"
choice, which depends on DEBUG_INFO, which is derived from another
choice "Debug information".

My goal is to refactor Kconfig so that randconfig will work more
simply, without using the loop.

For now, let's add a test case to ensure all dependent choices are
shuffled, as it is a somewhat tricky case for the current Kconfig.

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent c9aa7d86
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
choice
	prompt "choose A or B"

config A
	bool "A"

config B
	bool "B"

endchoice

choice
	prompt "choose X or Y"
	depends on B

config X
	bool "X"

config Y
	bool "Y"

endchoice
+34 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
"""
Randomize all dependent choices

This is a somewhat tricky case for randconfig; the visibility of one choice is
determined by a member of another choice. Randconfig should be able to generate
all possible patterns.
"""


def test(conf):

    expected0 = False
    expected1 = False
    expected2 = False

    for i in range(100):
        assert conf.randconfig(seed=i) == 0

        if conf.config_matches('expected_config0'):
            expected0 = True
        elif conf.config_matches('expected_config1'):
            expected1 = True
        elif conf.config_matches('expected_config2'):
            expected2 = True
        else:
            assert False

        if expected0 and expected1 and expected2:
            break

    assert expected0
    assert expected1
    assert expected2
+6 −0
Original line number Diff line number Diff line
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
CONFIG_A=y
# CONFIG_B is not set
+8 −0
Original line number Diff line number Diff line
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
# CONFIG_A is not set
CONFIG_B=y
CONFIG_X=y
# CONFIG_Y is not set
+8 −0
Original line number Diff line number Diff line
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
# CONFIG_A is not set
CONFIG_B=y
# CONFIG_X is not set
CONFIG_Y=y