22 Aug, 2018
3 commits
-
This commit improves the messages of the recursive dependency.
Currently, sym->dir_dep.expr is not checked. Hence, any dependency
in property visibility is regarded as the dependency of the symbol.[Test Code 1]
config A
bool "a"
depends on Bconfig B
bool "b"
depends on A[Test Code 2]
config A
bool "a" if Bconfig B
bool "b"
depends on AFor both cases above, the same message is displayed:
symbol B depends on A
symbol A depends on BThis commit changes the message for the latter, like this:
symbol B depends on A
symbol A prompt is visible depending on BAlso, 'select' and 'imply' are distinguished.
Signed-off-by: Masahiro Yamada
Tested-by: Dirk Gouders -
Currently, Kconfig does not complain about the recursive dependency
where 'imply' keywords are involved.[Test Code]
config A
bool "a"config B
bool "b"
imply A
depends on AIn the code above, Kconfig cannot calculate the symbol values correctly
due to the circular dependency. For example, allyesconfig followed by
syncconfig results in an odd behavior because CONFIG_B becomes visible
in syncconfig.$ make allyesconfig
scripts/kconfig/conf --allyesconfig Kconfig
#
# configuration written to .config
#
$ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Main menu
#
CONFIG_A=y
$ make syncconfig
scripts/kconfig/conf --syncconfig Kconfig
*
* Restart config...
*
*
* Main menu
*
a (A) [Y/n/?] y
b (B) [N/y/?] (NEW)To detect this correctly, sym_check_expr_deps() should recurse to
not only sym->rev_dep.expr but also sym->implied.expr .At this moment, sym_check_print_recursive() cannot distinguish
'select' and 'imply' since it does not know the precise context
where the recursive dependency has been hit. This will be solved
by the next commit.In fact, even the document and the unit-test are confused. Using
'imply' does not solve recursive dependency since 'imply' addresses
the unmet direct dependency, which 'select' could cause.Signed-off-by: Masahiro Yamada
Tested-by: Dirk Gouders -
Originally, recursive dependency was a fatal error for Kconfig
because Kconfig cannot compute symbol values in such a situation.Commit d595cea62403 ("kconfig: print more info when we see a recursive
dependency") changed it to a warning, which I guess was not intentional.Get it back to an error again.
Also, rename the unit test directory "warn_recursive_dep" to
"err_recursive_dep" so that it matches to the behavior.Signed-off-by: Masahiro Yamada
Tested-by: Dirk Gouders
29 May, 2018
2 commits
-
Here are the test cases I used for developing the text expansion
feature.Signed-off-by: Masahiro Yamada
-
If "mainmenu" is not specified, "Linux Kernel Configuration" is used
as a default prompt.Given that Kconfig is used in other projects than Linux, let's use
a more generic prompt, "Main menu".Suggested-by: Sam Ravnborg
Signed-off-by: Masahiro Yamada
26 Mar, 2018
11 commits
-
As in the unit test, the error message for the recursive inclusion
looks like this:Kconfig.inc1:4: recursive inclusion detected. Inclusion path:
current file : 'Kconfig.inc1'
included from: 'Kconfig.inc3:1'
included from: 'Kconfig.inc2:3'
included from: 'Kconfig.inc1:4'The 'Kconfig.inc1:4' is duplicated in the first and last lines.
Also, the single quotes do not help readability.Change the message like follows:
Recursive inclusion detected.
Inclusion path:
current file : Kconfig.inc1
included from: Kconfig.inc3:1
included from: Kconfig.inc2:3
included from: Kconfig.inc1:4Signed-off-by: Masahiro Yamada
-
If recursive inclusion is detected, it should fail with error
messages. Test this.This also tests the line numbers in the error message, fixed by
commit 5ae6fcc4bb82 ("kconfig: fix line number in recursive inclusion
error message").Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
Recursive dependency should be detected and warned. Test this.
This indirectly tests the line number increments.
Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
Commit 3b9a19e08960 ("kconfig: loop as long as we changed some symbols
in randconfig") fixed randconfig where a choice contains a sub-choice.
Prior to that commit, the sub-choice values were not set.I am not sure whether this is an intended feature or just something
people discovered works, but it is used in the real world;
drivers/usb/gadget/legacy/Kconfig is source'd in a choice context,
then creates a sub-choice in it.For the test case in this commit, there are 3 possible results.
Case 1:
CONFIG_A=y
# CONFIG_B is not setCase 2:
# CONFIG_A is not set
CONFIG_B=y
CONFIG_C=y
# CONFIG_D is not setCase 3:
# CONFIG_A is not set
CONFIG_B=y
# CONFIG_C is not set
CONFIG_D=y
CONFIG_E=ySo, this test iterates several times, and checks if the result is
either of the three.Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
Commit fbe98bb9ed3d ("kconfig: Fix defconfig when one choice menu
selects options that another choice menu depends on") fixed defconfig
when two choices interact (i.e. calculating the visibility of a choice
requires to calculate another choice).The test code in that commit log was based on the real world example,
and complicated. So, I shrunk it down to the following:defconfig.choice:
---8
Reviewed-by: Ulf Magnusson -
If tristate choice values depend on symbols set to 'm', they should be
hidden when the choice containing them is changed from 'm' to 'y'
(i.e. exclusive choice).This issue was fixed by commit fa64e5f6a35e ("kconfig/symbol.c: handle
choice_values that depend on 'm' symbols").Add a test case to avoid regression.
For the input in this unit test, there is a room for argument if
"# CONFIG_CHOICE1 is not set" should be written to the .config file.After commit fa64e5f6a35e, this line was written to the .config file.
With commit cb67ab2cd2b8 ("kconfig: do not write choice values when
their dependency becomes n"), it is not written now.In this test, "# CONFIG_CHOICE1 is not set" is don't care.
Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
Commit cb67ab2cd2b8 ("kconfig: do not write choice values when their
dependency becomes n") fixed a problem where "# CONFIG_... is not set"
for choice values are wrongly written into the .config file when they
are once visible, then become invisible later.Add a test for this naive case.
Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
If new choice values are added with new dependency, and they become
visible during user configuration, oldconfig should recognize them
as (NEW), and ask the user for choice.This issue was fixed by commit 5d09598d488f ("kconfig: fix new choices
being skipped upon config update").This is a subtle corner case. Add a test case to avoid breakage.
Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
If a symbols has dependency on the preceding symbol, the menu entry
should become the submenu of the preceding one, and displayed with
deeper indentation.This is done by restructuring the menu tree in menu_finalize().
It is a bit complicated computation, so let's add a test case.Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
The calculation of 'choice' is a bit complicated part in Kconfig.
The behavior of 'y' choice is intuitive. If choice values are tristate,
the choice can be 'm' where each value can be enabled independently.
Also, if a choice is marked as 'optional', the whole choice can be
invisible.Test basic functionality of choice.
Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson -
Many parts in Kconfig are so cryptic and need refactoring. However,
its complexity prevents us from moving forward. There are several
naive corner cases where it is difficult to notice breakage. If
those are covered by unit tests, we will be able to touch the code
with more confidence.Here is a simple test framework based on pytest. The conftest.py
provides a fixture useful to run commands such as 'oldaskconfig' etc.
and to compare the resulted .config, stdout, stderr with expectations.How to add test cases?
----------------------For each test case, you should create a subdirectory under
scripts/kconfig/tests/ (so test cases are separated from each other).
Every test case directory should contain the following files:- __init__.py: describes test functions
- Kconfig: the top level Kconfig file for the testTo do a useful job, test cases generally need additional data like
input .config and information about expected results.How to run tests?
-----------------You need python3 and pytest. Then, run "make testconfig". O= option
is supported. If V=1 is given, detailed logs captured during tests
are displayed.Signed-off-by: Masahiro Yamada
Reviewed-by: Ulf Magnusson