1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang * Copyright(c) 2010-2014 Intel Corporation
3*4418919fSjohnjiang */
4*4418919fSjohnjiang
5*4418919fSjohnjiang #include <stdio.h>
6*4418919fSjohnjiang #include <stdlib.h>
7*4418919fSjohnjiang #include <string.h>
8*4418919fSjohnjiang
9*4418919fSjohnjiang #include <rte_string_fns.h>
10*4418919fSjohnjiang
11*4418919fSjohnjiang #include <cmdline_cirbuf.h>
12*4418919fSjohnjiang
13*4418919fSjohnjiang #include "test_cmdline.h"
14*4418919fSjohnjiang
15*4418919fSjohnjiang /* different length strings */
16*4418919fSjohnjiang #define CIRBUF_STR_HEAD " HEAD"
17*4418919fSjohnjiang #define CIRBUF_STR_TAIL "TAIL"
18*4418919fSjohnjiang
19*4418919fSjohnjiang /* miscellaneous tests - they make bullseye happy */
20*4418919fSjohnjiang static int
test_cirbuf_string_misc(void)21*4418919fSjohnjiang test_cirbuf_string_misc(void)
22*4418919fSjohnjiang {
23*4418919fSjohnjiang struct cirbuf cb;
24*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
25*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
26*4418919fSjohnjiang
27*4418919fSjohnjiang /* initialize buffers */
28*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
29*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
30*4418919fSjohnjiang
31*4418919fSjohnjiang /*
32*4418919fSjohnjiang * initialize circular buffer
33*4418919fSjohnjiang */
34*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
35*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
36*4418919fSjohnjiang return -1;
37*4418919fSjohnjiang }
38*4418919fSjohnjiang
39*4418919fSjohnjiang /*
40*4418919fSjohnjiang * add strings to head and tail, but read only tail
41*4418919fSjohnjiang * this results in read operation that does not transcend
42*4418919fSjohnjiang * from buffer end to buffer beginning (in other words,
43*4418919fSjohnjiang * strlen <= cb->maxlen - cb->end)
44*4418919fSjohnjiang */
45*4418919fSjohnjiang
46*4418919fSjohnjiang /* add string to head */
47*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
48*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
49*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
50*4418919fSjohnjiang return -1;
51*4418919fSjohnjiang }
52*4418919fSjohnjiang /* add string to tail */
53*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
54*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
55*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
56*4418919fSjohnjiang return -1;
57*4418919fSjohnjiang }
58*4418919fSjohnjiang /* read string from tail */
59*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_TAIL))
60*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
61*4418919fSjohnjiang printf("Error: failed to get string from tail!\n");
62*4418919fSjohnjiang return -1;
63*4418919fSjohnjiang }
64*4418919fSjohnjiang /* verify string */
65*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL)) != 0) {
66*4418919fSjohnjiang printf("Error: tail strings do not match!\n");
67*4418919fSjohnjiang return -1;
68*4418919fSjohnjiang }
69*4418919fSjohnjiang /* clear buffers */
70*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
71*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
72*4418919fSjohnjiang
73*4418919fSjohnjiang
74*4418919fSjohnjiang
75*4418919fSjohnjiang /*
76*4418919fSjohnjiang * add a string to buffer when start/end is at end of buffer
77*4418919fSjohnjiang */
78*4418919fSjohnjiang
79*4418919fSjohnjiang /*
80*4418919fSjohnjiang * reinitialize circular buffer with start at the end of cirbuf
81*4418919fSjohnjiang */
82*4418919fSjohnjiang if (cirbuf_init(&cb, buf, CMDLINE_TEST_BUFSIZE - 2, sizeof(buf)) < 0) {
83*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
84*4418919fSjohnjiang return -1;
85*4418919fSjohnjiang }
86*4418919fSjohnjiang
87*4418919fSjohnjiang
88*4418919fSjohnjiang /* add string to tail */
89*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
90*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
91*4418919fSjohnjiang printf("Error: failed to add string to tail!\n");
92*4418919fSjohnjiang return -1;
93*4418919fSjohnjiang }
94*4418919fSjohnjiang /* read string from tail */
95*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_TAIL))
96*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
97*4418919fSjohnjiang printf("Error: failed to get string from tail!\n");
98*4418919fSjohnjiang return -1;
99*4418919fSjohnjiang }
100*4418919fSjohnjiang /* verify string */
101*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL)) != 0) {
102*4418919fSjohnjiang printf("Error: tail strings do not match!\n");
103*4418919fSjohnjiang return -1;
104*4418919fSjohnjiang }
105*4418919fSjohnjiang /* clear tmp buffer */
106*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
107*4418919fSjohnjiang
108*4418919fSjohnjiang
109*4418919fSjohnjiang /* add string to head */
110*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
111*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
112*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
113*4418919fSjohnjiang return -1;
114*4418919fSjohnjiang }
115*4418919fSjohnjiang /* read string from tail */
116*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_HEAD))
117*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
118*4418919fSjohnjiang printf("Error: failed to get string from head!\n");
119*4418919fSjohnjiang return -1;
120*4418919fSjohnjiang }
121*4418919fSjohnjiang /* verify string */
122*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD)) != 0) {
123*4418919fSjohnjiang printf("Error: headstrings do not match!\n");
124*4418919fSjohnjiang return -1;
125*4418919fSjohnjiang }
126*4418919fSjohnjiang
127*4418919fSjohnjiang return 0;
128*4418919fSjohnjiang }
129*4418919fSjohnjiang
130*4418919fSjohnjiang /* test adding and deleting strings */
131*4418919fSjohnjiang static int
test_cirbuf_string_add_del(void)132*4418919fSjohnjiang test_cirbuf_string_add_del(void)
133*4418919fSjohnjiang {
134*4418919fSjohnjiang struct cirbuf cb;
135*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
136*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
137*4418919fSjohnjiang
138*4418919fSjohnjiang /* initialize buffers */
139*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
140*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
141*4418919fSjohnjiang
142*4418919fSjohnjiang /*
143*4418919fSjohnjiang * initialize circular buffer
144*4418919fSjohnjiang */
145*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
146*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
147*4418919fSjohnjiang return -1;
148*4418919fSjohnjiang }
149*4418919fSjohnjiang
150*4418919fSjohnjiang /* add string to head */
151*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
152*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
153*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
154*4418919fSjohnjiang return -1;
155*4418919fSjohnjiang }
156*4418919fSjohnjiang /* read string from head */
157*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_HEAD))
158*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
159*4418919fSjohnjiang printf("Error: failed to get string from head!\n");
160*4418919fSjohnjiang return -1;
161*4418919fSjohnjiang }
162*4418919fSjohnjiang /* verify string */
163*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD)) != 0) {
164*4418919fSjohnjiang printf("Error: head strings do not match!\n");
165*4418919fSjohnjiang return -1;
166*4418919fSjohnjiang }
167*4418919fSjohnjiang /* clear tmp buffer */
168*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
169*4418919fSjohnjiang /* read string from tail */
170*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_HEAD))
171*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
172*4418919fSjohnjiang printf("Error: failed to get string from head!\n");
173*4418919fSjohnjiang return -1;
174*4418919fSjohnjiang }
175*4418919fSjohnjiang /* verify string */
176*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD)) != 0) {
177*4418919fSjohnjiang printf("Error: head strings do not match!\n");
178*4418919fSjohnjiang return -1;
179*4418919fSjohnjiang }
180*4418919fSjohnjiang /* delete string from head*/
181*4418919fSjohnjiang if (cirbuf_del_buf_head(&cb, sizeof(CIRBUF_STR_HEAD)) < 0) {
182*4418919fSjohnjiang printf("Error: failed to delete string from head!\n");
183*4418919fSjohnjiang return -1;
184*4418919fSjohnjiang }
185*4418919fSjohnjiang /* verify string was deleted */
186*4418919fSjohnjiang if (cirbuf_del_head_safe(&cb) == 0) {
187*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
188*4418919fSjohnjiang return -1;
189*4418919fSjohnjiang }
190*4418919fSjohnjiang /* clear tmp buffer */
191*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
192*4418919fSjohnjiang
193*4418919fSjohnjiang
194*4418919fSjohnjiang
195*4418919fSjohnjiang /*
196*4418919fSjohnjiang * reinitialize circular buffer
197*4418919fSjohnjiang */
198*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
199*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
200*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
201*4418919fSjohnjiang return -1;
202*4418919fSjohnjiang }
203*4418919fSjohnjiang
204*4418919fSjohnjiang /* add string to tail */
205*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
206*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
207*4418919fSjohnjiang printf("Error: failed to add string to tail!\n");
208*4418919fSjohnjiang return -1;
209*4418919fSjohnjiang }
210*4418919fSjohnjiang /* get string from tail */
211*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_TAIL))
212*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
213*4418919fSjohnjiang printf("Error: failed to get string from tail!\n");
214*4418919fSjohnjiang return -1;
215*4418919fSjohnjiang }
216*4418919fSjohnjiang /* verify string */
217*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL)) != 0) {
218*4418919fSjohnjiang printf("Error: tail strings do not match!\n");
219*4418919fSjohnjiang return -1;
220*4418919fSjohnjiang }
221*4418919fSjohnjiang /* clear tmp buffer */
222*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
223*4418919fSjohnjiang /* get string from head */
224*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_TAIL))
225*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
226*4418919fSjohnjiang printf("Error: failed to get string from tail!\n");
227*4418919fSjohnjiang return -1;
228*4418919fSjohnjiang }
229*4418919fSjohnjiang /* verify string */
230*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL)) != 0) {
231*4418919fSjohnjiang printf("Error: tail strings do not match!\n");
232*4418919fSjohnjiang return -1;
233*4418919fSjohnjiang }
234*4418919fSjohnjiang /* delete string from tail */
235*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, sizeof(CIRBUF_STR_TAIL)) < 0) {
236*4418919fSjohnjiang printf("Error: failed to delete string from tail!\n");
237*4418919fSjohnjiang return -1;
238*4418919fSjohnjiang }
239*4418919fSjohnjiang /* verify string was deleted */
240*4418919fSjohnjiang if (cirbuf_del_tail_safe(&cb) == 0) {
241*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
242*4418919fSjohnjiang return -1;
243*4418919fSjohnjiang }
244*4418919fSjohnjiang
245*4418919fSjohnjiang return 0;
246*4418919fSjohnjiang }
247*4418919fSjohnjiang
248*4418919fSjohnjiang /* test adding from head and deleting from tail, and vice versa */
249*4418919fSjohnjiang static int
test_cirbuf_string_add_del_reverse(void)250*4418919fSjohnjiang test_cirbuf_string_add_del_reverse(void)
251*4418919fSjohnjiang {
252*4418919fSjohnjiang struct cirbuf cb;
253*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
254*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
255*4418919fSjohnjiang
256*4418919fSjohnjiang /* initialize buffers */
257*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
258*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
259*4418919fSjohnjiang
260*4418919fSjohnjiang /*
261*4418919fSjohnjiang * initialize circular buffer
262*4418919fSjohnjiang */
263*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
264*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
265*4418919fSjohnjiang return -1;
266*4418919fSjohnjiang }
267*4418919fSjohnjiang
268*4418919fSjohnjiang /* add string to head */
269*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
270*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
271*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
272*4418919fSjohnjiang return -1;
273*4418919fSjohnjiang }
274*4418919fSjohnjiang /* delete string from tail */
275*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, sizeof(CIRBUF_STR_HEAD)) < 0) {
276*4418919fSjohnjiang printf("Error: failed to delete string from tail!\n");
277*4418919fSjohnjiang return -1;
278*4418919fSjohnjiang }
279*4418919fSjohnjiang /* verify string was deleted */
280*4418919fSjohnjiang if (cirbuf_del_tail_safe(&cb) == 0) {
281*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
282*4418919fSjohnjiang return -1;
283*4418919fSjohnjiang }
284*4418919fSjohnjiang /* clear tmp buffer */
285*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
286*4418919fSjohnjiang
287*4418919fSjohnjiang /*
288*4418919fSjohnjiang * reinitialize circular buffer
289*4418919fSjohnjiang */
290*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
291*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
292*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
293*4418919fSjohnjiang return -1;
294*4418919fSjohnjiang }
295*4418919fSjohnjiang
296*4418919fSjohnjiang /* add string to tail */
297*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
298*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
299*4418919fSjohnjiang printf("Error: failed to add string to tail!\n");
300*4418919fSjohnjiang return -1;
301*4418919fSjohnjiang }
302*4418919fSjohnjiang /* delete string from head */
303*4418919fSjohnjiang if (cirbuf_del_buf_head(&cb, sizeof(CIRBUF_STR_TAIL)) < 0) {
304*4418919fSjohnjiang printf("Error: failed to delete string from head!\n");
305*4418919fSjohnjiang return -1;
306*4418919fSjohnjiang }
307*4418919fSjohnjiang /* verify string was deleted */
308*4418919fSjohnjiang if (cirbuf_del_head_safe(&cb) == 0) {
309*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
310*4418919fSjohnjiang return -1;
311*4418919fSjohnjiang }
312*4418919fSjohnjiang
313*4418919fSjohnjiang return 0;
314*4418919fSjohnjiang }
315*4418919fSjohnjiang
316*4418919fSjohnjiang /* try to write more than available */
317*4418919fSjohnjiang static int
test_cirbuf_string_add_boundaries(void)318*4418919fSjohnjiang test_cirbuf_string_add_boundaries(void)
319*4418919fSjohnjiang {
320*4418919fSjohnjiang struct cirbuf cb;
321*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
322*4418919fSjohnjiang unsigned i;
323*4418919fSjohnjiang
324*4418919fSjohnjiang /* initialize buffers */
325*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
326*4418919fSjohnjiang
327*4418919fSjohnjiang /*
328*4418919fSjohnjiang * initialize circular buffer
329*4418919fSjohnjiang */
330*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
331*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
332*4418919fSjohnjiang return -1;
333*4418919fSjohnjiang }
334*4418919fSjohnjiang
335*4418919fSjohnjiang /* fill the buffer from tail */
336*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE - sizeof(CIRBUF_STR_TAIL) + 1; i++)
337*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
338*4418919fSjohnjiang
339*4418919fSjohnjiang /* try adding a string to tail */
340*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
341*4418919fSjohnjiang > 0) {
342*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
343*4418919fSjohnjiang return -1;
344*4418919fSjohnjiang }
345*4418919fSjohnjiang /* try adding a string to head */
346*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
347*4418919fSjohnjiang > 0) {
348*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
349*4418919fSjohnjiang return -1;
350*4418919fSjohnjiang }
351*4418919fSjohnjiang
352*4418919fSjohnjiang /*
353*4418919fSjohnjiang * reinitialize circular buffer
354*4418919fSjohnjiang */
355*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
356*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
357*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
358*4418919fSjohnjiang return -1;
359*4418919fSjohnjiang }
360*4418919fSjohnjiang
361*4418919fSjohnjiang /* fill the buffer from head */
362*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE - sizeof(CIRBUF_STR_HEAD) + 1; i++)
363*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
364*4418919fSjohnjiang
365*4418919fSjohnjiang /* try adding a string to head */
366*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
367*4418919fSjohnjiang > 0) {
368*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
369*4418919fSjohnjiang return -1;
370*4418919fSjohnjiang }
371*4418919fSjohnjiang /* try adding a string to tail */
372*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
373*4418919fSjohnjiang > 0) {
374*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
375*4418919fSjohnjiang return -1;
376*4418919fSjohnjiang }
377*4418919fSjohnjiang
378*4418919fSjohnjiang return 0;
379*4418919fSjohnjiang }
380*4418919fSjohnjiang
381*4418919fSjohnjiang /* try to read/delete more than written */
382*4418919fSjohnjiang static int
test_cirbuf_string_get_del_boundaries(void)383*4418919fSjohnjiang test_cirbuf_string_get_del_boundaries(void)
384*4418919fSjohnjiang {
385*4418919fSjohnjiang struct cirbuf cb;
386*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
387*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
388*4418919fSjohnjiang
389*4418919fSjohnjiang /* initialize buffers */
390*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
391*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
392*4418919fSjohnjiang
393*4418919fSjohnjiang /*
394*4418919fSjohnjiang * initialize circular buffer
395*4418919fSjohnjiang */
396*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
397*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
398*4418919fSjohnjiang return -1;
399*4418919fSjohnjiang }
400*4418919fSjohnjiang
401*4418919fSjohnjiang
402*4418919fSjohnjiang /* add string to head */
403*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
404*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
405*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
406*4418919fSjohnjiang return -1;
407*4418919fSjohnjiang }
408*4418919fSjohnjiang /* read more than written (head) */
409*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_HEAD) + 1)
410*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD)) {
411*4418919fSjohnjiang printf("Error: unexpected result when reading too much data!\n");
412*4418919fSjohnjiang return -1;
413*4418919fSjohnjiang }
414*4418919fSjohnjiang /* read more than written (tail) */
415*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_HEAD) + 1)
416*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD)) {
417*4418919fSjohnjiang printf("Error: unexpected result when reading too much data!\n");
418*4418919fSjohnjiang return -1;
419*4418919fSjohnjiang }
420*4418919fSjohnjiang /* delete more than written (head) */
421*4418919fSjohnjiang if (cirbuf_del_buf_head(&cb, sizeof(CIRBUF_STR_HEAD) + 1) == 0) {
422*4418919fSjohnjiang printf("Error: unexpected result when deleting too much data!\n");
423*4418919fSjohnjiang return -1;
424*4418919fSjohnjiang }
425*4418919fSjohnjiang /* delete more than written (tail) */
426*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, sizeof(CIRBUF_STR_HEAD) + 1) == 0) {
427*4418919fSjohnjiang printf("Error: unexpected result when deleting too much data!\n");
428*4418919fSjohnjiang return -1;
429*4418919fSjohnjiang }
430*4418919fSjohnjiang
431*4418919fSjohnjiang /*
432*4418919fSjohnjiang * reinitialize circular buffer
433*4418919fSjohnjiang */
434*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
435*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
436*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
437*4418919fSjohnjiang return -1;
438*4418919fSjohnjiang }
439*4418919fSjohnjiang
440*4418919fSjohnjiang /* add string to tail */
441*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL))
442*4418919fSjohnjiang != (sizeof(CIRBUF_STR_TAIL))) {
443*4418919fSjohnjiang printf("Error: failed to add string to tail!\n");
444*4418919fSjohnjiang return -1;
445*4418919fSjohnjiang }
446*4418919fSjohnjiang /* read more than written (tail) */
447*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_TAIL) + 1)
448*4418919fSjohnjiang != sizeof(CIRBUF_STR_TAIL)) {
449*4418919fSjohnjiang printf("Error: unexpected result when reading too much data!\n");
450*4418919fSjohnjiang return -1;
451*4418919fSjohnjiang }
452*4418919fSjohnjiang /* read more than written (head) */
453*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_TAIL) + 1)
454*4418919fSjohnjiang != sizeof(CIRBUF_STR_TAIL)) {
455*4418919fSjohnjiang printf("Error: unexpected result when reading too much data!\n");
456*4418919fSjohnjiang return -1;
457*4418919fSjohnjiang }
458*4418919fSjohnjiang /* delete more than written (tail) */
459*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, sizeof(CIRBUF_STR_TAIL) + 1) == 0) {
460*4418919fSjohnjiang printf("Error: unexpected result when deleting too much data!\n");
461*4418919fSjohnjiang return -1;
462*4418919fSjohnjiang }
463*4418919fSjohnjiang /* delete more than written (head) */
464*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, sizeof(CIRBUF_STR_TAIL) + 1) == 0) {
465*4418919fSjohnjiang printf("Error: unexpected result when deleting too much data!\n");
466*4418919fSjohnjiang return -1;
467*4418919fSjohnjiang }
468*4418919fSjohnjiang
469*4418919fSjohnjiang return 0;
470*4418919fSjohnjiang }
471*4418919fSjohnjiang
472*4418919fSjohnjiang /* try to read/delete less than written */
473*4418919fSjohnjiang static int
test_cirbuf_string_get_del_partial(void)474*4418919fSjohnjiang test_cirbuf_string_get_del_partial(void)
475*4418919fSjohnjiang {
476*4418919fSjohnjiang struct cirbuf cb;
477*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
478*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
479*4418919fSjohnjiang char tmp2[CMDLINE_TEST_BUFSIZE];
480*4418919fSjohnjiang
481*4418919fSjohnjiang /* initialize buffers */
482*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
483*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
484*4418919fSjohnjiang memset(tmp2, 0, sizeof(tmp));
485*4418919fSjohnjiang
486*4418919fSjohnjiang strlcpy(tmp2, CIRBUF_STR_HEAD, sizeof(tmp2));
487*4418919fSjohnjiang
488*4418919fSjohnjiang /*
489*4418919fSjohnjiang * initialize circular buffer
490*4418919fSjohnjiang */
491*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
492*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
493*4418919fSjohnjiang return -1;
494*4418919fSjohnjiang }
495*4418919fSjohnjiang
496*4418919fSjohnjiang /* add string to head */
497*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD))
498*4418919fSjohnjiang != (sizeof(CIRBUF_STR_HEAD))) {
499*4418919fSjohnjiang printf("Error: failed to add string to head!\n");
500*4418919fSjohnjiang return -1;
501*4418919fSjohnjiang }
502*4418919fSjohnjiang /* read less than written (head) */
503*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_HEAD) - 1)
504*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD) - 1) {
505*4418919fSjohnjiang printf("Error: unexpected result when reading from head!\n");
506*4418919fSjohnjiang return -1;
507*4418919fSjohnjiang }
508*4418919fSjohnjiang /* verify string */
509*4418919fSjohnjiang if (strncmp(tmp, tmp2, sizeof(CIRBUF_STR_HEAD) - 1) != 0) {
510*4418919fSjohnjiang printf("Error: strings mismatch!\n");
511*4418919fSjohnjiang return -1;
512*4418919fSjohnjiang }
513*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
514*4418919fSjohnjiang /* read less than written (tail) */
515*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_HEAD) - 1)
516*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD) - 1) {
517*4418919fSjohnjiang printf("Error: unexpected result when reading from tail!\n");
518*4418919fSjohnjiang return -1;
519*4418919fSjohnjiang }
520*4418919fSjohnjiang /* verify string */
521*4418919fSjohnjiang if (strncmp(tmp, &tmp2[1], sizeof(CIRBUF_STR_HEAD) - 1) != 0) {
522*4418919fSjohnjiang printf("Error: strings mismatch!\n");
523*4418919fSjohnjiang return -1;
524*4418919fSjohnjiang }
525*4418919fSjohnjiang
526*4418919fSjohnjiang /*
527*4418919fSjohnjiang * verify correct deletion
528*4418919fSjohnjiang */
529*4418919fSjohnjiang
530*4418919fSjohnjiang /* clear buffer */
531*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
532*4418919fSjohnjiang
533*4418919fSjohnjiang /* delete less than written (head) */
534*4418919fSjohnjiang if (cirbuf_del_buf_head(&cb, 1) != 0) {
535*4418919fSjohnjiang printf("Error: delete from head failed!\n");
536*4418919fSjohnjiang return -1;
537*4418919fSjohnjiang }
538*4418919fSjohnjiang /* read from head */
539*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, sizeof(CIRBUF_STR_HEAD) - 1)
540*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD) - 1) {
541*4418919fSjohnjiang printf("Error: unexpected result when reading from head!\n");
542*4418919fSjohnjiang return -1;
543*4418919fSjohnjiang }
544*4418919fSjohnjiang /* since we deleted from head, first char should be deleted */
545*4418919fSjohnjiang if (strncmp(tmp, &tmp2[1], sizeof(CIRBUF_STR_HEAD) - 1) != 0) {
546*4418919fSjohnjiang printf("Error: strings mismatch!\n");
547*4418919fSjohnjiang return -1;
548*4418919fSjohnjiang }
549*4418919fSjohnjiang /* clear buffer */
550*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
551*4418919fSjohnjiang
552*4418919fSjohnjiang /* delete less than written (tail) */
553*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, 1) != 0) {
554*4418919fSjohnjiang printf("Error: delete from tail failed!\n");
555*4418919fSjohnjiang return -1;
556*4418919fSjohnjiang }
557*4418919fSjohnjiang /* read from tail */
558*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, sizeof(CIRBUF_STR_HEAD) - 2)
559*4418919fSjohnjiang != sizeof(CIRBUF_STR_HEAD) - 2) {
560*4418919fSjohnjiang printf("Error: unexpected result when reading from head!\n");
561*4418919fSjohnjiang return -1;
562*4418919fSjohnjiang }
563*4418919fSjohnjiang /* since we deleted from tail, last char should be deleted */
564*4418919fSjohnjiang if (strncmp(tmp, &tmp2[1], sizeof(CIRBUF_STR_HEAD) - 2) != 0) {
565*4418919fSjohnjiang printf("Error: strings mismatch!\n");
566*4418919fSjohnjiang return -1;
567*4418919fSjohnjiang }
568*4418919fSjohnjiang
569*4418919fSjohnjiang return 0;
570*4418919fSjohnjiang }
571*4418919fSjohnjiang
572*4418919fSjohnjiang /* test cmdline_cirbuf char add/del functions */
573*4418919fSjohnjiang static int
test_cirbuf_char_add_del(void)574*4418919fSjohnjiang test_cirbuf_char_add_del(void)
575*4418919fSjohnjiang {
576*4418919fSjohnjiang struct cirbuf cb;
577*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
578*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
579*4418919fSjohnjiang
580*4418919fSjohnjiang /* clear buffer */
581*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
582*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
583*4418919fSjohnjiang
584*4418919fSjohnjiang /*
585*4418919fSjohnjiang * initialize circular buffer
586*4418919fSjohnjiang */
587*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
588*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
589*4418919fSjohnjiang return -1;
590*4418919fSjohnjiang }
591*4418919fSjohnjiang
592*4418919fSjohnjiang /*
593*4418919fSjohnjiang * try to delete something from cirbuf. since it's empty,
594*4418919fSjohnjiang * these should fail.
595*4418919fSjohnjiang */
596*4418919fSjohnjiang if (cirbuf_del_head_safe(&cb) == 0) {
597*4418919fSjohnjiang printf("Error: deleting from empty cirbuf head succeeded!\n");
598*4418919fSjohnjiang return -1;
599*4418919fSjohnjiang }
600*4418919fSjohnjiang if (cirbuf_del_tail_safe(&cb) == 0) {
601*4418919fSjohnjiang printf("Error: deleting from empty cirbuf tail succeeded!\n");
602*4418919fSjohnjiang return -1;
603*4418919fSjohnjiang }
604*4418919fSjohnjiang
605*4418919fSjohnjiang /*
606*4418919fSjohnjiang * add, verify and delete. these should pass.
607*4418919fSjohnjiang */
608*4418919fSjohnjiang if (cirbuf_add_head_safe(&cb,'h') < 0) {
609*4418919fSjohnjiang printf("Error: adding to cirbuf head failed!\n");
610*4418919fSjohnjiang return -1;
611*4418919fSjohnjiang }
612*4418919fSjohnjiang if (cirbuf_get_head(&cb) != 'h') {
613*4418919fSjohnjiang printf("Error: wrong head content!\n");
614*4418919fSjohnjiang return -1;
615*4418919fSjohnjiang }
616*4418919fSjohnjiang if (cirbuf_del_head_safe(&cb) < 0) {
617*4418919fSjohnjiang printf("Error: deleting from cirbuf head failed!\n");
618*4418919fSjohnjiang return -1;
619*4418919fSjohnjiang }
620*4418919fSjohnjiang if (cirbuf_add_tail_safe(&cb,'t') < 0) {
621*4418919fSjohnjiang printf("Error: adding to cirbuf tail failed!\n");
622*4418919fSjohnjiang return -1;
623*4418919fSjohnjiang }
624*4418919fSjohnjiang if (cirbuf_get_tail(&cb) != 't') {
625*4418919fSjohnjiang printf("Error: wrong tail content!\n");
626*4418919fSjohnjiang return -1;
627*4418919fSjohnjiang }
628*4418919fSjohnjiang if (cirbuf_del_tail_safe(&cb) < 0) {
629*4418919fSjohnjiang printf("Error: deleting from cirbuf tail failed!\n");
630*4418919fSjohnjiang return -1;
631*4418919fSjohnjiang }
632*4418919fSjohnjiang /* do the same for unsafe versions. those are void. */
633*4418919fSjohnjiang cirbuf_add_head(&cb,'h');
634*4418919fSjohnjiang if (cirbuf_get_head(&cb) != 'h') {
635*4418919fSjohnjiang printf("Error: wrong head content!\n");
636*4418919fSjohnjiang return -1;
637*4418919fSjohnjiang }
638*4418919fSjohnjiang cirbuf_del_head(&cb);
639*4418919fSjohnjiang
640*4418919fSjohnjiang /* test if char has been deleted. we can't call cirbuf_get_head
641*4418919fSjohnjiang * because it's unsafe, but we can call cirbuf_get_buf_head.
642*4418919fSjohnjiang */
643*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp, 1) > 0) {
644*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
645*4418919fSjohnjiang return -1;
646*4418919fSjohnjiang }
647*4418919fSjohnjiang
648*4418919fSjohnjiang cirbuf_add_tail(&cb,'t');
649*4418919fSjohnjiang if (cirbuf_get_tail(&cb) != 't') {
650*4418919fSjohnjiang printf("Error: wrong tail content!\n");
651*4418919fSjohnjiang return -1;
652*4418919fSjohnjiang }
653*4418919fSjohnjiang cirbuf_del_tail(&cb);
654*4418919fSjohnjiang
655*4418919fSjohnjiang /* test if char has been deleted. we can't call cirbuf_get_tail
656*4418919fSjohnjiang * because it's unsafe, but we can call cirbuf_get_buf_tail.
657*4418919fSjohnjiang */
658*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp, 1) > 0) {
659*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
660*4418919fSjohnjiang return -1;
661*4418919fSjohnjiang }
662*4418919fSjohnjiang
663*4418919fSjohnjiang return 0;
664*4418919fSjohnjiang }
665*4418919fSjohnjiang
666*4418919fSjohnjiang /* test filling up buffer with chars */
667*4418919fSjohnjiang static int
test_cirbuf_char_fill(void)668*4418919fSjohnjiang test_cirbuf_char_fill(void)
669*4418919fSjohnjiang {
670*4418919fSjohnjiang struct cirbuf cb;
671*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
672*4418919fSjohnjiang unsigned i;
673*4418919fSjohnjiang
674*4418919fSjohnjiang /* clear buffer */
675*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
676*4418919fSjohnjiang
677*4418919fSjohnjiang /*
678*4418919fSjohnjiang * initialize circular buffer
679*4418919fSjohnjiang */
680*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
681*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
682*4418919fSjohnjiang return -1;
683*4418919fSjohnjiang }
684*4418919fSjohnjiang
685*4418919fSjohnjiang /*
686*4418919fSjohnjiang * fill the buffer from head or tail, verify contents, test boundaries
687*4418919fSjohnjiang * and clear the buffer
688*4418919fSjohnjiang */
689*4418919fSjohnjiang
690*4418919fSjohnjiang /* fill the buffer from tail */
691*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE; i++)
692*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
693*4418919fSjohnjiang /* verify that contents of the buffer are what they are supposed to be */
694*4418919fSjohnjiang for (i = 0; i < sizeof(buf); i++) {
695*4418919fSjohnjiang if (buf[i] != 't') {
696*4418919fSjohnjiang printf("Error: wrong content in buffer!\n");
697*4418919fSjohnjiang return -1;
698*4418919fSjohnjiang }
699*4418919fSjohnjiang }
700*4418919fSjohnjiang /* try to add to a full buffer from tail */
701*4418919fSjohnjiang if (cirbuf_add_tail_safe(&cb, 't') == 0) {
702*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
703*4418919fSjohnjiang return -1;
704*4418919fSjohnjiang }
705*4418919fSjohnjiang /* try to add to a full buffer from head */
706*4418919fSjohnjiang if (cirbuf_add_head_safe(&cb, 'h') == 0) {
707*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
708*4418919fSjohnjiang return -1;
709*4418919fSjohnjiang }
710*4418919fSjohnjiang /* delete buffer from tail */
711*4418919fSjohnjiang for(i = 0; i < CMDLINE_TEST_BUFSIZE; i++)
712*4418919fSjohnjiang cirbuf_del_tail_safe(&cb);
713*4418919fSjohnjiang /* try to delete from an empty buffer */
714*4418919fSjohnjiang if (cirbuf_del_tail_safe(&cb) >= 0) {
715*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
716*4418919fSjohnjiang return -1;
717*4418919fSjohnjiang }
718*4418919fSjohnjiang
719*4418919fSjohnjiang /* fill the buffer from head */
720*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE; i++)
721*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
722*4418919fSjohnjiang /* verify that contents of the buffer are what they are supposed to be */
723*4418919fSjohnjiang for (i = 0; i < sizeof(buf); i++) {
724*4418919fSjohnjiang if (buf[i] != 'h') {
725*4418919fSjohnjiang printf("Error: wrong content in buffer!\n");
726*4418919fSjohnjiang return -1;
727*4418919fSjohnjiang }
728*4418919fSjohnjiang }
729*4418919fSjohnjiang /* try to add to a full buffer from head */
730*4418919fSjohnjiang if (cirbuf_add_head_safe(&cb,'h') >= 0) {
731*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
732*4418919fSjohnjiang return -1;
733*4418919fSjohnjiang }
734*4418919fSjohnjiang /* try to add to a full buffer from tail */
735*4418919fSjohnjiang if (cirbuf_add_tail_safe(&cb, 't') == 0) {
736*4418919fSjohnjiang printf("Error: buffer should have been full!\n");
737*4418919fSjohnjiang return -1;
738*4418919fSjohnjiang }
739*4418919fSjohnjiang /* delete buffer from head */
740*4418919fSjohnjiang for(i = 0; i < CMDLINE_TEST_BUFSIZE; i++)
741*4418919fSjohnjiang cirbuf_del_head_safe(&cb);
742*4418919fSjohnjiang /* try to delete from an empty buffer */
743*4418919fSjohnjiang if (cirbuf_del_head_safe(&cb) >= 0) {
744*4418919fSjohnjiang printf("Error: buffer should have been empty!\n");
745*4418919fSjohnjiang return -1;
746*4418919fSjohnjiang }
747*4418919fSjohnjiang
748*4418919fSjohnjiang /*
749*4418919fSjohnjiang * fill the buffer from both head and tail, with alternating characters,
750*4418919fSjohnjiang * verify contents and clear the buffer
751*4418919fSjohnjiang */
752*4418919fSjohnjiang
753*4418919fSjohnjiang /* fill half of buffer from tail */
754*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE / 2; i++)
755*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, (char) (i % 2 ? 't' : 'T'));
756*4418919fSjohnjiang /* fill other half of the buffer from head */
757*4418919fSjohnjiang for (i = 0; i < CMDLINE_TEST_BUFSIZE / 2; i++)
758*4418919fSjohnjiang cirbuf_add_head_safe(&cb, (char) (i % 2 ? 'H' : 'h')); /* added in reverse */
759*4418919fSjohnjiang
760*4418919fSjohnjiang /* verify that contents of the buffer are what they are supposed to be */
761*4418919fSjohnjiang for (i = 0; i < sizeof(buf) / 2; i++) {
762*4418919fSjohnjiang if (buf[i] != (char) (i % 2 ? 't' : 'T')) {
763*4418919fSjohnjiang printf("Error: wrong content in buffer at %u!\n", i);
764*4418919fSjohnjiang return -1;
765*4418919fSjohnjiang }
766*4418919fSjohnjiang }
767*4418919fSjohnjiang for (i = sizeof(buf) / 2; i < sizeof(buf); i++) {
768*4418919fSjohnjiang if (buf[i] != (char) (i % 2 ? 'h' : 'H')) {
769*4418919fSjohnjiang printf("Error: wrong content in buffer %u!\n", i);
770*4418919fSjohnjiang return -1;
771*4418919fSjohnjiang }
772*4418919fSjohnjiang }
773*4418919fSjohnjiang
774*4418919fSjohnjiang return 0;
775*4418919fSjohnjiang }
776*4418919fSjohnjiang
777*4418919fSjohnjiang /* test left alignment */
778*4418919fSjohnjiang static int
test_cirbuf_align_left(void)779*4418919fSjohnjiang test_cirbuf_align_left(void)
780*4418919fSjohnjiang {
781*4418919fSjohnjiang #define HALF_OFFSET CMDLINE_TEST_BUFSIZE / 2
782*4418919fSjohnjiang #define SMALL_OFFSET HALF_OFFSET / 2
783*4418919fSjohnjiang /* resulting buffer lengths for each of the test cases */
784*4418919fSjohnjiang #define LEN1 HALF_OFFSET - SMALL_OFFSET - 1
785*4418919fSjohnjiang #define LEN2 HALF_OFFSET + SMALL_OFFSET + 2
786*4418919fSjohnjiang #define LEN3 HALF_OFFSET - SMALL_OFFSET
787*4418919fSjohnjiang #define LEN4 HALF_OFFSET + SMALL_OFFSET - 1
788*4418919fSjohnjiang
789*4418919fSjohnjiang struct cirbuf cb;
790*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
791*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
792*4418919fSjohnjiang unsigned i;
793*4418919fSjohnjiang
794*4418919fSjohnjiang /*
795*4418919fSjohnjiang * align left when start < end and start in left half
796*4418919fSjohnjiang */
797*4418919fSjohnjiang
798*4418919fSjohnjiang /*
799*4418919fSjohnjiang * initialize circular buffer
800*4418919fSjohnjiang */
801*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
802*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
803*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
804*4418919fSjohnjiang return -1;
805*4418919fSjohnjiang }
806*4418919fSjohnjiang
807*4418919fSjohnjiang /* push end into left half */
808*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET - 1; i++)
809*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
810*4418919fSjohnjiang
811*4418919fSjohnjiang /* push start into left half < end */
812*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
813*4418919fSjohnjiang cirbuf_del_head_safe(&cb);
814*4418919fSjohnjiang
815*4418919fSjohnjiang /* align */
816*4418919fSjohnjiang if (cirbuf_align_left(&cb) < 0) {
817*4418919fSjohnjiang printf("Error: alignment failed!\n");
818*4418919fSjohnjiang return -1;
819*4418919fSjohnjiang }
820*4418919fSjohnjiang
821*4418919fSjohnjiang /* verify result */
822*4418919fSjohnjiang if (cb.start != 0 || cb.len != LEN1 || cb.end != cb.len - 1) {
823*4418919fSjohnjiang printf("Error: buffer alignment is wrong!\n");
824*4418919fSjohnjiang return -1;
825*4418919fSjohnjiang }
826*4418919fSjohnjiang
827*4418919fSjohnjiang /*
828*4418919fSjohnjiang * align left when start > end and start in left half
829*4418919fSjohnjiang */
830*4418919fSjohnjiang
831*4418919fSjohnjiang /*
832*4418919fSjohnjiang * reinitialize circular buffer
833*4418919fSjohnjiang */
834*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
835*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
836*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
837*4418919fSjohnjiang return -1;
838*4418919fSjohnjiang }
839*4418919fSjohnjiang
840*4418919fSjohnjiang /* push start into left half */
841*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET + 2; i++)
842*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
843*4418919fSjohnjiang
844*4418919fSjohnjiang /* push end into left half > start */
845*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
846*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
847*4418919fSjohnjiang
848*4418919fSjohnjiang /* align */
849*4418919fSjohnjiang if (cirbuf_align_left(&cb) < 0) {
850*4418919fSjohnjiang printf("Error: alignment failed!\n");
851*4418919fSjohnjiang return -1;
852*4418919fSjohnjiang }
853*4418919fSjohnjiang
854*4418919fSjohnjiang /* verify result */
855*4418919fSjohnjiang if (cb.start != 0 || cb.len != LEN2 || cb.end != cb.len - 1) {
856*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
857*4418919fSjohnjiang return -1;
858*4418919fSjohnjiang }
859*4418919fSjohnjiang
860*4418919fSjohnjiang /*
861*4418919fSjohnjiang * align left when start < end and start in right half
862*4418919fSjohnjiang */
863*4418919fSjohnjiang
864*4418919fSjohnjiang /*
865*4418919fSjohnjiang * reinitialize circular buffer
866*4418919fSjohnjiang */
867*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
868*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
869*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
870*4418919fSjohnjiang return -1;
871*4418919fSjohnjiang }
872*4418919fSjohnjiang
873*4418919fSjohnjiang /* push start into the right half */
874*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET; i++)
875*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
876*4418919fSjohnjiang
877*4418919fSjohnjiang /* push end into left half > start */
878*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
879*4418919fSjohnjiang cirbuf_del_tail_safe(&cb);
880*4418919fSjohnjiang
881*4418919fSjohnjiang /* align */
882*4418919fSjohnjiang if (cirbuf_align_left(&cb) < 0) {
883*4418919fSjohnjiang printf("Error: alignment failed!\n");
884*4418919fSjohnjiang return -1;
885*4418919fSjohnjiang }
886*4418919fSjohnjiang
887*4418919fSjohnjiang /* verify result */
888*4418919fSjohnjiang if (cb.start != 0 || cb.len != LEN3 || cb.end != cb.len - 1) {
889*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
890*4418919fSjohnjiang return -1;
891*4418919fSjohnjiang }
892*4418919fSjohnjiang
893*4418919fSjohnjiang /*
894*4418919fSjohnjiang * align left when start > end and start in right half
895*4418919fSjohnjiang */
896*4418919fSjohnjiang
897*4418919fSjohnjiang /*
898*4418919fSjohnjiang * reinitialize circular buffer
899*4418919fSjohnjiang */
900*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
901*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
902*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
903*4418919fSjohnjiang return -1;
904*4418919fSjohnjiang }
905*4418919fSjohnjiang
906*4418919fSjohnjiang /* push start into the right half */
907*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET - 1; i++)
908*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
909*4418919fSjohnjiang
910*4418919fSjohnjiang /* push end into left half < start */
911*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
912*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
913*4418919fSjohnjiang
914*4418919fSjohnjiang /* align */
915*4418919fSjohnjiang if (cirbuf_align_left(&cb) < 0) {
916*4418919fSjohnjiang printf("Error: alignment failed!\n");
917*4418919fSjohnjiang return -1;
918*4418919fSjohnjiang }
919*4418919fSjohnjiang
920*4418919fSjohnjiang /* verify result */
921*4418919fSjohnjiang if (cb.start != 0 || cb.len != LEN4 ||
922*4418919fSjohnjiang cb.end != cb.len - 1) {
923*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
924*4418919fSjohnjiang return -1;
925*4418919fSjohnjiang }
926*4418919fSjohnjiang
927*4418919fSjohnjiang /*
928*4418919fSjohnjiang * Verify that alignment doesn't corrupt data
929*4418919fSjohnjiang */
930*4418919fSjohnjiang
931*4418919fSjohnjiang /*
932*4418919fSjohnjiang * reinitialize circular buffer
933*4418919fSjohnjiang */
934*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
935*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
936*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
937*4418919fSjohnjiang return -1;
938*4418919fSjohnjiang }
939*4418919fSjohnjiang
940*4418919fSjohnjiang /* add string to tail and head */
941*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, CIRBUF_STR_HEAD,
942*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD)) < 0 || cirbuf_add_buf_tail(&cb,
943*4418919fSjohnjiang CIRBUF_STR_TAIL, sizeof(CIRBUF_STR_TAIL)) < 0) {
944*4418919fSjohnjiang printf("Error: failed to add strings!\n");
945*4418919fSjohnjiang return -1;
946*4418919fSjohnjiang }
947*4418919fSjohnjiang
948*4418919fSjohnjiang /* align */
949*4418919fSjohnjiang if (cirbuf_align_left(&cb) < 0) {
950*4418919fSjohnjiang printf("Error: alignment failed!\n");
951*4418919fSjohnjiang return -1;
952*4418919fSjohnjiang }
953*4418919fSjohnjiang
954*4418919fSjohnjiang /* get string from head */
955*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp,
956*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) < 0) {
957*4418919fSjohnjiang printf("Error: failed to read string from head!\n");
958*4418919fSjohnjiang return -1;
959*4418919fSjohnjiang }
960*4418919fSjohnjiang
961*4418919fSjohnjiang /* verify string */
962*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD "\0" CIRBUF_STR_TAIL,
963*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) != 0) {
964*4418919fSjohnjiang printf("Error: strings mismatch!\n");
965*4418919fSjohnjiang return -1;
966*4418919fSjohnjiang }
967*4418919fSjohnjiang
968*4418919fSjohnjiang /* reset tmp buffer */
969*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
970*4418919fSjohnjiang
971*4418919fSjohnjiang /* get string from tail */
972*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp,
973*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) < 0) {
974*4418919fSjohnjiang printf("Error: failed to read string from head!\n");
975*4418919fSjohnjiang return -1;
976*4418919fSjohnjiang }
977*4418919fSjohnjiang
978*4418919fSjohnjiang /* verify string */
979*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD "\0" CIRBUF_STR_TAIL,
980*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) != 0) {
981*4418919fSjohnjiang printf("Error: strings mismatch!\n");
982*4418919fSjohnjiang return -1;
983*4418919fSjohnjiang }
984*4418919fSjohnjiang
985*4418919fSjohnjiang return 0;
986*4418919fSjohnjiang }
987*4418919fSjohnjiang
988*4418919fSjohnjiang /* test right alignment */
989*4418919fSjohnjiang static int
test_cirbuf_align_right(void)990*4418919fSjohnjiang test_cirbuf_align_right(void)
991*4418919fSjohnjiang {
992*4418919fSjohnjiang #define END_OFFSET CMDLINE_TEST_BUFSIZE - 1
993*4418919fSjohnjiang struct cirbuf cb;
994*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
995*4418919fSjohnjiang char tmp[CMDLINE_TEST_BUFSIZE];
996*4418919fSjohnjiang unsigned i;
997*4418919fSjohnjiang
998*4418919fSjohnjiang
999*4418919fSjohnjiang /*
1000*4418919fSjohnjiang * align right when start < end and start in left half
1001*4418919fSjohnjiang */
1002*4418919fSjohnjiang
1003*4418919fSjohnjiang /*
1004*4418919fSjohnjiang * initialize circular buffer
1005*4418919fSjohnjiang */
1006*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
1007*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
1008*4418919fSjohnjiang printf("Error: failed to initialize circular buffer!\n");
1009*4418919fSjohnjiang return -1;
1010*4418919fSjohnjiang }
1011*4418919fSjohnjiang
1012*4418919fSjohnjiang /* push end into left half */
1013*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET - 1; i++)
1014*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
1015*4418919fSjohnjiang
1016*4418919fSjohnjiang /* push start into left half < end */
1017*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
1018*4418919fSjohnjiang cirbuf_del_head_safe(&cb);
1019*4418919fSjohnjiang
1020*4418919fSjohnjiang /* align */
1021*4418919fSjohnjiang cirbuf_align_right(&cb);
1022*4418919fSjohnjiang
1023*4418919fSjohnjiang /* verify result */
1024*4418919fSjohnjiang if (cb.start != END_OFFSET || cb.len != LEN1 || cb.end != cb.len - 2) {
1025*4418919fSjohnjiang printf("Error: buffer alignment is wrong!\n");
1026*4418919fSjohnjiang return -1;
1027*4418919fSjohnjiang }
1028*4418919fSjohnjiang
1029*4418919fSjohnjiang /*
1030*4418919fSjohnjiang * align right when start > end and start in left half
1031*4418919fSjohnjiang */
1032*4418919fSjohnjiang
1033*4418919fSjohnjiang /*
1034*4418919fSjohnjiang * reinitialize circular buffer
1035*4418919fSjohnjiang */
1036*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
1037*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
1038*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
1039*4418919fSjohnjiang return -1;
1040*4418919fSjohnjiang }
1041*4418919fSjohnjiang
1042*4418919fSjohnjiang /* push start into left half */
1043*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET + 2; i++)
1044*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
1045*4418919fSjohnjiang
1046*4418919fSjohnjiang /* push end into left half > start */
1047*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
1048*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
1049*4418919fSjohnjiang
1050*4418919fSjohnjiang /* align */
1051*4418919fSjohnjiang cirbuf_align_right(&cb);
1052*4418919fSjohnjiang
1053*4418919fSjohnjiang /* verify result */
1054*4418919fSjohnjiang if (cb.start != END_OFFSET || cb.len != LEN2 || cb.end != cb.len - 2) {
1055*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
1056*4418919fSjohnjiang return -1;
1057*4418919fSjohnjiang }
1058*4418919fSjohnjiang
1059*4418919fSjohnjiang /*
1060*4418919fSjohnjiang * align right when start < end and start in right half
1061*4418919fSjohnjiang */
1062*4418919fSjohnjiang
1063*4418919fSjohnjiang /*
1064*4418919fSjohnjiang * reinitialize circular buffer
1065*4418919fSjohnjiang */
1066*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
1067*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
1068*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
1069*4418919fSjohnjiang return -1;
1070*4418919fSjohnjiang }
1071*4418919fSjohnjiang
1072*4418919fSjohnjiang /* push start into the right half */
1073*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET; i++)
1074*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
1075*4418919fSjohnjiang
1076*4418919fSjohnjiang /* push end into left half > start */
1077*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
1078*4418919fSjohnjiang cirbuf_del_tail_safe(&cb);
1079*4418919fSjohnjiang
1080*4418919fSjohnjiang /* align */
1081*4418919fSjohnjiang cirbuf_align_right(&cb);
1082*4418919fSjohnjiang
1083*4418919fSjohnjiang /* verify result */
1084*4418919fSjohnjiang if (cb.end != END_OFFSET || cb.len != LEN3 || cb.start != cb.end - cb.len + 1) {
1085*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
1086*4418919fSjohnjiang return -1;
1087*4418919fSjohnjiang }
1088*4418919fSjohnjiang
1089*4418919fSjohnjiang /*
1090*4418919fSjohnjiang * align right when start > end and start in right half
1091*4418919fSjohnjiang */
1092*4418919fSjohnjiang
1093*4418919fSjohnjiang /*
1094*4418919fSjohnjiang * reinitialize circular buffer
1095*4418919fSjohnjiang */
1096*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
1097*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
1098*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
1099*4418919fSjohnjiang return -1;
1100*4418919fSjohnjiang }
1101*4418919fSjohnjiang
1102*4418919fSjohnjiang /* push start into the right half */
1103*4418919fSjohnjiang for (i = 0; i < HALF_OFFSET - 1; i++)
1104*4418919fSjohnjiang cirbuf_add_head_safe(&cb, 'h');
1105*4418919fSjohnjiang
1106*4418919fSjohnjiang /* push end into left half < start */
1107*4418919fSjohnjiang for (i = 0; i < SMALL_OFFSET; i++)
1108*4418919fSjohnjiang cirbuf_add_tail_safe(&cb, 't');
1109*4418919fSjohnjiang
1110*4418919fSjohnjiang /* align */
1111*4418919fSjohnjiang cirbuf_align_right(&cb);
1112*4418919fSjohnjiang
1113*4418919fSjohnjiang /* verify result */
1114*4418919fSjohnjiang if (cb.end != END_OFFSET || cb.len != LEN4 || cb.start != cb.end - cb.len + 1) {
1115*4418919fSjohnjiang printf("Error: buffer alignment is wrong!");
1116*4418919fSjohnjiang return -1;
1117*4418919fSjohnjiang }
1118*4418919fSjohnjiang
1119*4418919fSjohnjiang /*
1120*4418919fSjohnjiang * Verify that alignment doesn't corrupt data
1121*4418919fSjohnjiang */
1122*4418919fSjohnjiang
1123*4418919fSjohnjiang /*
1124*4418919fSjohnjiang * reinitialize circular buffer
1125*4418919fSjohnjiang */
1126*4418919fSjohnjiang memset(buf, 0, sizeof(buf));
1127*4418919fSjohnjiang if (cirbuf_init(&cb, buf, 0, sizeof(buf)) < 0) {
1128*4418919fSjohnjiang printf("Error: failed to reinitialize circular buffer!\n");
1129*4418919fSjohnjiang return -1;
1130*4418919fSjohnjiang }
1131*4418919fSjohnjiang
1132*4418919fSjohnjiang /* add string to tail and head */
1133*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, CIRBUF_STR_TAIL,
1134*4418919fSjohnjiang sizeof(CIRBUF_STR_TAIL)) < 0 || cirbuf_add_buf_head(&cb,
1135*4418919fSjohnjiang CIRBUF_STR_HEAD, sizeof(CIRBUF_STR_HEAD)) < 0) {
1136*4418919fSjohnjiang printf("Error: failed to add strings!\n");
1137*4418919fSjohnjiang return -1;
1138*4418919fSjohnjiang }
1139*4418919fSjohnjiang
1140*4418919fSjohnjiang /* align */
1141*4418919fSjohnjiang if (cirbuf_align_right(&cb) < 0) {
1142*4418919fSjohnjiang printf("Error: alignment failed!\n");
1143*4418919fSjohnjiang return -1;
1144*4418919fSjohnjiang }
1145*4418919fSjohnjiang
1146*4418919fSjohnjiang /* get string from head */
1147*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, tmp,
1148*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) < 0) {
1149*4418919fSjohnjiang printf("Error: failed to read string from head!\n");
1150*4418919fSjohnjiang return -1;
1151*4418919fSjohnjiang }
1152*4418919fSjohnjiang
1153*4418919fSjohnjiang /* verify string */
1154*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD "\0" CIRBUF_STR_TAIL,
1155*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) != 0) {
1156*4418919fSjohnjiang printf("Error: strings mismatch!\n");
1157*4418919fSjohnjiang return -1;
1158*4418919fSjohnjiang }
1159*4418919fSjohnjiang
1160*4418919fSjohnjiang /* reset tmp buffer */
1161*4418919fSjohnjiang memset(tmp, 0, sizeof(tmp));
1162*4418919fSjohnjiang
1163*4418919fSjohnjiang /* get string from tail */
1164*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, tmp,
1165*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) < 0) {
1166*4418919fSjohnjiang printf("Error: failed to read string from head!\n");
1167*4418919fSjohnjiang return -1;
1168*4418919fSjohnjiang }
1169*4418919fSjohnjiang /* verify string */
1170*4418919fSjohnjiang if (strncmp(tmp, CIRBUF_STR_HEAD "\0" CIRBUF_STR_TAIL,
1171*4418919fSjohnjiang sizeof(CIRBUF_STR_HEAD) + sizeof(CIRBUF_STR_TAIL)) != 0) {
1172*4418919fSjohnjiang printf("Error: strings mismatch!\n");
1173*4418919fSjohnjiang return -1;
1174*4418919fSjohnjiang }
1175*4418919fSjohnjiang
1176*4418919fSjohnjiang return 0;
1177*4418919fSjohnjiang }
1178*4418919fSjohnjiang
1179*4418919fSjohnjiang /* call functions with invalid parameters */
1180*4418919fSjohnjiang int
test_cirbuf_invalid_param(void)1181*4418919fSjohnjiang test_cirbuf_invalid_param(void)
1182*4418919fSjohnjiang {
1183*4418919fSjohnjiang struct cirbuf cb;
1184*4418919fSjohnjiang char buf[CMDLINE_TEST_BUFSIZE];
1185*4418919fSjohnjiang
1186*4418919fSjohnjiang /* null cirbuf */
1187*4418919fSjohnjiang if (cirbuf_init(0, buf, 0, sizeof(buf)) == 0)
1188*4418919fSjohnjiang return -1;
1189*4418919fSjohnjiang /* null buffer */
1190*4418919fSjohnjiang if (cirbuf_init(&cb, 0, 0, sizeof(buf)) == 0)
1191*4418919fSjohnjiang return -1;
1192*4418919fSjohnjiang /* null cirbuf */
1193*4418919fSjohnjiang if (cirbuf_add_head_safe(0, 'h') == 0)
1194*4418919fSjohnjiang return -1;
1195*4418919fSjohnjiang if (cirbuf_add_tail_safe(0, 't') == 0)
1196*4418919fSjohnjiang return -1;
1197*4418919fSjohnjiang if (cirbuf_del_head_safe(0) == 0)
1198*4418919fSjohnjiang return -1;
1199*4418919fSjohnjiang if (cirbuf_del_tail_safe(0) == 0)
1200*4418919fSjohnjiang return -1;
1201*4418919fSjohnjiang /* null buffer */
1202*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, 0, 0) == 0)
1203*4418919fSjohnjiang return -1;
1204*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, 0, 0) == 0)
1205*4418919fSjohnjiang return -1;
1206*4418919fSjohnjiang /* null cirbuf */
1207*4418919fSjohnjiang if (cirbuf_add_buf_head(0, buf, 0) == 0)
1208*4418919fSjohnjiang return -1;
1209*4418919fSjohnjiang if (cirbuf_add_buf_tail(0, buf, 0) == 0)
1210*4418919fSjohnjiang return -1;
1211*4418919fSjohnjiang /* null size */
1212*4418919fSjohnjiang if (cirbuf_add_buf_head(&cb, buf, 0) == 0)
1213*4418919fSjohnjiang return -1;
1214*4418919fSjohnjiang if (cirbuf_add_buf_tail(&cb, buf, 0) == 0)
1215*4418919fSjohnjiang return -1;
1216*4418919fSjohnjiang /* null cirbuf */
1217*4418919fSjohnjiang if (cirbuf_del_buf_head(0, 0) == 0)
1218*4418919fSjohnjiang return -1;
1219*4418919fSjohnjiang if (cirbuf_del_buf_tail(0, 0) == 0)
1220*4418919fSjohnjiang return -1;
1221*4418919fSjohnjiang /* null size */
1222*4418919fSjohnjiang if (cirbuf_del_buf_head(&cb, 0) == 0)
1223*4418919fSjohnjiang return -1;
1224*4418919fSjohnjiang if (cirbuf_del_buf_tail(&cb, 0) == 0)
1225*4418919fSjohnjiang return -1;
1226*4418919fSjohnjiang /* null cirbuf */
1227*4418919fSjohnjiang if (cirbuf_get_buf_head(0, 0, 0) == 0)
1228*4418919fSjohnjiang return -1;
1229*4418919fSjohnjiang if (cirbuf_get_buf_tail(0, 0, 0) == 0)
1230*4418919fSjohnjiang return -1;
1231*4418919fSjohnjiang /* null buffer */
1232*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, 0, 0) == 0)
1233*4418919fSjohnjiang return -1;
1234*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, 0, 0) == 0)
1235*4418919fSjohnjiang return -1;
1236*4418919fSjohnjiang /* null size, this is valid but should return 0 */
1237*4418919fSjohnjiang if (cirbuf_get_buf_head(&cb, buf, 0) != 0)
1238*4418919fSjohnjiang return -1;
1239*4418919fSjohnjiang if (cirbuf_get_buf_tail(&cb, buf, 0) != 0)
1240*4418919fSjohnjiang return -1;
1241*4418919fSjohnjiang /* null cirbuf */
1242*4418919fSjohnjiang if (cirbuf_align_left(0) == 0)
1243*4418919fSjohnjiang return -1;
1244*4418919fSjohnjiang if (cirbuf_align_right(0) == 0)
1245*4418919fSjohnjiang return -1;
1246*4418919fSjohnjiang
1247*4418919fSjohnjiang return 0;
1248*4418919fSjohnjiang }
1249*4418919fSjohnjiang
1250*4418919fSjohnjiang /* test cmdline_cirbuf char functions */
1251*4418919fSjohnjiang int
test_cirbuf_char(void)1252*4418919fSjohnjiang test_cirbuf_char(void)
1253*4418919fSjohnjiang {
1254*4418919fSjohnjiang int ret;
1255*4418919fSjohnjiang
1256*4418919fSjohnjiang ret = test_cirbuf_char_add_del();
1257*4418919fSjohnjiang if (ret < 0)
1258*4418919fSjohnjiang return -1;
1259*4418919fSjohnjiang
1260*4418919fSjohnjiang ret = test_cirbuf_char_fill();
1261*4418919fSjohnjiang if (ret < 0)
1262*4418919fSjohnjiang return -1;
1263*4418919fSjohnjiang
1264*4418919fSjohnjiang return 0;
1265*4418919fSjohnjiang }
1266*4418919fSjohnjiang
1267*4418919fSjohnjiang /* test cmdline_cirbuf string functions */
1268*4418919fSjohnjiang int
test_cirbuf_string(void)1269*4418919fSjohnjiang test_cirbuf_string(void)
1270*4418919fSjohnjiang {
1271*4418919fSjohnjiang if (test_cirbuf_string_add_del() < 0)
1272*4418919fSjohnjiang return -1;
1273*4418919fSjohnjiang
1274*4418919fSjohnjiang if (test_cirbuf_string_add_del_reverse() < 0)
1275*4418919fSjohnjiang return -1;
1276*4418919fSjohnjiang
1277*4418919fSjohnjiang if (test_cirbuf_string_add_boundaries() < 0)
1278*4418919fSjohnjiang return -1;
1279*4418919fSjohnjiang
1280*4418919fSjohnjiang if (test_cirbuf_string_get_del_boundaries() < 0)
1281*4418919fSjohnjiang return -1;
1282*4418919fSjohnjiang
1283*4418919fSjohnjiang if (test_cirbuf_string_get_del_partial() < 0)
1284*4418919fSjohnjiang return -1;
1285*4418919fSjohnjiang
1286*4418919fSjohnjiang if (test_cirbuf_string_misc() < 0)
1287*4418919fSjohnjiang return -1;
1288*4418919fSjohnjiang
1289*4418919fSjohnjiang return 0;
1290*4418919fSjohnjiang }
1291*4418919fSjohnjiang
1292*4418919fSjohnjiang /* test cmdline_cirbuf align functions */
1293*4418919fSjohnjiang int
test_cirbuf_align(void)1294*4418919fSjohnjiang test_cirbuf_align(void)
1295*4418919fSjohnjiang {
1296*4418919fSjohnjiang if (test_cirbuf_align_left() < 0)
1297*4418919fSjohnjiang return -1;
1298*4418919fSjohnjiang if (test_cirbuf_align_right() < 0)
1299*4418919fSjohnjiang return -1;
1300*4418919fSjohnjiang return 0;
1301*4418919fSjohnjiang }
1302