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