From b11b90b260a2072611fc8c51e6489e7622fe573d Mon Sep 17 00:00:00 2001
From: Dmitri Pal <dpal@redhat.com>
Date: Fri, 13 Jul 2012 19:12:13 -0400
Subject: [PATCH 08/11] [INI] Added new tests for the multi value keys

---
 ini/ini.d/real.conf |    3 +
 ini/ini_parse_ut.c  | 1133 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1136 insertions(+), 0 deletions(-)

diff --git a/ini/ini.d/real.conf b/ini/ini.d/real.conf
index 4d5a319..32bc9da 100644
--- a/ini/ini.d/real.conf
+++ b/ini/ini.d/real.conf
@@ -45,10 +45,13 @@ provider = ipa
 server = ipaserver1.example.com
 server = ipabackupserver.example.com
 legacy = FALSE
+server = otheripabackupserver.example.com
 enumerate = 0
 binary_test = '010203'
+binary_test_two = '0A0b0C'
 long_array = 1  2; 4' ;8p .16/ 32?
 double_array = 1.1  2.222222; .4' . ;8p .16/ -32?
+server = yetanotheripabackupserver.example.com
 empty_value =
 space_value = " "
 int32_t = -1000000000
diff --git a/ini/ini_parse_ut.c b/ini/ini_parse_ut.c
index 73b618e..bd90613 100644
--- a/ini/ini_parse_ut.c
+++ b/ini/ini_parse_ut.c
@@ -973,6 +973,1138 @@ int reload_test(void)
     return 0;
 }
 
+int get_test(void)
+{
+
+    int error;
+    int number;
+    long number_long;
+    double number_double;
+    unsigned number_unsigned;
+    unsigned long number_ulong;
+    unsigned char logical;
+    char *str;
+    const char *cstr;
+    const char *cstrn;
+    void *binary;
+    int length;
+    int i = 0;
+    char **strarray;
+    char **strptr;
+    int size;
+    long *array;
+    double *darray;
+    char **prop_array;
+    int32_t val_int32;
+    uint32_t val_uint32;
+    int64_t val_int64;
+    uint64_t val_uint64;
+    struct ini_cfgfile *file_ctx = NULL;
+    struct ini_cfgobj *ini_config = NULL;
+    struct value_obj *vo = NULL;
+    char **error_list = NULL;
+    char infile[PATH_MAX];
+    char *srcdir = NULL;
+    int bad_val = 0;
+
+    INIOUT(printf("\n\n<==== GET TEST START =====>\n"));
+    INIOUT(printf("Creating configuration object\n"));
+
+    /* Create config collection */
+    error = ini_config_create(&ini_config);
+    if (error) {
+        printf("Failed to create collection. Error %d.\n", error);
+        return error;
+    }
+
+    srcdir = getenv("srcdir");
+    sprintf(infile, "%s/ini/ini.d/real.conf", (srcdir == NULL) ? "." : srcdir);
+
+    INIOUT(printf("Reading file %s\n", infile));
+
+    error = ini_config_file_open(infile,
+                                 INI_STOP_ON_NONE,
+                                 /* Merge section but allow duplicates */
+                                 INI_MS_MERGE |
+                                 INI_MV1S_ALLOW |
+                                 INI_MV2S_ALLOW,
+                                 0,
+                                 &file_ctx);
+    if (error) {
+        printf("Failed to open file for reading. Error %d.\n",  error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    error = ini_config_parse(file_ctx,
+                             ini_config);
+    if (error) {
+        INIOUT(printf("Failed to parse configuration. Error %d.\n", error));
+
+        if (ini_config_error_count(file_ctx)) {
+            INIOUT(printf("Errors detected while parsing: %s\n",
+                   ini_config_get_filename(file_ctx)));
+            ini_config_get_errors(file_ctx, &error_list);
+            INIOUT(ini_config_print_errors(stdout, error_list));
+            ini_config_free_errors(error_list);
+        }
+        /* We do not return here intentionally */
+    }
+
+    ini_config_file_destroy(file_ctx);
+
+    INIOUT(printf("Negtive test - trying to get non"
+                  " existing key-value pair.\n"));
+
+    /* Negative test */
+    vo = NULL;
+    error = ini_get_config_valueobj("monitor1",
+                                    "description1",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Values should not be found */
+    if (vo != NULL) {
+        printf("Expected NULL but got something else!\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    /* Another negative test but section exists this time */
+    vo = NULL;
+    error = ini_get_config_valueobj("monitor",
+                                    "description1",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Valueobj should not be found */
+    if(vo != NULL) {
+        printf("Expected NULL but got something else!\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Trying to get a value.\n"));
+
+    /* Positive test */
+    vo = NULL;
+    error = ini_get_config_valueobj("monitor",
+                                    "description",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected value but got NULL!\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("description", vo));
+
+    INIOUT(printf("Get values as string without duplication"
+                  " from the NULL valueobj.\n"));
+
+    /* Get a string without duplicication */
+    /* Negative test */
+    cstrn = ini_get_const_string_config_value(NULL, NULL);
+    if (cstrn != NULL) {
+        printf("Expected error got success.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Get value as string without duplication"
+                  "from the correct value object.\n"));
+
+    /* Now get string from the right value object */
+    error = 0;
+    cstr = ini_get_const_string_config_value(vo, &error);
+    if (error) {
+        printf("Expected success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Value: [%s]\n", cstr));
+
+    /* Same thing but create a dup */
+
+    INIOUT(printf("Get value as string with duplication"
+                  " from correct value object.\n"));
+
+    error = 0;
+    str = ini_get_string_config_value(vo, &error);
+    if (error) {
+        printf("Expected success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Value: [%s]\n", str));
+    free(str);
+
+
+    /* Get a badly formated number */
+    INIOUT(printf("Convert value to number with strict conversion.\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("monitor",
+                                    "bad_number",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected value but got something NULL!\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("bad_number", vo));
+
+    /* Now try to get value in different ways */
+    error = 0;
+    number = ini_get_int_config_value(vo, 1, 10, &error);
+    if (error) {
+        /* We expected error in this case */
+        INIOUT(printf("Expected error.\n"));
+        if(number != 10) {
+            printf("It failed to set default value.\n");
+            ini_config_destroy(ini_config);
+            return -1;
+        }
+    }
+    else {
+        printf("Expected error got success.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Convert value to number without strict conversion.\n"));
+
+    error = 0;
+    number = 1;
+    number = ini_get_int_config_value(vo, 0, 10, &error);
+    if (error) {
+        printf("Did not expect error.\n");
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    if (number != 5) {
+        printf("We expected that the conversion will return 5.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    /* Get real integer */
+
+    INIOUT(printf("Fetch another value from section \"domains/LOCAL\""
+                  " named \"enumerate\".\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/LOCAL",
+                                    "enumerate",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Convert value to integer.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    number = ini_get_int_config_value(vo, 1, 100, &error);
+    if (error) {
+        printf("Did not expect error. Got %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* It is 3 in the file */
+    if (number != 3) {
+        printf("We expected that the conversion will return 3.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Expected 3 got %d\n", number));
+
+    INIOUT(printf("Convert value to long.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    number_long = ini_get_long_config_value(vo, 1, 100, &error);
+    if (error) {
+        printf("Did not expect error. Got %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* It is 3 in the file */
+    if (number_long != 3) {
+        printf("We expected that the conversion will return 3.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Expected 3 got %ld\n", number_long));
+
+    INIOUT(printf("Convert value to unsigned.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    number_unsigned = ini_get_unsigned_config_value(vo, 1, 100, &error);
+    if (error) {
+        printf("Did not expect error. Got %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* It is 3 in the file */
+    if (number_unsigned != 3) {
+        printf("We expected that the conversion will return 3.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Expected 3 got %d\n", number_unsigned));
+
+    INIOUT(printf("Convert value to unsigned long.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    number_ulong = ini_get_ulong_config_value(vo, 1, 100, &error);
+    if (error) {
+        printf("Did not expect error. Got %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* It is 3 in the file */
+    if (number_ulong != 3) {
+        printf("We expected that the conversion will return 3.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Expected 3 got %lu\n", number_ulong));
+
+    INIOUT(printf("Convert value to double.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    number_double = ini_get_double_config_value(vo, 1, 100., &error);
+    if (error) {
+        printf("Did not expect error. Got %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* It is 3 in the file */
+    if (number_double != 3.) {
+        printf("We expected that the conversion will return 3.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Expected 3 got %e\n", number_double));
+
+    INIOUT(printf("Convert value to bool.\n"));
+
+    /* Take number out of it */
+    error = 0;
+    logical = ini_get_bool_config_value(vo, 1, &error);
+    if (!error) {
+        printf("Expect error. Got success.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    /* Get real bool values and convert it */
+    INIOUT(printf("Get real bool value \"legacy\" and convert it.\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/LOCAL",
+                                    "legacy",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n",error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Convert values to bool.\n"));
+
+    error = 0;
+    logical = ini_get_bool_config_value(vo, 1, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    if (logical) {
+        printf("Expected false but got true - bad.\n");
+        return -1;
+    }
+
+    INIOUT(printf("In the files it is FALSE so we got false.\n"));
+
+    INIOUT(printf("Get binary value\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "binary_test",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("binary_test", vo));
+
+    error = 0;
+    binary = ini_get_bin_config_value(vo, &length, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Binary value (expect 123) = "));
+    INIOUT(for (i = 0; i < length; i++) {
+                printf("%d",*((unsigned char*)(binary) + i));
+                if (*((unsigned char*)(binary) + i) != (i + 1)) bad_val = 1;
+           });
+    INIOUT(printf("\n"));
+
+    ini_free_bin_config_value(binary);
+
+    if (bad_val) {
+        printf("Unexpected binary value.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Get another binary value\n"));
+
+    bad_val = 0;
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "binary_test_two",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("binary_test_two", vo));
+
+    error = 0;
+    binary = ini_get_bin_config_value(vo, &length, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Binary value (expect abc) = "));
+    INIOUT(for (i = 0; i < length; i++) {
+                printf("%x",*((unsigned char*)(binary) + i));
+                if (*((unsigned char*)(binary) + i) - 10 != i) bad_val = 1;
+           });
+    INIOUT(printf("\n"));
+
+    ini_free_bin_config_value(binary);
+
+    if (bad_val) {
+        printf("Unexpected binary value.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(printf("Get string array value\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains",
+                                    "domainsorder",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if(error) {
+        printf("Expected success but got error! %d\n",error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("domainsorder", vo));
+
+    INIOUT(printf("Get str array without size.\n"));
+
+    error = 0;
+    strarray = ini_get_string_config_array(vo, ",", NULL, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    strptr = strarray;
+    while (*strptr != NULL) {
+        INIOUT(printf("[%s]\n",*strptr));
+        strptr++;
+    }
+
+    ini_free_string_config_array(strarray);
+
+    INIOUT(printf("Get raw str array without size.\n"));
+
+    error = 0;
+    strarray = ini_get_raw_string_config_array(vo, ",", NULL, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    strptr = strarray;
+    while (*strptr != NULL) {
+        INIOUT(printf("[%s]\n",*strptr));
+        strptr++;
+    }
+
+    ini_free_string_config_array(strarray);
+
+    INIOUT(printf("Get str array with size.\n"));
+
+    error = 0;
+    size = 0;
+    strarray = ini_get_string_config_array(vo, ",", &size, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    INIOUT(for (i=0;i<size;i++) printf("[%s]\n",*(strarray + i)));
+
+    ini_free_string_config_array(strarray);
+
+    INIOUT(printf("Get raw str array with size.\n"));
+
+    error = 0;
+    size = 0;
+    strarray = ini_get_raw_string_config_array(vo, ",", &size, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    INIOUT(for (i=0;i<size;i++) printf("[%s]\n",*(strarray + i)));
+
+    ini_free_string_config_array(strarray);
+
+    /**********************************************************/
+
+    INIOUT(printf("Get bad string array \n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains",
+                                    "badarray",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if(error) {
+        printf("Expected success but got error! %d\n",error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("badarray", vo));
+
+    INIOUT(printf("Get bad str array without size.\n"));
+
+    error = 0;
+    strarray = ini_get_string_config_array(vo, ",", NULL, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    strptr = strarray;
+    while (*strptr != NULL) {
+        INIOUT(printf("[%s]\n",*strptr));
+        strptr++;
+    }
+
+    ini_free_string_config_array(strarray);
+
+    /**********************************************************/
+
+    INIOUT(printf("Get long array value\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "long_array",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if(error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("long_array", vo));
+
+    error = 0;
+    size = 0; /* Here size is not optional!!! */
+    array = ini_get_long_config_array(vo, &size, &error);
+    if(error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    INIOUT(for (i=0;i<size;i++) printf("%ld\n", *(array + i)));
+
+    ini_free_long_config_array(array);
+
+    INIOUT(printf("Get double array value\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "double_array",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Values should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("double_array", vo));
+
+    error = 0;
+    size = 0; /* Here size is not optional!!! */
+    darray = ini_get_double_config_array(vo, &size, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Can be used with this cycle */
+    INIOUT(for (i=0;i<size;i++) printf("%.4f\n", darray[i]));
+
+    ini_free_double_config_array(darray);
+
+    INIOUT(printf("\n\nSection list - no size\n"));
+
+    /* Do not care about the error or size */
+    prop_array = ini_get_section_list(ini_config, NULL, NULL);
+    if (prop_array == NULL) {
+        printf("Expect success got error.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    i = 0;
+    INIOUT(while (prop_array[i]) {
+               printf("Section: [%s]\n", prop_array[i]);
+               i++;
+           });
+
+    ini_free_section_list(prop_array);
+
+    INIOUT(printf("\n\nSection list - with size\n"));
+
+    /* Do not care about the error or size */
+    prop_array = ini_get_section_list(ini_config, &size, NULL);
+    if (prop_array == NULL) {
+        printf("Expect success got error.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(for (i=0;i<size;i++) printf("Section: [%s]\n", prop_array[i]));
+    ini_free_section_list(prop_array);
+
+    INIOUT(printf("\n\nAttributes in the section - with size and error\n"));
+
+    /* Do not care about the error or size */
+    prop_array = ini_get_attribute_list(ini_config,
+                                    "domains/EXAMPLE.COM",
+                                    &size,
+                                    &error);
+    if (prop_array == NULL) {
+        printf("Expect success got error.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(for (i=0;i<size;i++) printf("Attribute: [%s]\n", prop_array[i]));
+    ini_free_attribute_list(prop_array);
+
+
+    /***************************************/
+    /* Test special types                  */
+    /***************************************/
+    INIOUT(printf("Test int32_t\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "int32_t",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("int32_t", vo));
+
+    error = 0;
+    val_int32 = ini_get_int32_config_value(vo, 1, 0, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Value: %d\n", val_int32));
+
+    /***************************************/
+
+    INIOUT(printf("Test uint32_t\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "uint32_t",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Valu should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("uint32_t", vo));
+
+    error = 0;
+    val_uint32 = ini_get_uint32_config_value(vo, 1, 0, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+   }
+
+    INIOUT(printf("Value: %u\n", val_uint32));
+
+    /***************************************/
+
+    INIOUT(printf("Test int64_t\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "int64_t",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("int64_t", vo));
+
+    error = 0;
+    val_int64 = ini_get_int64_config_value(vo, 1, 0, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Value: %lld\n", (long long)val_int64));
+
+    /***************************************/
+
+    INIOUT(printf("Test uint32_t\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "uint64_t",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if (error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("uint64_t", vo));
+
+    error = 0;
+    val_uint64 = ini_get_uint64_config_value(vo, 1, 0, &error);
+    if (error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    INIOUT(printf("Value: %llu\n", (unsigned long long)val_uint64));
+
+    /***************************************/
+
+    INIOUT(printf("Get empty array value object\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "empty_value",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if(error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("empty_value", vo));
+
+    error = 0;
+    size = 0; /* Here size is not optional!!! */
+    strarray = ini_get_string_config_array(vo, ",", &size, &error);
+    if(error) {
+        printf("Expect success got error %d.\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    if (size != 0) {
+        for (i=0; i<size; i++) printf("%s\n", *(strarray + i));
+        printf("Expected size=0, got size=%d\n", size);
+        ini_free_string_config_array(strarray);
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    ini_free_string_config_array(strarray);
+
+    /***************************************/
+
+    INIOUT(printf("\nGet sequence of the multi-value keys\n"));
+
+    vo = NULL;
+    error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                    "server",
+                                    ini_config,
+                                    INI_GET_FIRST_VALUE,
+                                    &vo);
+    if(error) {
+        printf("Expected success but got error! %d\n", error);
+        ini_config_destroy(ini_config);
+        return error;
+    }
+
+    /* Value should be found */
+    if (vo == NULL) {
+        printf("Expected success but got NULL.\n");
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    INIOUT(value_print("server", vo));
+
+    do {
+
+        vo = NULL;
+        error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                        "server",
+                                        ini_config,
+                                        INI_GET_NEXT_VALUE,
+                                    &vo);
+        if(error) {
+            printf("Expected success but got error! %d\n", error);
+            ini_config_destroy(ini_config);
+            return error;
+        }
+
+        if (vo == NULL) break;
+
+        INIOUT(value_print("server", vo));
+    }
+    while(1);
+
+    /***************************************/
+
+    INIOUT(printf("\nGet multi-value keys without prefetching\n"));
+
+    do {
+
+        vo = NULL;
+        error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                        "server",
+                                        ini_config,
+                                        INI_GET_NEXT_VALUE,
+                                    &vo);
+        if(error) {
+            printf("Expected success but got error! %d\n", error);
+            ini_config_destroy(ini_config);
+            return error;
+        }
+
+        if (vo == NULL) break;
+
+        INIOUT(value_print("server", vo));
+    }
+    while(1);
+
+    /***************************************/
+
+    INIOUT(printf("\nGet multi-value keys with key interrupt\n"));
+
+    i = 0;
+
+    vo = NULL;
+    do {
+
+        vo = NULL;
+        error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                        "server",
+                                        ini_config,
+                                        INI_GET_NEXT_VALUE,
+                                    &vo);
+        if(error) {
+            printf("Expected success but got error! %d\n", error);
+            ini_config_destroy(ini_config);
+            return error;
+        }
+
+        if (vo == NULL) break;
+
+        INIOUT(value_print("server", vo));
+        i++;
+
+        if (i==2) {
+            vo = NULL;
+            error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                            "empty_value",
+                                            ini_config,
+                                            INI_GET_NEXT_VALUE,
+                                        &vo);
+            if(error) {
+                printf("Expected success but got error! %d\n", error);
+                ini_config_destroy(ini_config);
+                return error;
+            }
+        }
+    }
+    while(1);
+
+    if (i != 6) {
+        printf("Expected 6 iterations got %d\n", i);
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    /***************************************/
+
+    INIOUT(printf("\nGet multi-value keys with key interrupt\n"));
+
+    i = 0;
+
+    vo = NULL;
+    do {
+
+        vo = NULL;
+        error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+                                        "server",
+                                        ini_config,
+                                        INI_GET_NEXT_VALUE,
+                                    &vo);
+        if(error) {
+            printf("Expected success but got error! %d\n", error);
+            ini_config_destroy(ini_config);
+            return error;
+        }
+
+        if (vo == NULL) break;
+
+        INIOUT(value_print("server", vo));
+        i++;
+
+        if (i==2) {
+            vo = NULL;
+            error = ini_get_config_valueobj("domains",
+                                            "badarray",
+                                            ini_config,
+                                            INI_GET_NEXT_VALUE,
+                                        &vo);
+            if(error) {
+                printf("Expected success but got error! %d\n", error);
+                ini_config_destroy(ini_config);
+                return error;
+            }
+        }
+    }
+    while(1);
+
+    if (i != 6) {
+        printf("Expected 6 iterations got %d\n", i);
+        ini_config_destroy(ini_config);
+        return -1;
+    }
+
+    ini_config_destroy(ini_config);
+
+    INIOUT(printf("\n<==== GET TEST END =====>\n\n"));
+    return EOK;
+}
 
 
 /* Main function of the unit test */
@@ -985,6 +2117,7 @@ int main(int argc, char *argv[])
                         merge_section_test,
                         startup_test,
                         reload_test,
+                        get_test,
                         NULL };
     test_fn t;
     int i = 0;
-- 
1.7.1

