xref: /f-stack/dpdk/app/test/test_kvargs.c (revision ebf5cedb)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2014 6WIND S.A.
3  */
4 
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <string.h>
8 
9 #include <rte_common.h>
10 #include <rte_kvargs.h>
11 
12 #include "test.h"
13 
14 /* incrementd in handler, to check it is properly called once per
15  * key/value association */
16 static unsigned count;
17 
18 /* this handler increment the "count" variable at each call and check
19  * that the key is "check" and the value is "value%d" */
20 static int check_handler(const char *key, const char *value,
21 	__rte_unused void *opaque)
22 {
23 	char buf[16];
24 
25 	/* we check that the value is "check" */
26 	if (strcmp(key, "check"))
27 		return -1;
28 
29 	/* we check that the value is "value$(count)" */
30 	snprintf(buf, sizeof(buf), "value%d", count);
31 	if (strncmp(buf, value, sizeof(buf)))
32 		return -1;
33 
34 	count ++;
35 	return 0;
36 }
37 
38 /* test a valid case */
39 static int test_valid_kvargs(void)
40 {
41 	struct rte_kvargs *kvlist;
42 	const char *args;
43 	const char *valid_keys_list[] = { "foo", "check", NULL };
44 	const char **valid_keys;
45 
46 	/* empty args is valid */
47 	args = "";
48 	valid_keys = NULL;
49 	kvlist = rte_kvargs_parse(args, valid_keys);
50 	if (kvlist == NULL) {
51 		printf("rte_kvargs_parse() error");
52 		goto fail;
53 	}
54 	rte_kvargs_free(kvlist);
55 
56 	/* first test without valid_keys */
57 	args = "foo=1234,check=value0,check=value1";
58 	valid_keys = NULL;
59 	kvlist = rte_kvargs_parse(args, valid_keys);
60 	if (kvlist == NULL) {
61 		printf("rte_kvargs_parse() error");
62 		goto fail;
63 	}
64 	/* call check_handler() for all entries with key="check" */
65 	count = 0;
66 	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) < 0) {
67 		printf("rte_kvargs_process() error\n");
68 		rte_kvargs_free(kvlist);
69 		goto fail;
70 	}
71 	if (count != 2) {
72 		printf("invalid count value %d after rte_kvargs_process(check)\n",
73 			count);
74 		rte_kvargs_free(kvlist);
75 		goto fail;
76 	}
77 	count = 0;
78 	/* call check_handler() for all entries with key="unexistant_key" */
79 	if (rte_kvargs_process(kvlist, "unexistant_key", check_handler, NULL) < 0) {
80 		printf("rte_kvargs_process() error\n");
81 		rte_kvargs_free(kvlist);
82 		goto fail;
83 	}
84 	if (count != 0) {
85 		printf("invalid count value %d after rte_kvargs_process(unexistant_key)\n",
86 			count);
87 		rte_kvargs_free(kvlist);
88 		goto fail;
89 	}
90 	/* count all entries with key="foo" */
91 	count = rte_kvargs_count(kvlist, "foo");
92 	if (count != 1) {
93 		printf("invalid count value %d after rte_kvargs_count(foo)\n",
94 			count);
95 		rte_kvargs_free(kvlist);
96 		goto fail;
97 	}
98 	/* count all entries */
99 	count = rte_kvargs_count(kvlist, NULL);
100 	if (count != 3) {
101 		printf("invalid count value %d after rte_kvargs_count(NULL)\n",
102 			count);
103 		rte_kvargs_free(kvlist);
104 		goto fail;
105 	}
106 	/* count all entries with key="unexistant_key" */
107 	count = rte_kvargs_count(kvlist, "unexistant_key");
108 	if (count != 0) {
109 		printf("invalid count value %d after rte_kvargs_count(unexistant_key)\n",
110 			count);
111 		rte_kvargs_free(kvlist);
112 		goto fail;
113 	}
114 	rte_kvargs_free(kvlist);
115 
116 	/* second test using valid_keys */
117 	args = "foo=droids,check=value0,check=value1,check=wrong_value";
118 	valid_keys = valid_keys_list;
119 	kvlist = rte_kvargs_parse(args, valid_keys);
120 	if (kvlist == NULL) {
121 		printf("rte_kvargs_parse() error");
122 		goto fail;
123 	}
124 	/* call check_handler() on all entries with key="check", it
125 	 * should fail as the value is not recognized by the handler */
126 	if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) {
127 		printf("rte_kvargs_process() is success bu should not\n");
128 		rte_kvargs_free(kvlist);
129 		goto fail;
130 	}
131 	count = rte_kvargs_count(kvlist, "check");
132 	if (count != 3) {
133 		printf("invalid count value %d after rte_kvargs_count(check)\n",
134 			count);
135 		rte_kvargs_free(kvlist);
136 		goto fail;
137 	}
138 	rte_kvargs_free(kvlist);
139 
140 	/* third test using list as value */
141 	args = "foo=[0,1],check=value2";
142 	valid_keys = valid_keys_list;
143 	kvlist = rte_kvargs_parse(args, valid_keys);
144 	if (kvlist == NULL) {
145 		printf("rte_kvargs_parse() error");
146 		goto fail;
147 	}
148 	if (strcmp(kvlist->pairs[0].value, "[0,1]") != 0) {
149 		printf("wrong value %s", kvlist->pairs[0].value);
150 		goto fail;
151 	}
152 	count = kvlist->count;
153 	if (count != 2) {
154 		printf("invalid count value %d\n", count);
155 		rte_kvargs_free(kvlist);
156 		goto fail;
157 	}
158 	rte_kvargs_free(kvlist);
159 
160 	return 0;
161 
162  fail:
163 	printf("while processing <%s>", args);
164 	if (valid_keys != NULL && *valid_keys != NULL) {
165 		printf(" using valid_keys=<%s", *valid_keys);
166 		while (*(++valid_keys) != NULL)
167 			printf(",%s", *valid_keys);
168 		printf(">");
169 	}
170 	printf("\n");
171 	return -1;
172 }
173 
174 /* test several error cases */
175 static int test_invalid_kvargs(void)
176 {
177 	struct rte_kvargs *kvlist;
178 	/* list of argument that should fail */
179 	const char *args_list[] = {
180 		"wrong-key=x",     /* key not in valid_keys_list */
181 		"foo=1,foo=",      /* empty value */
182 		"foo=1,,foo=2",    /* empty key/value */
183 		"foo=1,foo",       /* no value */
184 		"foo=1,=2",        /* no key */
185 		"foo=[1,2",        /* no closing bracket in value */
186 		",=",              /* also test with a smiley */
187 		NULL };
188 	const char **args;
189 	const char *valid_keys_list[] = { "foo", "check", NULL };
190 	const char **valid_keys = valid_keys_list;
191 
192 	for (args = args_list; *args != NULL; args++) {
193 
194 		kvlist = rte_kvargs_parse(*args, valid_keys);
195 		if (kvlist != NULL) {
196 			printf("rte_kvargs_parse() returned 0 (but should not)\n");
197 			rte_kvargs_free(kvlist);
198 			goto fail;
199 		}
200 		return 0;
201 	}
202 
203  fail:
204 	printf("while processing <%s>", *args);
205 	if (valid_keys != NULL && *valid_keys != NULL) {
206 		printf(" using valid_keys=<%s", *valid_keys);
207 		while (*(++valid_keys) != NULL)
208 			printf(",%s", *valid_keys);
209 		printf(">");
210 	}
211 	printf("\n");
212 	return -1;
213 }
214 
215 static int
216 test_kvargs(void)
217 {
218 	printf("== test valid case ==\n");
219 	if (test_valid_kvargs() < 0)
220 		return -1;
221 	printf("== test invalid case ==\n");
222 	if (test_invalid_kvargs() < 0)
223 		return -1;
224 	return 0;
225 }
226 
227 REGISTER_TEST_COMMAND(kvargs_autotest, test_kvargs);
228