xref: /minix3/external/bsd/dhcp/dist/common/tests/test_alloc.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: test_alloc.c,v 1.1.1.3 2014/07/12 11:57:48 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /*
3*83ee113eSDavid van Moolenbroek  * Copyright (c) 2007,2009,2012 by Internet Systems Consortium, Inc. ("ISC")
4*83ee113eSDavid van Moolenbroek  *
5*83ee113eSDavid van Moolenbroek  * We test the functions provided in alloc.c here. These are very
6*83ee113eSDavid van Moolenbroek  * basic functions, and it is very important that they work correctly.
7*83ee113eSDavid van Moolenbroek  *
8*83ee113eSDavid van Moolenbroek  * You can see two different styles of testing:
9*83ee113eSDavid van Moolenbroek  *
10*83ee113eSDavid van Moolenbroek  * - In the first, we have a single test for each function that tests
11*83ee113eSDavid van Moolenbroek  *   all of the possible ways it can operate. (This is the case for
12*83ee113eSDavid van Moolenbroek  *   the buffer tests.)
13*83ee113eSDavid van Moolenbroek  *
14*83ee113eSDavid van Moolenbroek  * - In the second, we have a separate test for each of the ways a
15*83ee113eSDavid van Moolenbroek  *   function can operate. (This is the case for the data_string
16*83ee113eSDavid van Moolenbroek  *   tests.)
17*83ee113eSDavid van Moolenbroek  *
18*83ee113eSDavid van Moolenbroek  * The advantage of a single test per function is that you have fewer
19*83ee113eSDavid van Moolenbroek  * tests, and less duplicated and extra code. The advantage of having
20*83ee113eSDavid van Moolenbroek  * a separate test is that each test is simpler. Plus if you need to
21*83ee113eSDavid van Moolenbroek  * allow certain tests to fail for some reason (known bugs that are
22*83ee113eSDavid van Moolenbroek  * hard to fix for example), then
23*83ee113eSDavid van Moolenbroek  */
24*83ee113eSDavid van Moolenbroek 
25*83ee113eSDavid van Moolenbroek /** @TODO: dmalloc() test */
26*83ee113eSDavid van Moolenbroek 
27*83ee113eSDavid van Moolenbroek #include "config.h"
28*83ee113eSDavid van Moolenbroek #include <atf-c.h>
29*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
30*83ee113eSDavid van Moolenbroek 
31*83ee113eSDavid van Moolenbroek ATF_TC(buffer_allocate);
32*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(buffer_allocate,tc)33*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(buffer_allocate, tc) {
34*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "buffer_allocate basic test");
35*83ee113eSDavid van Moolenbroek }
36*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(buffer_allocate,tc)37*83ee113eSDavid van Moolenbroek ATF_TC_BODY(buffer_allocate, tc) {
38*83ee113eSDavid van Moolenbroek     struct buffer *buf = 0;
39*83ee113eSDavid van Moolenbroek 
40*83ee113eSDavid van Moolenbroek     /*
41*83ee113eSDavid van Moolenbroek      * Check a 0-length buffer.
42*83ee113eSDavid van Moolenbroek      */
43*83ee113eSDavid van Moolenbroek     buf = NULL;
44*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&buf, 0, MDL)) {
45*83ee113eSDavid van Moolenbroek         atf_tc_fail("failed on 0-len buffer");
46*83ee113eSDavid van Moolenbroek     }
47*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&buf, MDL)) {
48*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
49*83ee113eSDavid van Moolenbroek     }
50*83ee113eSDavid van Moolenbroek     if (buf != NULL) {
51*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() did not NULL-out buffer");
52*83ee113eSDavid van Moolenbroek     }
53*83ee113eSDavid van Moolenbroek 
54*83ee113eSDavid van Moolenbroek     /*
55*83ee113eSDavid van Moolenbroek      * Check an actual buffer.
56*83ee113eSDavid van Moolenbroek      */
57*83ee113eSDavid van Moolenbroek     buf = NULL;
58*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&buf, 100, MDL)) {
59*83ee113eSDavid van Moolenbroek         atf_tc_fail("failed on allocate 100 bytes\n");
60*83ee113eSDavid van Moolenbroek     }
61*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&buf, MDL)) {
62*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
63*83ee113eSDavid van Moolenbroek     }
64*83ee113eSDavid van Moolenbroek     if (buf != NULL) {
65*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() did not NULL-out buffer");
66*83ee113eSDavid van Moolenbroek     }
67*83ee113eSDavid van Moolenbroek 
68*83ee113eSDavid van Moolenbroek     /*
69*83ee113eSDavid van Moolenbroek      * Okay, we're happy.
70*83ee113eSDavid van Moolenbroek      */
71*83ee113eSDavid van Moolenbroek     atf_tc_pass();
72*83ee113eSDavid van Moolenbroek }
73*83ee113eSDavid van Moolenbroek 
74*83ee113eSDavid van Moolenbroek ATF_TC(buffer_reference);
75*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(buffer_reference,tc)76*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(buffer_reference, tc) {
77*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "buffer_reference basic test");
78*83ee113eSDavid van Moolenbroek }
79*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(buffer_reference,tc)80*83ee113eSDavid van Moolenbroek ATF_TC_BODY(buffer_reference, tc) {
81*83ee113eSDavid van Moolenbroek 
82*83ee113eSDavid van Moolenbroek     struct buffer *a, *b;
83*83ee113eSDavid van Moolenbroek 
84*83ee113eSDavid van Moolenbroek     /*
85*83ee113eSDavid van Moolenbroek      * Create a buffer.
86*83ee113eSDavid van Moolenbroek      */
87*83ee113eSDavid van Moolenbroek     a = NULL;
88*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&a, 100, MDL)) {
89*83ee113eSDavid van Moolenbroek         atf_tc_fail("failed on allocate 100 bytes");
90*83ee113eSDavid van Moolenbroek     }
91*83ee113eSDavid van Moolenbroek 
92*83ee113eSDavid van Moolenbroek     /**
93*83ee113eSDavid van Moolenbroek      * Confirm buffer_reference() doesn't work if we pass in NULL.
94*83ee113eSDavid van Moolenbroek      *
95*83ee113eSDavid van Moolenbroek      * @TODO: we should confirm we get an error message here.
96*83ee113eSDavid van Moolenbroek      */
97*83ee113eSDavid van Moolenbroek     if (buffer_reference(NULL, a, MDL)) {
98*83ee113eSDavid van Moolenbroek         atf_tc_fail("succeeded on an error input");
99*83ee113eSDavid van Moolenbroek     }
100*83ee113eSDavid van Moolenbroek 
101*83ee113eSDavid van Moolenbroek     /**
102*83ee113eSDavid van Moolenbroek      * @TODO: we should confirm we get an error message if we pass
103*83ee113eSDavid van Moolenbroek      *       a non-NULL target.
104*83ee113eSDavid van Moolenbroek      */
105*83ee113eSDavid van Moolenbroek 
106*83ee113eSDavid van Moolenbroek     /*
107*83ee113eSDavid van Moolenbroek      * Confirm we work under normal circumstances.
108*83ee113eSDavid van Moolenbroek      */
109*83ee113eSDavid van Moolenbroek     b = NULL;
110*83ee113eSDavid van Moolenbroek     if (!buffer_reference(&b, a, MDL)) {
111*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_reference() failed");
112*83ee113eSDavid van Moolenbroek     }
113*83ee113eSDavid van Moolenbroek 
114*83ee113eSDavid van Moolenbroek     if (b != a) {
115*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect pointer returned");
116*83ee113eSDavid van Moolenbroek     }
117*83ee113eSDavid van Moolenbroek 
118*83ee113eSDavid van Moolenbroek     if (b->refcnt != 2) {
119*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect refcnt");
120*83ee113eSDavid van Moolenbroek     }
121*83ee113eSDavid van Moolenbroek 
122*83ee113eSDavid van Moolenbroek     /*
123*83ee113eSDavid van Moolenbroek      * Clean up.
124*83ee113eSDavid van Moolenbroek      */
125*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&b, MDL)) {
126*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
127*83ee113eSDavid van Moolenbroek     }
128*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&a, MDL)) {
129*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
130*83ee113eSDavid van Moolenbroek     }
131*83ee113eSDavid van Moolenbroek 
132*83ee113eSDavid van Moolenbroek }
133*83ee113eSDavid van Moolenbroek 
134*83ee113eSDavid van Moolenbroek 
135*83ee113eSDavid van Moolenbroek ATF_TC(buffer_dereference);
136*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(buffer_dereference,tc)137*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(buffer_dereference, tc) {
138*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "buffer_dereference basic test");
139*83ee113eSDavid van Moolenbroek }
140*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(buffer_dereference,tc)141*83ee113eSDavid van Moolenbroek ATF_TC_BODY(buffer_dereference, tc) {
142*83ee113eSDavid van Moolenbroek     struct buffer *a, *b;
143*83ee113eSDavid van Moolenbroek 
144*83ee113eSDavid van Moolenbroek     /**
145*83ee113eSDavid van Moolenbroek      * Confirm buffer_dereference() doesn't work if we pass in NULL.
146*83ee113eSDavid van Moolenbroek      *
147*83ee113eSDavid van Moolenbroek      * TODO: we should confirm we get an error message here.
148*83ee113eSDavid van Moolenbroek      */
149*83ee113eSDavid van Moolenbroek     if (buffer_dereference(NULL, MDL)) {
150*83ee113eSDavid van Moolenbroek         atf_tc_fail("succeeded on an error input");
151*83ee113eSDavid van Moolenbroek     }
152*83ee113eSDavid van Moolenbroek 
153*83ee113eSDavid van Moolenbroek     /**
154*83ee113eSDavid van Moolenbroek      * Confirm buffer_dereference() doesn't work if we pass in
155*83ee113eSDavid van Moolenbroek      * a pointer to NULL.
156*83ee113eSDavid van Moolenbroek      *
157*83ee113eSDavid van Moolenbroek      * @TODO: we should confirm we get an error message here.
158*83ee113eSDavid van Moolenbroek      */
159*83ee113eSDavid van Moolenbroek     a = NULL;
160*83ee113eSDavid van Moolenbroek     if (buffer_dereference(&a, MDL)) {
161*83ee113eSDavid van Moolenbroek         atf_tc_fail("succeeded on an error input");
162*83ee113eSDavid van Moolenbroek     }
163*83ee113eSDavid van Moolenbroek 
164*83ee113eSDavid van Moolenbroek     /*
165*83ee113eSDavid van Moolenbroek      * Confirm we work under normal circumstances.
166*83ee113eSDavid van Moolenbroek      */
167*83ee113eSDavid van Moolenbroek     a = NULL;
168*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&a, 100, MDL)) {
169*83ee113eSDavid van Moolenbroek         atf_tc_fail("failed on allocate");
170*83ee113eSDavid van Moolenbroek     }
171*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&a, MDL)) {
172*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
173*83ee113eSDavid van Moolenbroek     }
174*83ee113eSDavid van Moolenbroek     if (a != NULL) {
175*83ee113eSDavid van Moolenbroek         atf_tc_fail("non-null buffer after buffer_dereference()");
176*83ee113eSDavid van Moolenbroek     }
177*83ee113eSDavid van Moolenbroek 
178*83ee113eSDavid van Moolenbroek     /**
179*83ee113eSDavid van Moolenbroek      * Confirm we get an error from negative refcnt.
180*83ee113eSDavid van Moolenbroek      *
181*83ee113eSDavid van Moolenbroek      * @TODO: we should confirm we get an error message here.
182*83ee113eSDavid van Moolenbroek      */
183*83ee113eSDavid van Moolenbroek     a = NULL;
184*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&a, 100, MDL)) {
185*83ee113eSDavid van Moolenbroek         atf_tc_fail("failed on allocate");
186*83ee113eSDavid van Moolenbroek     }
187*83ee113eSDavid van Moolenbroek     b = NULL;
188*83ee113eSDavid van Moolenbroek     if (!buffer_reference(&b, a, MDL)) {
189*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_reference() failed");
190*83ee113eSDavid van Moolenbroek     }
191*83ee113eSDavid van Moolenbroek     a->refcnt = 0;	/* purposely set to invalid value */
192*83ee113eSDavid van Moolenbroek     if (buffer_dereference(&a, MDL)) {
193*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() succeeded on error input");
194*83ee113eSDavid van Moolenbroek     }
195*83ee113eSDavid van Moolenbroek     a->refcnt = 2;
196*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&b, MDL)) {
197*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
198*83ee113eSDavid van Moolenbroek     }
199*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&a, MDL)) {
200*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_dereference() failed");
201*83ee113eSDavid van Moolenbroek     }
202*83ee113eSDavid van Moolenbroek }
203*83ee113eSDavid van Moolenbroek 
204*83ee113eSDavid van Moolenbroek ATF_TC(data_string_forget);
205*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(data_string_forget,tc)206*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(data_string_forget, tc) {
207*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "data_string_forget basic test");
208*83ee113eSDavid van Moolenbroek }
209*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(data_string_forget,tc)210*83ee113eSDavid van Moolenbroek ATF_TC_BODY(data_string_forget, tc) {
211*83ee113eSDavid van Moolenbroek     struct buffer *buf;
212*83ee113eSDavid van Moolenbroek     struct data_string a;
213*83ee113eSDavid van Moolenbroek     const char *str = "Lorem ipsum dolor sit amet turpis duis.";
214*83ee113eSDavid van Moolenbroek 
215*83ee113eSDavid van Moolenbroek     /*
216*83ee113eSDavid van Moolenbroek      * Create the string we want to forget.
217*83ee113eSDavid van Moolenbroek      */
218*83ee113eSDavid van Moolenbroek     memset(&a, 0, sizeof(a));
219*83ee113eSDavid van Moolenbroek     a.len = strlen(str);
220*83ee113eSDavid van Moolenbroek     buf = NULL;
221*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&buf, a.len, MDL)) {
222*83ee113eSDavid van Moolenbroek         atf_tc_fail("out of memory");
223*83ee113eSDavid van Moolenbroek     }
224*83ee113eSDavid van Moolenbroek     if (!buffer_reference(&a.buffer, buf, MDL)) {
225*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_reference() failed");
226*83ee113eSDavid van Moolenbroek     }
227*83ee113eSDavid van Moolenbroek     a.data = a.buffer->data;
228*83ee113eSDavid van Moolenbroek     memcpy(a.buffer->data, str, a.len);
229*83ee113eSDavid van Moolenbroek 
230*83ee113eSDavid van Moolenbroek     /*
231*83ee113eSDavid van Moolenbroek      * Forget and confirm we've forgotten.
232*83ee113eSDavid van Moolenbroek      */
233*83ee113eSDavid van Moolenbroek     data_string_forget(&a, MDL);
234*83ee113eSDavid van Moolenbroek 
235*83ee113eSDavid van Moolenbroek     if (a.len != 0) {
236*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect length");
237*83ee113eSDavid van Moolenbroek     }
238*83ee113eSDavid van Moolenbroek 
239*83ee113eSDavid van Moolenbroek     if (a.data != NULL) {
240*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect data");
241*83ee113eSDavid van Moolenbroek     }
242*83ee113eSDavid van Moolenbroek     if (a.terminated) {
243*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect terminated");
244*83ee113eSDavid van Moolenbroek     }
245*83ee113eSDavid van Moolenbroek     if (a.buffer != NULL) {
246*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect buffer");
247*83ee113eSDavid van Moolenbroek     }
248*83ee113eSDavid van Moolenbroek     if (buf->refcnt != 1) {
249*83ee113eSDavid van Moolenbroek         atf_tc_fail("too many references to buf");
250*83ee113eSDavid van Moolenbroek     }
251*83ee113eSDavid van Moolenbroek 
252*83ee113eSDavid van Moolenbroek     /*
253*83ee113eSDavid van Moolenbroek      * Clean up buffer.
254*83ee113eSDavid van Moolenbroek      */
255*83ee113eSDavid van Moolenbroek     if (!buffer_dereference(&buf, MDL)) {
256*83ee113eSDavid van Moolenbroek         atf_tc_fail("buffer_reference() failed");
257*83ee113eSDavid van Moolenbroek     }
258*83ee113eSDavid van Moolenbroek }
259*83ee113eSDavid van Moolenbroek 
260*83ee113eSDavid van Moolenbroek ATF_TC(data_string_forget_nobuf);
261*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(data_string_forget_nobuf,tc)262*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(data_string_forget_nobuf, tc) {
263*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "data_string_forget test, "
264*83ee113eSDavid van Moolenbroek                       "data_string without buffer");
265*83ee113eSDavid van Moolenbroek }
266*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(data_string_forget_nobuf,tc)267*83ee113eSDavid van Moolenbroek ATF_TC_BODY(data_string_forget_nobuf, tc) {
268*83ee113eSDavid van Moolenbroek     struct data_string a;
269*83ee113eSDavid van Moolenbroek     const char *str = "Lorem ipsum dolor sit amet massa nunc.";
270*83ee113eSDavid van Moolenbroek 
271*83ee113eSDavid van Moolenbroek     /*
272*83ee113eSDavid van Moolenbroek      * Create the string we want to forget.
273*83ee113eSDavid van Moolenbroek      */
274*83ee113eSDavid van Moolenbroek     memset(&a, 0, sizeof(a));
275*83ee113eSDavid van Moolenbroek     a.len = strlen(str);
276*83ee113eSDavid van Moolenbroek     a.data = (const unsigned char *)str;
277*83ee113eSDavid van Moolenbroek     a.terminated = 1;
278*83ee113eSDavid van Moolenbroek 
279*83ee113eSDavid van Moolenbroek     /*
280*83ee113eSDavid van Moolenbroek      * Forget and confirm we've forgotten.
281*83ee113eSDavid van Moolenbroek      */
282*83ee113eSDavid van Moolenbroek     data_string_forget(&a, MDL);
283*83ee113eSDavid van Moolenbroek 
284*83ee113eSDavid van Moolenbroek     if (a.len != 0) {
285*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect length");
286*83ee113eSDavid van Moolenbroek     }
287*83ee113eSDavid van Moolenbroek     if (a.data != NULL) {
288*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect data");
289*83ee113eSDavid van Moolenbroek     }
290*83ee113eSDavid van Moolenbroek     if (a.terminated) {
291*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect terminated");
292*83ee113eSDavid van Moolenbroek     }
293*83ee113eSDavid van Moolenbroek     if (a.buffer != NULL) {
294*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect buffer");
295*83ee113eSDavid van Moolenbroek     }
296*83ee113eSDavid van Moolenbroek }
297*83ee113eSDavid van Moolenbroek 
298*83ee113eSDavid van Moolenbroek ATF_TC(data_string_copy);
299*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(data_string_copy,tc)300*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(data_string_copy, tc) {
301*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "data_string_copy basic test");
302*83ee113eSDavid van Moolenbroek }
303*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(data_string_copy,tc)304*83ee113eSDavid van Moolenbroek ATF_TC_BODY(data_string_copy, tc) {
305*83ee113eSDavid van Moolenbroek     struct data_string a, b;
306*83ee113eSDavid van Moolenbroek     const char *str = "Lorem ipsum dolor sit amet orci aliquam.";
307*83ee113eSDavid van Moolenbroek 
308*83ee113eSDavid van Moolenbroek     /*
309*83ee113eSDavid van Moolenbroek      * Create the string we want to copy.
310*83ee113eSDavid van Moolenbroek          */
311*83ee113eSDavid van Moolenbroek     memset(&a, 0, sizeof(a));
312*83ee113eSDavid van Moolenbroek     a.len = strlen(str);
313*83ee113eSDavid van Moolenbroek     if (!buffer_allocate(&a.buffer, a.len, MDL)) {
314*83ee113eSDavid van Moolenbroek         atf_tc_fail("out of memory");
315*83ee113eSDavid van Moolenbroek     }
316*83ee113eSDavid van Moolenbroek     a.data = a.buffer->data;
317*83ee113eSDavid van Moolenbroek     memcpy(a.buffer->data, str, a.len);
318*83ee113eSDavid van Moolenbroek 
319*83ee113eSDavid van Moolenbroek     /*
320*83ee113eSDavid van Moolenbroek      * Copy the string, and confirm it works.
321*83ee113eSDavid van Moolenbroek      */
322*83ee113eSDavid van Moolenbroek     memset(&b, 0, sizeof(b));
323*83ee113eSDavid van Moolenbroek     data_string_copy(&b, &a, MDL);
324*83ee113eSDavid van Moolenbroek 
325*83ee113eSDavid van Moolenbroek     if (b.len != a.len) {
326*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect length");
327*83ee113eSDavid van Moolenbroek     }
328*83ee113eSDavid van Moolenbroek     if (b.data != a.data) {
329*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect data");
330*83ee113eSDavid van Moolenbroek     }
331*83ee113eSDavid van Moolenbroek     if (b.terminated != a.terminated) {
332*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect terminated");
333*83ee113eSDavid van Moolenbroek     }
334*83ee113eSDavid van Moolenbroek     if (b.buffer != a.buffer) {
335*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect buffer");
336*83ee113eSDavid van Moolenbroek     }
337*83ee113eSDavid van Moolenbroek 
338*83ee113eSDavid van Moolenbroek     /*
339*83ee113eSDavid van Moolenbroek      * Clean up.
340*83ee113eSDavid van Moolenbroek      */
341*83ee113eSDavid van Moolenbroek     data_string_forget(&b, MDL);
342*83ee113eSDavid van Moolenbroek     data_string_forget(&a, MDL);
343*83ee113eSDavid van Moolenbroek }
344*83ee113eSDavid van Moolenbroek 
345*83ee113eSDavid van Moolenbroek ATF_TC(data_string_copy_nobuf);
346*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(data_string_copy_nobuf,tc)347*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(data_string_copy_nobuf, tc) {
348*83ee113eSDavid van Moolenbroek     atf_tc_set_md_var(tc, "descr", "data_string_copy test, "
349*83ee113eSDavid van Moolenbroek                       "data_string without buffer");
350*83ee113eSDavid van Moolenbroek }
351*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(data_string_copy_nobuf,tc)352*83ee113eSDavid van Moolenbroek ATF_TC_BODY(data_string_copy_nobuf, tc) {
353*83ee113eSDavid van Moolenbroek     struct data_string a, b;
354*83ee113eSDavid van Moolenbroek     const char *str = "Lorem ipsum dolor sit amet cras amet.";
355*83ee113eSDavid van Moolenbroek 
356*83ee113eSDavid van Moolenbroek     /*
357*83ee113eSDavid van Moolenbroek      * Create the string we want to copy.
358*83ee113eSDavid van Moolenbroek      */
359*83ee113eSDavid van Moolenbroek     memset(&a, 0, sizeof(a));
360*83ee113eSDavid van Moolenbroek     a.len = strlen(str);
361*83ee113eSDavid van Moolenbroek     a.data = (const unsigned char *)str;
362*83ee113eSDavid van Moolenbroek     a.terminated = 1;
363*83ee113eSDavid van Moolenbroek 
364*83ee113eSDavid van Moolenbroek     /*
365*83ee113eSDavid van Moolenbroek      * Copy the string, and confirm it works.
366*83ee113eSDavid van Moolenbroek      */
367*83ee113eSDavid van Moolenbroek     memset(&b, 0, sizeof(b));
368*83ee113eSDavid van Moolenbroek     data_string_copy(&b, &a, MDL);
369*83ee113eSDavid van Moolenbroek 
370*83ee113eSDavid van Moolenbroek     if (b.len != a.len) {
371*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect length");
372*83ee113eSDavid van Moolenbroek     }
373*83ee113eSDavid van Moolenbroek     if (b.data != a.data) {
374*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect data");
375*83ee113eSDavid van Moolenbroek     }
376*83ee113eSDavid van Moolenbroek     if (b.terminated != a.terminated) {
377*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect terminated");
378*83ee113eSDavid van Moolenbroek     }
379*83ee113eSDavid van Moolenbroek     if (b.buffer != a.buffer) {
380*83ee113eSDavid van Moolenbroek         atf_tc_fail("incorrect buffer");
381*83ee113eSDavid van Moolenbroek     }
382*83ee113eSDavid van Moolenbroek 
383*83ee113eSDavid van Moolenbroek     /*
384*83ee113eSDavid van Moolenbroek      * Clean up.
385*83ee113eSDavid van Moolenbroek      */
386*83ee113eSDavid van Moolenbroek     data_string_forget(&b, MDL);
387*83ee113eSDavid van Moolenbroek     data_string_forget(&a, MDL);
388*83ee113eSDavid van Moolenbroek 
389*83ee113eSDavid van Moolenbroek }
390*83ee113eSDavid van Moolenbroek 
ATF_TP_ADD_TCS(tp)391*83ee113eSDavid van Moolenbroek ATF_TP_ADD_TCS(tp)
392*83ee113eSDavid van Moolenbroek {
393*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, buffer_allocate);
394*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, buffer_reference);
395*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, buffer_dereference);
396*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, data_string_forget);
397*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, data_string_forget_nobuf);
398*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, data_string_copy);
399*83ee113eSDavid van Moolenbroek     ATF_TP_ADD_TC(tp, data_string_copy_nobuf);
400*83ee113eSDavid van Moolenbroek 
401*83ee113eSDavid van Moolenbroek     return (atf_no_error());
402*83ee113eSDavid van Moolenbroek }
403