<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 27, 2020 at 7:04 PM Cyril Hrubis <<a href="mailto:chrubis@suse.cz">chrubis@suse.cz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Now each string in the kconfig[] array in tst_test structure is an<br>
boolean expression which is evaluated. All expressions has to be true in<br>
order for the test to continue.<br>
<br>
This also makes the parser for the kernel config a bit more robust as it<br>
was pointed out that there may have been cases where it could be mislead<br>
by hand edited config files.<br>
<br>
+ Update the docs.<br>
<br>
Signed-off-by: Cyril Hrubis <<a href="mailto:chrubis@suse.cz" target="_blank">chrubis@suse.cz</a>><br>
CC: Pengfei Xu <<a href="mailto:pengfei.xu@intel.com" target="_blank">pengfei.xu@intel.com</a>><br>
---<br>
<br>
v2:<br>
   - squashed the two patches since we are doing more extensive changes<br>
   - made the parser a bit more robust<br>
   - renamed a few fucntions and identifiers to make the code easier to<br>
     understand<br>
   - sprinkled the code with consts<br>
<br>
 doc/test-writing-guidelines.txt |  21 +-<br>
 include/tst_kconfig.h           |  34 +--<br>
 lib/newlib_tests/config06       |   1 +<br>
 lib/newlib_tests/test_kconfig.c |   1 +<br>
 lib/tst_kconfig.c               | 362 +++++++++++++++++++++-----------<br>
 5 files changed, 270 insertions(+), 149 deletions(-)<br>
 create mode 100644 lib/newlib_tests/config06<br>
<br>
diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt<br>
index 1a51ef7c7..3c2ab7166 100644<br>
--- a/doc/test-writing-guidelines.txt<br>
+++ b/doc/test-writing-guidelines.txt<br>
@@ -1643,21 +1643,26 @@ on the system, disabled syscalls can be detected by checking for 'ENOSYS'<br>
 errno etc.<br>
<br>
 However in rare cases core kernel features couldn't be detected based on the<br>
-kernel userspace API and we have to resort to kernel .config parsing.<br>
+kernel userspace API and we have to resort to parse the kernel .config.<br>
<br>
-For this cases the test should set the 'NULL' terminated '.needs_kconfigs' array<br>
-of kernel config options required for the test. The config option can be<br>
-specified either as plain "CONFIG_FOO" in which case it's sufficient for the<br>
-test continue if it's set to any value (typically =y or =m). Or with a value<br>
-as "CONFIG_FOO=bar" in which case the value has to match as well. The test is<br>
-aborted with 'TCONF' if any of the required options were not set.<br>
+For this cases the test should set the 'NULL' terminated '.needs_kconfigs'<br>
+array of boolean expressions with constraints on the kconfig variables. The<br>
+boolean expression consits of variables, two binary operations '&' and '|',<br>
+negation '!' and correct sequence of parentesis '()'. Variables are expected<br>
+to be in a form of "CONFIG_FOO[=bar]".<br>
+<br>
+The test will continue to run if all expressions are evaluated to 'True'.<br>
+Missing variable is mapped to 'False' as well as variable with different than<br>
+specified value, e.g. 'CONFIG_FOO=bar' will evaluate to 'False' if the value<br>
+is anything else but 'bar'. If config variable is specified as plain<br>
+'CONFIG_FOO' it's evaluated to true it's set to any value (typically =y or =m).<br>
<br>
 [source,c]<br>
 -------------------------------------------------------------------------------<br>
 #include "tst_test.h"<br>
<br>
 static const char *kconfigs[] = {<br>
-       "CONFIG_X86_INTEL_UMIP",<br>
+       "CONFIG_X86_INTEL_UMIP | CONFIG_X86_UMIP",<br>
        NULL<br>
 };<br>
<br>
diff --git a/include/tst_kconfig.h b/include/tst_kconfig.h<br>
index 2d2cfd782..1bb21fea8 100644<br>
--- a/include/tst_kconfig.h<br>
+++ b/include/tst_kconfig.h<br>
@@ -6,27 +6,27 @@<br>
 #ifndef TST_KCONFIG_H__<br>
 #define TST_KCONFIG_H__<br>
<br>
-struct tst_kconfig_res {<br>
-       char match;<br>
-       char *value;<br>
+struct tst_kconfig_var {<br>
+       char id[64];<br>
+       unsigned int id_len;<br>
+       char choice;<br>
+       char *val;<br>
 };<br>
<br>
 /**<br>
- * Reads a kernel config and parses it for values defined in kconfigs array.<br>
+ *<br>
+ * Reads a kernel config, parses it and writes results into an array of<br>
+ * tst_kconfig_var structures.<br>
  *<br>
  * The path to the kernel config should be autodetected in most of the cases as<br>
  * the code looks for know locations. It can be explicitely set/overrided with<br>
  * the KCONFIG_PATH environment variable as well.<br>
  *<br>
- * The kcofings array is expected to contain strings in a format "CONFIG_FOO"<br>
- * or "CONFIG_FOO=bar". The result array has to be suitably sized to fit the<br>
- * results.<br>
- *<br>
- * @param kconfigs array of config strings to look for<br>
- * @param results array to store results to<br>
- * @param cnt size of the arrays<br>
+ * The caller has to initialize the tst_kconfig_var structure. The id has to be<br>
+ * filled with config variable name such as 'CONFIG_FOO', the id_len should<br>
+ * hold the id string length and the choice and val has to be zeroed.<br>
  *<br>
- * The match in the tst_kconfig_res structure is set as follows:<br>
+ * After a call to this function each choice be set as follows:<br>
  *<br>
  *  'm' - config option set to m<br>
  *  'y' - config option set to y<br>
@@ -34,11 +34,13 @@ struct tst_kconfig_res {<br>
  *  'n' - config option is not set<br>
  *   0  - config option not found<br>
  *<br>
- * In the case that match is set to 'v' the value points to a newly allocated<br>
- * string that holds the value.<br>
+ * In the case that match is set to 'v' the val pointer points to a newly<br>
+ * allocated string that holds the value.<br>
+ *<br>
+ * @param vars An array of caller initalized tst_kconfig_var structures.<br>
+ * @param vars_len Length of the vars array.<br>
  */<br>
-void tst_kconfig_read(const char *const kconfigs[],<br>
-                     struct tst_kconfig_res results[], size_t cnt);<br>
+void tst_kconfig_read(struct tst_kconfig_var vars[], size_t vars_len);<br>
<br>
 /**<br>
  * Checks if required kernel configuration options are set in the kernel<br>
diff --git a/lib/newlib_tests/config06 b/lib/newlib_tests/config06<br>
new file mode 100644<br>
index 000000000..b7db25411<br>
--- /dev/null<br>
+++ b/lib/newlib_tests/config06<br>
@@ -0,0 +1 @@<br>
+# Empty<br>
diff --git a/lib/newlib_tests/test_kconfig.c b/lib/newlib_tests/test_kconfig.c<br>
index d9c662fc5..183d55611 100644<br>
--- a/lib/newlib_tests/test_kconfig.c<br>
+++ b/lib/newlib_tests/test_kconfig.c<br>
@@ -14,6 +14,7 @@ static const char *kconfigs[] = {<br>
        "CONFIG_MMU",<br>
        "CONFIG_EXT4_FS=m",<br>
        "CONFIG_PGTABLE_LEVELS=4",<br>
+       "CONFIG_MMU & CONFIG_EXT4_FS=m",<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">The patchset looks awesome.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">But a tiny issue was found from my test, the tst_kconfig_check() would be</div><div class="gmail_default" style="font-size:small">failed to parse expression if reverse the sequence of the above string.</div></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">i.e. </div><div class="gmail_default" style="font-size:small">-       "CONFIG_MMU & CONFIG_EXT4_FS=m",<br>+       "CONFIG_EXT4_FS=m & CONFIG_MMU",</div></div><div><div class="gmail_default" style="font-size:small">(Core dumped here)</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">But trying with =Num, it gets different errors:</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">"CONFIG_MMU & CONFIG_PGTABLE_LEVELS=4",</div><div class="gmail_default" style="font-size:small">(works well)</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">"CONFIG_PGTABLE_LEVELS=4 & CONFIG_MMU",</div><div class="gmail_default" style="font-size:small">(print Expression not satisfied!)</div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>