File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / confuse / tests / suite_single.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:49:17 2021 UTC (3 years, 3 months ago) by misho
Branches: confuse, MAIN
CVS tags: v3_3, HEAD
confuse 3.3

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

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