[Pkg-sssd-devel] ding-libs: Changes to 'upstream'

Timo Aaltonen tjaalton at moszumanska.debian.org
Mon Sep 19 12:05:12 UTC 2016


 Makefile.am                   |   25 
 contrib/ding-libs.spec.in     |    3 
 ini/ini_augment_ut.c          |    5 
 ini/ini_config_priv.h         |   13 
 ini/ini_configobj.c           |  737 ++++++++++++++++++++++++++++
 ini/ini_configobj.h           |  192 +++++++
 ini/ini_parse.c               |   37 +
 ini/ini_parse_ut_check.c      |  152 +++++
 ini/ini_validators_ut_check.c | 1091 ++++++++++++++++++++++++++++++++++++++++++
 ini/libini_config.sym         |   15 
 version.m4                    |    4 
 11 files changed, 2259 insertions(+), 15 deletions(-)

New commits:
commit a62db8ede4deba10a385d7aee218fbb293f653bf
Author: Lukas Slebodnik <lslebodn at redhat.com>
Date:   Wed Jun 22 10:46:44 2016 +0200

    Update versions before 0.6.0 release
    
    Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>

diff --git a/version.m4 b/version.m4
index 8f4ce54..08814fe 100644
--- a/version.m4
+++ b/version.m4
@@ -1,5 +1,5 @@
 # Primary version number
-m4_define([VERSION_NUMBER], [0.5.0])
+m4_define([VERSION_NUMBER], [0.6.0])
 
 # If the PRERELEASE_VERSION_NUMBER is set, we'll append
 # it to the release tag when creating an RPM or SRPM
@@ -15,4 +15,4 @@ m4_define([DHASH_VERSION_NUMBER], [0.4.3])
 m4_define([COLLECTION_VERSION_NUMBER], [0.7.0])
 m4_define([REF_ARRAY_VERSION_NUMBER], [0.1.5])
 m4_define([BASICOBJECTS_VERSION_NUMBER], [0.1.1])
-m4_define([INI_CONFIG_VERSION_NUMBER], [1.2.0])
+m4_define([INI_CONFIG_VERSION_NUMBER], [1.3.0])

commit 65110b180638b69978e31d522951bfa2c2040790
Author: Lukas Slebodnik <lslebodn at redhat.com>
Date:   Wed Jun 22 10:45:09 2016 +0200

    Bump version-info
    
    New functions were added to ini_config:
        /* ini_configobj.h */
        ini_errobj_create;
        ini_errobj_destroy;
        ini_errobj_add_msg;
        ini_errobj_reset;
        ini_errobj_get_msg;
        ini_errobj_count;
        ini_errobj_next;
        ini_errobj_no_more_msgs;
        ini_rules_read_from_file;
        ini_rules_check;
        ini_rules_destroy;
    
    Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>

diff --git a/Makefile.am b/Makefile.am
index bd6c423..65528a8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -276,7 +276,7 @@ libini_config_la_LIBADD = \
     libref_array.la \
     libbasicobjects.la
 libini_config_la_LDFLAGS = \
-    -version-info 6:0:1 \
+    -version-info 7:0:2 \
     -Wl,--version-script=$(top_srcdir)/ini/libini_config.sym
 
 dist_noinst_DATA += \
diff --git a/contrib/ding-libs.spec.in b/contrib/ding-libs.spec.in
index 93c520c..3fc079c 100644
--- a/contrib/ding-libs.spec.in
+++ b/contrib/ding-libs.spec.in
@@ -304,7 +304,7 @@ structure
 %doc COPYING
 %doc COPYING.LESSER
 %{_libdir}/libini_config.so.5
-%{_libdir}/libini_config.so.5.1.0
+%{_libdir}/libini_config.so.5.2.0
 
 %files -n libini_config-devel
 %defattr(-,root,root,-)

commit de04fef6462e66303f7fc673738d83d0d98025ef
Author: Lukas Slebodnik <lslebodn at redhat.com>
Date:   Wed Jun 22 09:13:04 2016 +0200

    INI: Prepare for schema validation
    
    Pointer to function ini_schema_validator_func will be an optional
    and can be used to schema validation. It shoul also prepare data
    for validator function if last output argument is not NULL.
    These prepared data will be passed to validator function as
    a 5th argument of ini_validator_func. These two functions
    are responsible for memory management of passed additional data.
    
    It isn't an API/ABI change because lib_iniconfig has not been released yet.
    
    Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>

diff --git a/ini/ini_configobj.c b/ini/ini_configobj.c
index f7efb88..04e81ba 100644
--- a/ini/ini_configobj.c
+++ b/ini/ini_configobj.c
@@ -1082,7 +1082,8 @@ done:
 static int ini_dummy_noerror(const char *rule_name,
                              struct ini_cfgobj *rules_obj,
                              struct ini_cfgobj *config_obj,
-                             struct ini_errobj *errobj)
+                             struct ini_errobj *errobj,
+                             void **data)
 {
     return 0;
 }
@@ -1091,7 +1092,8 @@ static int ini_dummy_noerror(const char *rule_name,
 static int ini_dummy_error(const char *rule_name,
                            struct ini_cfgobj *rules_obj,
                            struct ini_cfgobj *config_obj,
-                           struct ini_errobj *errobj)
+                           struct ini_errobj *errobj,
+                           void **data)
 {
     return ini_errobj_add_msg(errobj, "Error");
 }
@@ -1133,7 +1135,8 @@ static int is_allowed_section(const char *tested_section,
 static int ini_allowed_sections(const char *rule_name,
                                 struct ini_cfgobj *rules_obj,
                                 struct ini_cfgobj *config_obj,
-                                struct ini_errobj *errobj)
+                                struct ini_errobj *errobj,
+                                void **data)
 {
     struct value_obj *vo = NULL;
     int ret;
@@ -1357,7 +1360,8 @@ static int check_if_allowed(char *section, char *attr, char **allowed,
 static int ini_allowed_options(const char *rule_name,
                                struct ini_cfgobj *rules_obj,
                                struct ini_cfgobj *config_obj,
-                               struct ini_errobj *errobj)
+                               struct ini_errobj *errobj,
+                               void **data)
 {
     struct value_obj *vo = NULL;
     int ret;
@@ -1620,7 +1624,7 @@ int ini_rules_check(struct ini_cfgobj *rules_obj,
                 goto done;
             }
 
-            ret = vfunc(sections[i], rules_obj, config_obj, localerr);
+            ret = vfunc(sections[i], rules_obj, config_obj, localerr, NULL);
             if (ret != 0) {
                 /* Just report the error and continue normally,
                  * maybe there are some errors in localerr */
diff --git a/ini/ini_configobj.h b/ini/ini_configobj.h
index 648ef87..093916a 100644
--- a/ini/ini_configobj.h
+++ b/ini/ini_configobj.h
@@ -2165,7 +2165,13 @@ size_t ini_errobj_count(struct ini_errobj *errobj);
 typedef int (ini_validator_func)(const char *rule_name,
                                  struct ini_cfgobj *rules_obj,
                                  struct ini_cfgobj *config_obj,
-                                 struct ini_errobj *errobj);
+                                 struct ini_errobj *errobj,
+                                 void **data);
+
+typedef int (ini_schema_validator_func)(const char *rule_name,
+                                        struct ini_cfgobj *rules_obj,
+                                        struct ini_errobj *errobj,
+                                        void **data);
 
 /** @brief Structure used to define application specific
  * (external to libini) validator
@@ -2173,6 +2179,8 @@ typedef int (ini_validator_func)(const char *rule_name,
 struct ini_validator {
     const char *name;
     ini_validator_func *func;
+    /* currently unused, for future expansion */
+    ini_schema_validator_func *schema_validator;
 };
 
 /**
diff --git a/ini/ini_validators_ut_check.c b/ini/ini_validators_ut_check.c
index 9aadc3c..fa7105a 100644
--- a/ini/ini_validators_ut_check.c
+++ b/ini/ini_validators_ut_check.c
@@ -280,7 +280,8 @@ END_TEST
 static int custom_noerror(const char *rule_name,
                           struct ini_cfgobj *rules_obj,
                           struct ini_cfgobj *config_obj,
-                          struct ini_errobj *errobj)
+                          struct ini_errobj *errobj,
+                          void **data)
 {
     return 0;
 }
@@ -288,7 +289,8 @@ static int custom_noerror(const char *rule_name,
 static int custom_error(const char *rule_name,
                         struct ini_cfgobj *rules_obj,
                         struct ini_cfgobj *config_obj,
-                        struct ini_errobj *errobj)
+                        struct ini_errobj *errobj,
+                        void **data)
 {
     return ini_errobj_add_msg(errobj, "Error");
 }
@@ -300,12 +302,12 @@ START_TEST(test_custom_noerror)
     struct ini_errobj *errobj;
     int ret;
     struct ini_validator *noerror[] = {
-        &(struct ini_validator){ "custom_noerror", custom_noerror },
+        &(struct ini_validator){ "custom_noerror", custom_noerror, NULL },
         NULL
     };
     struct ini_validator *missing_name[] = {
-        &(struct ini_validator){ NULL, custom_noerror },
-        &(struct ini_validator){ "custom_noerror", custom_noerror },
+        &(struct ini_validator){ NULL, custom_noerror, NULL },
+        &(struct ini_validator){ "custom_noerror", custom_noerror, NULL },
         NULL
     };
 
@@ -351,11 +353,11 @@ START_TEST(test_custom_error)
     struct ini_errobj *errobj;
     int ret;
     struct ini_validator *error[] = {
-        &(struct ini_validator){ "custom_error", custom_error },
+        &(struct ini_validator){ "custom_error", custom_error, NULL },
         NULL
     };
     struct ini_validator *missing_function[] = {
-        &(struct ini_validator){ "custom_noerror", NULL },
+        &(struct ini_validator){ "custom_noerror", NULL, NULL },
         NULL
     };
     const char *errmsg;

commit 5078bf8cd465289b2bdd8ac0a334ee5eb7500888
Author: Lukas Slebodnik <lslebodn at redhat.com>
Date:   Wed Jun 22 00:50:50 2016 +0200

    INI: Reduce count of argumets for ini_rules_check
    
    We can use NULL terminated array of pointers instead of
    two argumets: array + length of array.
    
    It isn't an API change because lib_iniconfig has not been released yet.
    
    Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>

diff --git a/ini/ini_configobj.c b/ini/ini_configobj.c
index d79a8f3..f7efb88 100644
--- a/ini/ini_configobj.c
+++ b/ini/ini_configobj.c
@@ -1515,10 +1515,9 @@ done:
 
 static ini_validator_func *
 get_validator(char *validator_name,
-              struct ini_validator *validators,
-              int num_validators)
+              struct ini_validator **validators)
 {
-    int i;
+    struct ini_validator *ext_validator;
 
     /* First we check all internal validators */
     if (strcmp(validator_name, "ini_dummy_noerror") == 0) {
@@ -1531,18 +1530,19 @@ get_validator(char *validator_name,
         return ini_allowed_sections;
     }
 
-    /* Now check the custom validators */
     if (validators == NULL) {
         return NULL;
     }
 
-    for (i = 0; i < num_validators; i++) {
+    for (; *validators != NULL; ++validators) {
+        ext_validator = *validators;
+
         /* Skip invalid external validator. Name is required */
-        if (validators[i].name == NULL) {
+        if (ext_validator->name == NULL) {
             continue;
         }
-        if (strcmp(validator_name, validators[i].name) == 0) {
-            return validators[i].func;
+        if (strcmp(validator_name, ext_validator->name) == 0) {
+            return ext_validator->func;
         }
     }
 
@@ -1551,8 +1551,7 @@ get_validator(char *validator_name,
 
 int ini_rules_check(struct ini_cfgobj *rules_obj,
                     struct ini_cfgobj *config_obj,
-                    struct ini_validator *extra_validators,
-                    int num_extra_validators,
+                    struct ini_validator **extra_validators,
                     struct ini_errobj *errobj)
 {
     char **sections;
@@ -1598,8 +1597,7 @@ int ini_rules_check(struct ini_cfgobj *rules_obj,
             }
 
             vname = ini_get_string_config_value(vo, NULL);
-            vfunc = get_validator(vname, extra_validators,
-                                  num_extra_validators);
+            vfunc = get_validator(vname, extra_validators);
             if (vfunc == NULL) {
                 ret = ini_errobj_add_msg(errobj,
                                          "Rule '%s' uses unknown "
diff --git a/ini/ini_configobj.h b/ini/ini_configobj.h
index 4f47e78..648ef87 100644
--- a/ini/ini_configobj.h
+++ b/ini/ini_configobj.h
@@ -2206,11 +2206,9 @@ int ini_rules_read_from_file(const char *filename,
  * @param[in] rules_obj            config object representing the rules
  * @param[in] config_obj           config object representing the
  *                                 configuration
- * @param[in] extra_validators     Array of extrenal validators. Can be
- *                                 NULL if no external validators are
- *                                 used.
- * @param[in] num_extra_validators Number of external validators in
- *                                 extra_validators array.
+ * @param[in] extra_validators     NULL terminated array of external
+ *                                 validators. Can be NULL if no external
+ *                                 validators are used.
  *
  * @param[in] errobj               errobj to store generated errors
  *                                 from validators.
@@ -2219,8 +2217,7 @@ int ini_rules_read_from_file(const char *filename,
  */
 int ini_rules_check(struct ini_cfgobj *rules_obj,
                     struct ini_cfgobj *config_obj,
-                    struct ini_validator *extra_validators,
-                    int num_extra_validators,
+                    struct ini_validator **extra_validators,
                     struct ini_errobj *errobj);
 
 /**
diff --git a/ini/ini_validators_ut_check.c b/ini/ini_validators_ut_check.c
index de8738b..9aadc3c 100644
--- a/ini/ini_validators_ut_check.c
+++ b/ini/ini_validators_ut_check.c
@@ -169,7 +169,7 @@ START_TEST(test_ini_noerror)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
     fail_unless(ini_errobj_no_more_msgs(errobj));
 
@@ -205,7 +205,7 @@ START_TEST(test_ini_error)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate exactly one error */
@@ -225,7 +225,7 @@ START_TEST(test_ini_error)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate exactly one error */
@@ -263,7 +263,7 @@ START_TEST(test_unknown_validator)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate exactly one error */
@@ -299,10 +299,14 @@ START_TEST(test_custom_noerror)
     struct ini_cfgobj *cfg_obj;
     struct ini_errobj *errobj;
     int ret;
-    struct ini_validator noerror = { "custom_noerror", custom_noerror };
-    struct ini_validator missing_name[] = {
-        { NULL, custom_noerror },
-        { "custom_noerror", custom_noerror },
+    struct ini_validator *noerror[] = {
+        &(struct ini_validator){ "custom_noerror", custom_noerror },
+        NULL
+    };
+    struct ini_validator *missing_name[] = {
+        &(struct ini_validator){ NULL, custom_noerror },
+        &(struct ini_validator){ "custom_noerror", custom_noerror },
+        NULL
     };
 
     char input_rules[] =
@@ -320,7 +324,7 @@ START_TEST(test_custom_noerror)
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
     /* Pass the custom validator to ini_rules_check() */
-    ret = ini_rules_check(rules_obj, cfg_obj, &noerror, 1, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, noerror, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate no errors */
@@ -328,7 +332,7 @@ START_TEST(test_custom_noerror)
 
     /* Pass wrong external validator to ini_rules_check() */
     /* It should be skipped */
-    ret = ini_rules_check(rules_obj, cfg_obj, missing_name, 2, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, missing_name, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate no errors */
@@ -346,9 +350,13 @@ START_TEST(test_custom_error)
     struct ini_cfgobj *cfg_obj;
     struct ini_errobj *errobj;
     int ret;
-    struct ini_validator error = { "custom_error", custom_error };
-    struct ini_validator missing_function[] = {
-        { "custom_noerror", NULL },
+    struct ini_validator *error[] = {
+        &(struct ini_validator){ "custom_error", custom_error },
+        NULL
+    };
+    struct ini_validator *missing_function[] = {
+        &(struct ini_validator){ "custom_noerror", NULL },
+        NULL
     };
     const char *errmsg;
 
@@ -367,7 +375,7 @@ START_TEST(test_custom_error)
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
     /* Pass the custom validator to ini_rules_check() */
-    ret = ini_rules_check(rules_obj, cfg_obj, &error, 1, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, error, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate one error */
@@ -384,7 +392,7 @@ START_TEST(test_custom_error)
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
     /* Pass the custom validator to ini_rules_check() */
-    ret = ini_rules_check(rules_obj, cfg_obj, missing_function, 1, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, missing_function, errobj);
 
     /* Should generate one error for missing validator */
     fail_if(ini_errobj_no_more_msgs(errobj));
@@ -433,7 +441,7 @@ START_TEST(test_ini_allowed_options_ok)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate no errors */
@@ -482,7 +490,7 @@ START_TEST(test_ini_allowed_options_no_section)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors (one from rules_check and one
@@ -516,7 +524,7 @@ START_TEST(test_ini_allowed_options_no_section)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors (one from rules_check and one
@@ -576,7 +584,7 @@ START_TEST(test_ini_allowed_options_wrong_regex)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors (one from rules_check and one
@@ -638,7 +646,7 @@ START_TEST(test_ini_allowed_options_typos)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 4 errors */
@@ -681,7 +689,7 @@ START_TEST(test_ini_allowed_sections_str_ok)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 0 errors */
@@ -723,7 +731,7 @@ START_TEST(test_ini_allowed_sections_str_typos)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors */
@@ -778,7 +786,7 @@ START_TEST(test_ini_allowed_sections_str_insensitive)
                     "ini_errobj_create() failed for case_insensitive = %s: %s",
                     case_insensitive_values[i], strerror(ret));
 
-        ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+        ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
         fail_unless(ret == 0,
                     "ini_rules_check() failed for case_insensitive = %s: %s",
                     case_insensitive_values[i], strerror(ret));
@@ -822,7 +830,7 @@ START_TEST(test_ini_allowed_sections_re_ok)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 0 errors */
@@ -862,7 +870,7 @@ START_TEST(test_ini_allowed_sections_re_typos)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors */
@@ -906,7 +914,7 @@ START_TEST(test_ini_allowed_sections_re_insensitive)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 0 errors */
@@ -946,7 +954,7 @@ START_TEST(test_ini_allowed_sections_missing_section)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 1 errors */
@@ -999,7 +1007,7 @@ START_TEST(test_ini_allowed_sections_wrong_regex)
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, errobj);
     fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
 
     /* Should generate 2 errors */

commit 9873816acd0b77c5557524116654ca075870f8ec
Author: Lukas Slebodnik <lslebodn at redhat.com>
Date:   Tue Jun 21 23:01:25 2016 +0200

    INI: Extend validator unit test for corner cases
    
    Reviewed-by: Jakub Hrozek <jhrozek at redhat.com>

diff --git a/ini/ini_validators_ut_check.c b/ini/ini_validators_ut_check.c
index 78dc7d6..de8738b 100644
--- a/ini/ini_validators_ut_check.c
+++ b/ini/ini_validators_ut_check.c
@@ -93,6 +93,11 @@ START_TEST(test_ini_errobj)
     const char TEST_MSG2[] = "Test message two.";
     const char TEST_MSG3[] = "Test message three.";
 
+    ret = ini_errobj_create(NULL);
+    fail_unless(ret == EINVAL,
+                "ini_errobj_create(NULL) failed with wrong error [%s]",
+                strerror(ret));
+
     ret = ini_errobj_create(&errobj);
     fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
 
@@ -186,6 +191,10 @@ START_TEST(test_ini_error)
         "[rule/generate_error]\n"
         "validator = ini_dummy_error\n";
 
+    char input_wrong_rule[] =
+        "[rule/generate_error]\n"
+        "valid = ini_dummy_error\n";
+
     char input_cfg[] =
         "[section]\n"
         "# Content of this file should not matter\n";
@@ -203,13 +212,33 @@ START_TEST(test_ini_error)
     fail_if(ini_errobj_no_more_msgs(errobj));
     errmsg = ini_errobj_get_msg(errobj);
     ret = strcmp(errmsg, "[rule/generate_error]: Error");
-    fail_unless(ret == 0, "Got msg: %s", errmsg);
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
+    ini_errobj_destroy(&errobj);
+    ini_rules_destroy(rules_obj);
+
+    /* test rule with missing validator */
+    create_rules_from_str(input_wrong_rule, &rules_obj);
+
+    ret = ini_errobj_create(&errobj);
+    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+
+    /* Should generate exactly one error */
+    fail_if(ini_errobj_no_more_msgs(errobj));
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg, "Rule 'rule/generate_error' has no validator.");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
     ini_errobj_next(errobj);
     fail_unless(ini_errobj_no_more_msgs(errobj));
 
     ini_errobj_destroy(&errobj);
-    ini_config_destroy(cfg_obj);
     ini_rules_destroy(rules_obj);
+    ini_config_destroy(cfg_obj);
 }
 END_TEST
 
@@ -271,6 +300,10 @@ START_TEST(test_custom_noerror)
     struct ini_errobj *errobj;
     int ret;
     struct ini_validator noerror = { "custom_noerror", custom_noerror };
+    struct ini_validator missing_name[] = {
+        { NULL, custom_noerror },
+        { "custom_noerror", custom_noerror },
+    };
 
     char input_rules[] =
         "[rule/custom_succeed]\n"
@@ -293,6 +326,14 @@ START_TEST(test_custom_noerror)
     /* Should generate no errors */
     fail_unless(ini_errobj_no_more_msgs(errobj));
 
+    /* Pass wrong external validator to ini_rules_check() */
+    /* It should be skipped */
+    ret = ini_rules_check(rules_obj, cfg_obj, missing_name, 2, errobj);
+    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+
+    /* Should generate no errors */
+    fail_unless(ini_errobj_no_more_msgs(errobj), "%s", ini_errobj_get_msg(errobj));
+
     ini_errobj_destroy(&errobj);
     ini_config_destroy(cfg_obj);
     ini_rules_destroy(rules_obj);
@@ -306,6 +347,9 @@ START_TEST(test_custom_error)
     struct ini_errobj *errobj;
     int ret;
     struct ini_validator error = { "custom_error", custom_error };
+    struct ini_validator missing_function[] = {
+        { "custom_noerror", NULL },
+    };
     const char *errmsg;
 
     char input_rules[] =
@@ -330,13 +374,32 @@ START_TEST(test_custom_error)
     fail_if(ini_errobj_no_more_msgs(errobj));
     errmsg = ini_errobj_get_msg(errobj);
     ret = strcmp(errmsg, "[rule/custom_error]: Error");
-    fail_unless(ret == 0, "Got msg: %s", errmsg);
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
     ini_errobj_next(errobj);
     fail_unless(ini_errobj_no_more_msgs(errobj));
 
     ini_errobj_destroy(&errobj);
-    ini_config_destroy(cfg_obj);
+
+    ret = ini_errobj_create(&errobj);
+    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+
+    /* Pass the custom validator to ini_rules_check() */
+    ret = ini_rules_check(rules_obj, cfg_obj, missing_function, 1, errobj);
+
+    /* Should generate one error for missing validator */
+    fail_if(ini_errobj_no_more_msgs(errobj));
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "Rule 'rule/custom_error' uses unknown validator "
+                 "'custom_error'.");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
+    ini_errobj_destroy(&errobj);
+
     ini_rules_destroy(rules_obj);
+    ini_config_destroy(cfg_obj);
 }
 END_TEST
 
@@ -389,6 +452,7 @@ START_TEST(test_ini_allowed_options_no_section)
     struct ini_errobj *errobj;
     int ret;
     size_t num_err;
+    const char *errmsg;
 
     /* Ommit section_re to generate error */
     char input_rules[] =
@@ -398,6 +462,14 @@ START_TEST(test_ini_allowed_options_no_section)
         "option = bar\n"
         "option = baz\n";
 
+    /* section_re without value */
+    char input_rules2[] =
+        "[rule/options_for_foo]\n"
+        "validator = ini_allowed_options\n"
+        "section_re = \n"
+        "option = bar\n"
+        "option = baz\n";
+
     /* Make 4 typos */
     char input_cfg[] =
         "[foo]\n"
@@ -420,6 +492,116 @@ START_TEST(test_ini_allowed_options_no_section)
     num_err = ini_errobj_count(errobj);
     fail_unless(num_err == 2, "Expected 2 errors, got %d", num_err);
 
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "Rule 'rule/options_for_foo' returned error code '22'");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "[rule/options_for_foo]: Validator misses 'section_re' "
+                 "parameter");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
+    ini_errobj_destroy(&errobj);
+    ini_rules_destroy(rules_obj);
+
+    /* the second test with missing value for section_re */
+
+    create_rules_from_str(input_rules2, &rules_obj);
+
+    ret = ini_errobj_create(&errobj);
+    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+
+    /* Should generate 2 errors (one from rules_check and one
+     * from the validator itself) */
+    fail_if(ini_errobj_no_more_msgs(errobj));
+
+    num_err = ini_errobj_count(errobj);
+    fail_unless(num_err == 2, "Expected 2 errors, got %d", num_err);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "Rule 'rule/options_for_foo' returned error code '22'");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "[rule/options_for_foo]: Validator misses 'section_re' "
+                 "parameter");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
+    ini_errobj_destroy(&errobj);
+    ini_rules_destroy(rules_obj);
+
+    ini_config_destroy(cfg_obj);
+}
+END_TEST
+
+START_TEST(test_ini_allowed_options_wrong_regex)
+{
+    struct ini_cfgobj *rules_obj;
+    struct ini_cfgobj *cfg_obj;
+    struct ini_errobj *errobj;
+    int ret;
+    size_t num_err;
+    const char *errmsg;
+
+    /* Ommit section_re to generate error */
+    char input_rules[] =
+        "[rule/options_for_foo]\n"
+        "validator = ini_allowed_options\n"
+        "section_re = ^foo[$\n"
+        "option = bar\n"
+        "option = baz\n";
+
+    /* Make 4 typos */
+    char input_cfg[] =
+        "[foo]\n"
+        "bar = 0\n"
+        "baz = 0\n";
+
+    create_rules_from_str(input_rules, &rules_obj);
+    cfg_obj = get_ini_config_from_str(input_cfg, sizeof(input_cfg));
+
+    ret = ini_errobj_create(&errobj);
+    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+
+    /* Should generate 2 errors (one from rules_check and one
+     * from the validator itself) */
+    fail_if(ini_errobj_no_more_msgs(errobj));
+
+    num_err = ini_errobj_count(errobj);
+    fail_unless(num_err == 2, "Expected 2 errors, got %d", num_err);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "Rule 'rule/options_for_foo' returned error code '22'");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "[rule/options_for_foo]: Cannot compile regular expression "
+                 "from option 'section_re'. "
+                 "Error: 'Unmatched [ or [^'");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
     ini_errobj_destroy(&errobj);
     ini_config_destroy(cfg_obj);
     ini_rules_destroy(rules_obj);
@@ -562,15 +744,20 @@ START_TEST(test_ini_allowed_sections_str_insensitive)
     struct ini_cfgobj *cfg_obj;
     struct ini_errobj *errobj;
     int ret;
+    int i;
 
     /* Only bar and baz are allowed for foo section */
-    char input_rules[] =
+    char input_rules_template[] =
         "[rule/section_list]\n"
         "validator = ini_allowed_sections\n"
-        "case_insensitive = yes\n"
+        "case_insensitive = %s\n"
         "section = foo\n"
         "section = bar\n";
 
+    char input_rules[sizeof(input_rules_template) + 10];
+
+    const char *case_insensitive_values[] = { "yes", "Yes", "true", "True",
+                                              "1", NULL };
     /* Make 4 typos */
     char input_cfg[] =
         "[FOo]\n"
@@ -579,21 +766,33 @@ START_TEST(test_ini_allowed_sections_str_insensitive)
         "[baR]\n"
         "abz = 0\n";
 
-    create_rules_from_str(input_rules, &rules_obj);
     cfg_obj = get_ini_config_from_str(input_cfg, sizeof(input_cfg));
 
-    ret = ini_errobj_create(&errobj);
-    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+    for (i = 0; case_insensitive_values[i] != NULL; i++) {
+        sprintf(input_rules, input_rules_template, case_insensitive_values[i]);
 
-    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
-    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+        create_rules_from_str(input_rules, &rules_obj);
 
-    /* Should generate 0 errors */
-    fail_unless(ini_errobj_no_more_msgs(errobj), "Unexpected errors found");
+        ret = ini_errobj_create(&errobj);
+        fail_unless(ret == 0,
+                    "ini_errobj_create() failed for case_insensitive = %s: %s",
+                    case_insensitive_values[i], strerror(ret));
+
+        ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+        fail_unless(ret == 0,
+                    "ini_rules_check() failed for case_insensitive = %s: %s",
+                    case_insensitive_values[i], strerror(ret));
+
+        /* Should generate 0 errors */
+        fail_unless(ini_errobj_no_more_msgs(errobj),
+                    "Unexpected errors found for case_insensitive = %s: [%s]",
+                    case_insensitive_values[i], ini_errobj_get_msg(errobj));
+
+        ini_errobj_destroy(&errobj);
+        ini_rules_destroy(rules_obj);
+    }
 
-    ini_errobj_destroy(&errobj);
     ini_config_destroy(cfg_obj);
-    ini_rules_destroy(rules_obj);
 }
 END_TEST
 
@@ -719,6 +918,117 @@ START_TEST(test_ini_allowed_sections_re_insensitive)
 }
 END_TEST
 
+START_TEST(test_ini_allowed_sections_missing_section)
+{
+    struct ini_cfgobj *rules_obj;
+    struct ini_cfgobj *cfg_obj;
+    struct ini_errobj *errobj;
+    int num_err;
+    int ret;
+    const char *errmsg;
+
+    /* Only bar and baz are allowed for foo section */
+    char input_rules[] =
+        "[rule/section_list]\n"
+        "validator = ini_allowed_sections\n";
+
+    /* Make 4 typos */
+    char input_cfg[] =
+        "[fooo]\n"
+        "br = 0\n"
+        "bra = 0\n"
+        "[baar]\n"
+        "abz = 0\n";
+
+    create_rules_from_str(input_rules, &rules_obj);
+    cfg_obj = get_ini_config_from_str(input_cfg, sizeof(input_cfg));
+
+    ret = ini_errobj_create(&errobj);
+    fail_unless(ret == 0, "ini_errobj_create() failed: %s", strerror(ret));
+
+    ret = ini_rules_check(rules_obj, cfg_obj, NULL, 0, errobj);
+    fail_unless(ret == 0, "ini_rules_check() failed: %s", strerror(ret));
+
+    /* Should generate 1 errors */
+    fail_if(ini_errobj_no_more_msgs(errobj),
+            "Expected 1 errors but none found");
+    num_err = ini_errobj_count(errobj);
+    fail_unless(num_err == 1, "Expected 1 errors, got %d", num_err);
+
+    errmsg = ini_errobj_get_msg(errobj);
+    ret = strcmp(errmsg,
+                 "[rule/section_list]: No allowed sections specified. "
+                 "Use 'section = default' to allow only default section");
+    fail_unless(ret == 0, "Got msg: [%s]", errmsg);
+    ini_errobj_next(errobj);
+
+    fail_unless(ini_errobj_no_more_msgs(errobj));
+
+    ini_errobj_destroy(&errobj);
+    ini_config_destroy(cfg_obj);
+    ini_rules_destroy(rules_obj);
+}
+END_TEST
+
+START_TEST(test_ini_allowed_sections_wrong_regex)
+{
+    struct ini_cfgobj *rules_obj;
+    struct ini_cfgobj *cfg_obj;
+    struct ini_errobj *errobj;
+    int num_err;
+    int ret;
+    const char *errmsg;
+
+    /* Only bar and baz are allowed for foo section */
+    char input_rules[] =
+        "[rule/section_list]\n"
+        "validator = ini_allowed_sections\n"
+        "section_re = ^foo\\(*$\n";
+
+    /* Make 4 typos */
+    char input_cfg[] =
+        "[fooo]\n"
+        "br = 0\n"
+        "bra = 0\n"



More information about the Pkg-sssd-devel mailing list