Annotation of embedaddon/confuse/tests/suite_validate.c, revision 1.1.1.1

1.1       misho       1: #include "check_confuse.h"
                      2: #include <string.h>
                      3: #include <sys/types.h>
                      4: #include <sys/socket.h>
                      5: #include <netinet/in.h>
                      6: #include <arpa/inet.h>
                      7: 
                      8: static cfg_t *cfg = 0;
                      9: 
                     10: #define ACTION_NONE 0
                     11: #define ACTION_RUN 1
                     12: #define ACTION_WALK 2
                     13: #define ACTION_CRAWL 3
                     14: #define ACTION_JUMP 4
                     15: 
                     16: int parse_action(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result)
                     17: {
                     18:     if(strcmp(value, "run") == 0)
                     19:         *(int *)result = ACTION_RUN;
                     20:     else if(strcmp(value, "walk") == 0)
                     21:         *(int *)result = ACTION_WALK;
                     22:     else if(strcmp(value, "crawl") == 0)
                     23:         *(int *)result = ACTION_CRAWL;
                     24:     else if(strcmp(value, "jump") == 0)
                     25:         *(int *)result = ACTION_JUMP;
                     26:     else
                     27:     {
                     28:         /* cfg_error(cfg, "Invalid action value '%s'", value); */
                     29:         return -1;
                     30:     }
                     31:     return 0;
                     32: }
                     33: 
                     34: int validate_speed(cfg_t *cfg, cfg_opt_t *opt)
                     35: {
                     36:     int i;
                     37: 
                     38:     for(i = 0; i < cfg_opt_size(opt); i++)
                     39:     {
                     40:         if(cfg_opt_getnint(opt, i) <= 0)
                     41:         {
                     42:             /* cfg_error(cfg, "speed must be positive in section %s", cfg->name); */
                     43:             return 1;
                     44:         }
                     45:     }
                     46:     return 0;
                     47: }
                     48: 
                     49: int validate_ip(cfg_t *cfg, cfg_opt_t *opt)
                     50: {
                     51:     int i;
                     52: 
                     53:     for(i = 0; i < cfg_opt_size(opt); i++)
                     54:     {
                     55:         struct in_addr addr;
                     56:         char *ip = cfg_opt_getnstr(opt, i);
                     57:         if(inet_aton(ip, &addr) == 0)
                     58:         {
                     59:             /* cfg_error(cfg, "invalid IP address %s in section %s", ip, cfg->name); */
                     60:             return 1;
                     61:         }
                     62:     }
                     63:     return 0;
                     64: }
                     65: 
                     66: int validate_action(cfg_t *cfg, cfg_opt_t *opt)
                     67: {
                     68:     cfg_opt_t *name_opt;
                     69:     cfg_t *action_sec = cfg_opt_getnsec(opt, 0);
                     70: 
                     71:     fail_unless(action_sec != 0);
                     72: 
                     73:     name_opt = cfg_getopt(action_sec, "name");
                     74: 
                     75:     fail_unless(name_opt != 0);
                     76:     fail_unless(cfg_opt_size(name_opt) == 1);
                     77: 
                     78:     if(cfg_opt_getnstr(name_opt, 0) == NULL)
                     79:     {
                     80:         /* cfg_error(cfg, "missing required option 'name' in section %s", opt->name); */
                     81:         return 1;
                     82:     }
                     83:     return 0;
                     84: }
                     85: 
                     86: void validate_setup(void)
                     87: {
                     88:     cfg_opt_t *opt = 0;
                     89: 
                     90:     cfg_opt_t action_opts[] =
                     91:     {
                     92:         CFG_INT("speed", 0, CFGF_NONE),
                     93:         CFG_STR("name", 0, CFGF_NONE),
                     94:         CFG_INT("xspeed", 0, CFGF_NONE),
                     95:         CFG_END()
                     96:     };
                     97: 
                     98:     cfg_opt_t multi_opts[] =
                     99:     {
                    100:         CFG_INT_LIST("speeds", 0, CFGF_NONE),
                    101:         //{"speeds",CFGT_INT,0,0,CFGF_LIST,0,{0,0,cfg_false,0,0},0,0,0,validate_speed,0},
                    102:         CFG_SEC("options", action_opts, CFGF_NONE),
                    103:         CFG_END()
                    104:     };
                    105: 
                    106:     cfg_opt_t opts[] = 
                    107:     {
                    108:         CFG_STR_LIST("ip-address", 0, CFGF_NONE),
                    109:         CFG_INT_CB("action", ACTION_NONE, CFGF_NONE, parse_action),
                    110:         CFG_SEC("options", action_opts, CFGF_NONE),
                    111:         CFG_SEC("multi_options", multi_opts, CFGF_MULTI),
                    112:         CFG_END()
                    113:     };
                    114: 
                    115:     cfg = cfg_init(opts, 0);
                    116: 
                    117:     cfg_set_validate_func(cfg, "ip-address", validate_ip);
                    118:     fail_unless(cfg_set_validate_func(cfg, "ip-address", validate_ip) == validate_ip);
                    119:     opt = cfg_getopt(cfg, "ip-address");
                    120:     fail_unless(opt != 0);
                    121:     fail_unless(opt->validcb == validate_ip);
                    122: 
                    123:     cfg_set_validate_func(cfg, "options", validate_action);
                    124:     fail_unless(cfg_set_validate_func(cfg, "options", validate_action) == validate_action);
                    125:     opt = cfg_getopt(cfg, "options");
                    126:     fail_unless(opt != 0);
                    127:     fail_unless(opt->validcb == validate_action);
                    128: 
                    129:     cfg_set_validate_func(cfg, "options|speed", validate_speed);
                    130:     fail_unless(cfg_set_validate_func(cfg, "options|speed", validate_speed) == validate_speed);
                    131:     opt = cfg_getopt(cfg, "options|speed");
                    132:     fail_unless(opt != 0);
                    133:     fail_unless(opt->validcb == validate_speed);
                    134: 
                    135:     cfg_set_validate_func(cfg, "multi_options|speeds", validate_speed);
                    136:     fail_unless(cfg_set_validate_func(cfg, "multi_options|speeds", validate_speed) == validate_speed);
                    137: 
                    138:     cfg_set_validate_func(cfg, "multi_options|options|xspeed", validate_speed);
                    139:     fail_unless(cfg_set_validate_func(cfg, "multi_options|options|xspeed", validate_speed) == validate_speed);
                    140: }
                    141: 
                    142: void validate_teardown(void)
                    143: {
                    144:     cfg_free(cfg);
                    145: }
                    146: 
                    147: void validate_test(void)
                    148: {
                    149:     char *buf;
                    150:     int i;
                    151: 
                    152:     buf = "action = wlak";
                    153:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    154: 
                    155:     buf = "action = walk";
                    156:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
                    157: 
                    158:     buf = "action = run"
                    159:           " options { speed = 6 }";
                    160:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    161: 
                    162:     buf = "action = jump"
                    163:           " options { speed = 2 name = 'Joe' }";
                    164:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
                    165: 
                    166:     buf = "action = crawl"
                    167:           " options { speed = -2 name = 'Smith' }";
                    168:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    169: 
                    170:     buf = "ip-address = { 0.0.0.0 , 1.2.3.4 , 192.168.0.254 , 10.0.0.255 , 20.30.40.256}";
                    171:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    172:     buf = "ip-address = { 0.0.0.0 , 1.2.3.4 , 192.168.0.254 , 10.0.0.255 , 20.30.40.250}";
                    173:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
                    174:     buf = "ip-address = { 1.2.3. }";
                    175:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    176: 
                    177:     buf = "action = run"
                    178:           " multi_options { speeds = {1, 2, 3, 4, 5} }";
                    179:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
                    180:     for(i = 0; i < cfg_size(cfg, "multi_options"); i++)
                    181:     {
                    182:         cfg_t *multisec = cfg_getnsec(cfg, "multi_options", i);
                    183:         cfg_opt_t *speeds_opt = cfg_getopt(multisec, "speeds");
                    184:         fail_unless(speeds_opt != 0);
                    185:         fail_unless(speeds_opt->validcb == validate_speed);
                    186:     }
                    187: 
                    188:     buf = "action = run"
                    189:           " multi_options { speeds = {1, 2, 3, -4, 5} }";
                    190:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    191: 
                    192:     buf = "action = run"
                    193:           " multi_options { speeds = {1, 2, 3, 4, 0} }";
                    194:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    195: 
                    196:     buf = "action = run"
                    197:           " multi_options { options { xspeed = 3 } }";
                    198:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
                    199: 
                    200:     buf = "action = run"
                    201:           " multi_options { options { xspeed = -3 } }";
                    202:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
                    203: }
                    204: 
                    205: int
                    206: main(void)
                    207: {
                    208:     validate_setup();
                    209:     validate_test();
                    210:     validate_teardown();
                    211: 
                    212:     return 0;
                    213: }
                    214: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>