Annotation of embedaddon/confuse/tests/suite_single.c, revision 1.1

1.1     ! misho       1: #include "check_confuse.h"
        !             2: #include <string.h>
        !             3: #include <stdlib.h>
        !             4: #include <sys/types.h>
        !             5: #include <sys/socket.h>
        !             6: #include <netinet/in.h>
        !             7: #include <arpa/inet.h>
        !             8: 
        !             9: static cfg_t *cfg;
        !            10: 
        !            11: int parse_ip_address(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result)
        !            12: {
        !            13:     struct in_addr *addr = (struct in_addr *)malloc(sizeof(struct in_addr));
        !            14:     if(inet_aton(value, addr) == 0)
        !            15:     {
        !            16:         /*cfg_error(cfg, "invalid IP address %s in section %s", value, cfg->name);*/
        !            17:         free(addr);
        !            18:         return 1;
        !            19:     }
        !            20:     *(void **)result = (void *)addr;
        !            21:     return 0;
        !            22: }
        !            23: 
        !            24: static unsigned char *my_ether_aton(const char *addr)
        !            25: {
        !            26:     int i;
        !            27:     static unsigned int e[6];
        !            28:     static unsigned char ec[6];
        !            29:     if(sscanf(addr, "%x:%x:%x:%x:%x:%x", &e[0], &e[1], &e[2], &e[3], &e[4], &e[5]) != 6)
        !            30:     {
        !            31:         return NULL;
        !            32:     }
        !            33:     for(i = 0; i < 6; i++)
        !            34:     {
        !            35:         if(e[i] <= 0xff)
        !            36:             ec[i] = e[i];
        !            37:         else
        !            38:             return NULL;
        !            39:     }
        !            40:     return ec;
        !            41: }
        !            42: 
        !            43: static char *my_ether_ntoa(unsigned char *addr)
        !            44: {
        !            45:     static char buf[18];
        !            46:     sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
        !            47:             addr[0], addr[0], addr[0], addr[0], addr[0], addr[0]);
        !            48:     return buf;
        !            49: }
        !            50: 
        !            51: int parse_ether_address(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result)
        !            52: {
        !            53:     unsigned char *tmp;
        !            54: 
        !            55:     tmp = my_ether_aton(value);
        !            56:     if(tmp == 0)
        !            57:     {
        !            58:         /*cfg_error(cfg, "invalid Ethernet address %s in section %s", value, cfg->name);*/
        !            59:         return 1;
        !            60:     }
        !            61:     *(void **)result = malloc(6);
        !            62:     memcpy(*(void **)result, tmp, 6);
        !            63:     return 0;
        !            64: }
        !            65: 
        !            66: void single_setup(void)
        !            67: {
        !            68:     cfg_opt_t subsec_opts[] = 
        !            69:     {
        !            70:         CFG_STR("subsubstring", "subsubdefault", CFGF_NONE),
        !            71:         CFG_INT("subsubinteger", -42, CFGF_NONE),
        !            72:         CFG_FLOAT("subsubfloat", 19923.1234, CFGF_NONE),
        !            73:         CFG_BOOL("subsubbool", cfg_false, CFGF_NONE),
        !            74:         CFG_END()
        !            75:     };
        !            76: 
        !            77:     cfg_opt_t sec_opts[] =
        !            78:     {
        !            79:         CFG_STR("substring", "subdefault", CFGF_NONE),
        !            80:         CFG_INT("subinteger", 17, CFGF_NONE),
        !            81:         CFG_FLOAT("subfloat", 8.37, CFGF_NONE),
        !            82:         CFG_BOOL("subbool", cfg_true, CFGF_NONE),
        !            83:         CFG_SEC("subsection", subsec_opts, CFGF_NONE),
        !            84:         CFG_END()
        !            85:     };
        !            86: 
        !            87:     cfg_opt_t nodef_opts[] =
        !            88:     {
        !            89:         CFG_STR("string", "defvalue", CFGF_NONE),
        !            90:         CFG_INT("int", -17, CFGF_NODEFAULT),
        !            91:         CFG_END()
        !            92:     };
        !            93: 
        !            94:     cfg_opt_t opts[] = 
        !            95:     {
        !            96:         CFG_STR("string", "default", CFGF_NONE),
        !            97:         CFG_INT("integer", 4711, CFGF_NONE),
        !            98:         CFG_FLOAT("float", 0.42, CFGF_NONE),
        !            99:         CFG_BOOL("bool", cfg_false, CFGF_NONE),
        !           100:         CFG_PTR_CB("ip-address", 0, CFGF_NONE, parse_ip_address, free),
        !           101:         CFG_PTR_CB("ethernet-address", 0, CFGF_NONE, parse_ether_address, free),
        !           102:         CFG_SEC("section", sec_opts, CFGF_NONE),
        !           103:         CFG_STR("nodefstring", "not used", CFGF_NODEFAULT),
        !           104:         CFG_SEC("nodefsec", nodef_opts, CFGF_NODEFAULT),
        !           105:         CFG_END()
        !           106:     };
        !           107: 
        !           108:     cfg = cfg_init(opts, 0);
        !           109: 
        !           110:     memset(opts, 0, sizeof(opts));
        !           111:     memset(sec_opts, 0, sizeof(sec_opts));
        !           112:     memset(subsec_opts, 0, sizeof(subsec_opts));
        !           113: }
        !           114: 
        !           115: void single_teardown(void)
        !           116: {
        !           117:     cfg_free(cfg);
        !           118: }
        !           119: 
        !           120: void single_string_test(void)
        !           121: {
        !           122:     char *buf;
        !           123: 
        !           124:     fail_unless(cfg_size(cfg, "string") == 1);
        !           125:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "string")) == 1);
        !           126:     fail_unless(strcmp(cfg_getstr(cfg, "string"), "default") == 0);
        !           127:     fail_unless(cfg_getnstr(cfg, "string", 0) == cfg_getstr(cfg, "string"));
        !           128:     fail_unless(cfg_getnstr(cfg, "string", 1) == 0);
        !           129:     buf = "string = 'set'";
        !           130:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           131:     fail_unless(strcmp(cfg_getstr(cfg, "string"), "set") == 0);
        !           132:     cfg_setstr(cfg, "string", "manually set");
        !           133:     fail_unless(strcmp(cfg_getstr(cfg, "string"), "manually set") == 0);
        !           134: }
        !           135: 
        !           136: void single_integer_test(void)
        !           137: {
        !           138:     char *buf;
        !           139: 
        !           140:     fail_unless(cfg_size(cfg, "integer") == 1);
        !           141:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "integer")) == 1);
        !           142:     fail_unless(cfg_getint(cfg, "integer") == 4711);
        !           143:     fail_unless(cfg_getnint(cfg, "integer", 0) == cfg_getint(cfg, "integer"));
        !           144:     fail_unless(cfg_getnint(cfg, "integer", 1) == 0);
        !           145:     buf = "integer = -46";
        !           146:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           147:     fail_unless(cfg_getint(cfg, "integer") == -46);
        !           148:     cfg_setint(cfg, "integer", 999999);
        !           149:     fail_unless(cfg_getint(cfg, "integer") == 999999);
        !           150: }
        !           151: 
        !           152: void single_float_test(void)
        !           153: {
        !           154:     char *buf;
        !           155: 
        !           156:     fail_unless(cfg_size(cfg, "float") == 1);
        !           157:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "float")) == 1);
        !           158:     fail_unless(cfg_getfloat(cfg, "float") == 0.42);
        !           159:     fail_unless(cfg_getnfloat(cfg, "float", 0) == cfg_getfloat(cfg, "float"));
        !           160:     fail_unless(cfg_getnfloat(cfg, "float", 1) == 0);
        !           161:     buf = "float = -46.777";
        !           162:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           163:     fail_unless(cfg_getfloat(cfg, "float") == -46.777);
        !           164:     cfg_setfloat(cfg, "float", 5.1234e2);
        !           165:     fail_unless(cfg_getfloat(cfg, "float") == 5.1234e2);
        !           166: }
        !           167: 
        !           168: void single_bool_test(void)
        !           169: {
        !           170:     char *buf;
        !           171: 
        !           172:     fail_unless(cfg_size(cfg, "bool") == 1);
        !           173:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "bool")) == 1);
        !           174:     fail_unless(cfg_getbool(cfg, "bool") == cfg_false);
        !           175: 
        !           176:     buf = "bool = yes";
        !           177:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           178:     fail_unless(cfg_getbool(cfg, "bool") == cfg_true);
        !           179:     buf = "bool = no";
        !           180:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           181:     fail_unless(cfg_getbool(cfg, "bool") == cfg_false);
        !           182:     buf = "bool = true";
        !           183:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           184:     fail_unless(cfg_getbool(cfg, "bool") == cfg_true);
        !           185:     buf = "bool = false";
        !           186:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           187:     fail_unless(cfg_getbool(cfg, "bool") == cfg_false);
        !           188:     buf = "bool = on";
        !           189:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           190:     fail_unless(cfg_getbool(cfg, "bool") == cfg_true);
        !           191:     buf = "bool = off";
        !           192:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           193:     fail_unless(cfg_getbool(cfg, "bool") == cfg_false);
        !           194: 
        !           195:     cfg_setbool(cfg, "bool", cfg_true);
        !           196:     fail_unless(cfg_getbool(cfg, "bool") == cfg_true);
        !           197:     cfg_setbool(cfg, "bool", cfg_false);
        !           198:     fail_unless(cfg_getbool(cfg, "bool") == cfg_false);
        !           199: }
        !           200: 
        !           201: void single_section_test(void)
        !           202: {
        !           203:     char *buf;
        !           204:     cfg_t *sec, *subsec;
        !           205: 
        !           206:     fail_unless(cfg_size(cfg, "section") == 1);
        !           207:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "section")) == 1);
        !           208: 
        !           209:     fail_unless(cfg_size(cfg, "section|subsection") == 1);
        !           210:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "section|subsection")) == 1);
        !           211: 
        !           212:     fail_unless(cfg_size(cfg, "section|subsection|subsubstring") == 1);
        !           213:     fail_unless(cfg_opt_size(cfg_getopt(cfg, "section|subsection|subsubinteger")) == 1);
        !           214: 
        !           215:     fail_unless(cfg_title(cfg_getsec(cfg, "section")) == 0);
        !           216:     fail_unless(cfg_title(cfg_getsec(cfg, "section|subsection")) == 0);
        !           217:     
        !           218:     fail_unless(strcmp(cfg_getstr(cfg, "section|substring"), "subdefault") == 0);
        !           219:     sec = cfg_getsec(cfg, "section|subsection");
        !           220:     fail_unless(sec != 0);
        !           221:     fail_unless(cfg_getint(sec, "subsubinteger") == -42);
        !           222: 
        !           223:     fail_unless(cfg_getnsec(cfg, "section", 0) == cfg_getsec(cfg, "section"));
        !           224:     fail_unless(cfg_getnsec(cfg, "section", 1) == 0);
        !           225: 
        !           226:     sec = cfg_getsec(cfg, "section");
        !           227:     fail_unless(sec != 0);
        !           228:     subsec = cfg_getsec(sec, "subsection");
        !           229:     fail_unless(subsec != 0);
        !           230:     fail_unless(cfg_getfloat(subsec, "subsubfloat") == 19923.1234);
        !           231:     
        !           232:     buf = "section { substring = \"foo\" subsection { subsubstring = \"bar\"} }"; 
        !           233:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           234: }
        !           235: 
        !           236: void single_ptr_test(void)
        !           237: {
        !           238:     char *buf;
        !           239:     struct in_addr *ipaddr;
        !           240:     unsigned char *etheraddr, *cmpether;
        !           241: 
        !           242:     fail_unless(cfg_size(cfg, "ip-address") == 0);
        !           243: 
        !           244:     buf = "ip-address = 192.168.0.1";
        !           245:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           246:     ipaddr = cfg_getptr(cfg, "ip-address");
        !           247:     fail_unless(ipaddr != 0);
        !           248:     fail_unless(strcmp("192.168.0.1", inet_ntoa(*ipaddr)) == 0);
        !           249: 
        !           250:     buf = "ip-address = 192.168.0.325";
        !           251:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
        !           252: 
        !           253:     buf = "ethernet-address = '00:03:93:d4:05:58'";
        !           254:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           255:     etheraddr = cfg_getptr(cfg, "ethernet-address");
        !           256:     fail_unless(etheraddr != 0);
        !           257:     fail_unless(my_ether_ntoa(etheraddr) != 0);
        !           258:     cmpether = my_ether_aton("00:03:93:d4:05:58");
        !           259:     fail_unless(memcmp(etheraddr, cmpether, 6) == 0);
        !           260: 
        !           261:     buf = "ethernet-address = '00:03:93:d4:05'";
        !           262:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
        !           263: }
        !           264: 
        !           265: void parse_buf_test(void)
        !           266: {
        !           267:     char *buf;
        !           268: 
        !           269:     fail_unless(cfg_parse_buf(cfg, 0) == CFG_SUCCESS);
        !           270:     fail_unless(cfg_parse_buf(cfg, "") == CFG_SUCCESS);
        !           271: 
        !           272:     buf = "bool = wrong";
        !           273:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
        !           274: 
        !           275:     buf = "string = ";
        !           276:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
        !           277: 
        !           278:     buf = "option = 'value'";
        !           279:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_PARSE_ERROR);
        !           280: }
        !           281: 
        !           282: void nonexistent_option_test(void)
        !           283: {
        !           284:     fail_unless(cfg_getopt(cfg, "nonexistent") == 0);
        !           285:     fail_unless(cfg_getopt(cfg, "section|subnonexistent") == 0);
        !           286: }
        !           287: 
        !           288: void nodefault_test(void)
        !           289: {
        !           290:     char *buf;
        !           291:     cfg_t *nodefsec;
        !           292: 
        !           293:     fail_unless(cfg_size(cfg, "nodefstring") == 0);
        !           294:     cfg_setstr(cfg, "nodefstring", "manually set");
        !           295:     fail_unless(cfg_size(cfg, "nodefstring") == 1);
        !           296:     fail_unless(cfg_size(cfg, "nodefsec") == 0);
        !           297: 
        !           298:     buf = "nodefsec {}";    
        !           299:     fail_unless(cfg_parse_buf(cfg, buf) == CFG_SUCCESS);
        !           300:     nodefsec = cfg_getsec(cfg, "nodefsec");
        !           301:     fail_unless(nodefsec != 0);
        !           302:     fail_unless(cfg_size(nodefsec, "string") == 1);
        !           303:     fail_unless(cfg_size(nodefsec, "int") == 0);
        !           304: }
        !           305: 
        !           306: int
        !           307: main(void)
        !           308: {
        !           309:     single_setup();
        !           310: 
        !           311:     single_string_test();
        !           312:     single_integer_test();
        !           313:     single_float_test();
        !           314:     single_bool_test();
        !           315:     single_section_test();
        !           316:     single_ptr_test();
        !           317:     parse_buf_test();
        !           318:     nonexistent_option_test();
        !           319:     nodefault_test();
        !           320:     
        !           321:     single_teardown();
        !           322: 
        !           323:     return 0;
        !           324: }
        !           325: 

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