Annotation of embedaddon/confuse/tests/suite_single.c, revision 1.1.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>