1 /*	$NetBSD: t_sdp_put.c,v 1.3 2011/04/16 07:32:27 plunky Exp $	*/
2 
3 /*-
4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Iain Hibbert.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <atf-c.h>
33 
34 #include <limits.h>
35 #include <sdp.h>
36 #include <string.h>
37 
38 ATF_TC(check_sdp_put_data);
39 
40 ATF_TC_HEAD(check_sdp_put_data, tc)
41 {
42 
43 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_data results");
44 }
45 
46 ATF_TC_BODY(check_sdp_put_data, tc)
47 {
48 	uint8_t buf[256];
49 	sdp_data_t test = { buf, buf + sizeof(buf) };
50 	uint8_t data[] = {
51 		0x35, 0x05,		// seq8(5)
52 		0x08, 0x00,		//   uint8	0x00
53 		0x09, 0x12, 0x34,	//   uint16	0x1234
54 	};
55 	sdp_data_t value = { data, data + sizeof(data) };
56 
57 	ATF_REQUIRE(sdp_put_data(&test, &value));
58 	test.end = test.next;
59 	test.next = buf;
60 
61 	const uint8_t expect[] = {
62 		0x35, 0x05,		// seq8(5)
63 		0x08, 0x00,		//   uint8	0x00
64 		0x09, 0x12, 0x34,	//   uint16	0x1234
65 	};
66 
67 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
68 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
69 }
70 
71 ATF_TC(check_sdp_put_attr);
72 
73 ATF_TC_HEAD(check_sdp_put_attr, tc)
74 {
75 
76 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_attr results");
77 }
78 
79 ATF_TC_BODY(check_sdp_put_attr, tc)
80 {
81 	uint8_t buf[256];
82 	sdp_data_t test = { buf, buf + sizeof(buf) };
83 	uint8_t data[] = {
84 		0x00,			// nil
85 		0x19, 0x33, 0x44,	// uuid16	0x3344
86 	};
87 	sdp_data_t value = { data, data + sizeof(data) };
88 
89 	ATF_REQUIRE_EQ(sdp_put_attr(&test, 0xabcd, &value), false);
90 	value.next += 1; // skip "nil"
91 	ATF_REQUIRE(sdp_put_attr(&test, 0x1337, &value));
92 	test.end = test.next;
93 	test.next = buf;
94 
95 	const uint8_t expect[] = {
96 		0x09, 0x13, 0x37,	// uint16	0x1337
97 		0x19, 0x33, 0x44,	// uuid16	0x3344
98 	};
99 
100 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
101 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
102 }
103 
104 ATF_TC(check_sdp_put_uuid);
105 
106 ATF_TC_HEAD(check_sdp_put_uuid, tc)
107 {
108 
109 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uuid results");
110 }
111 
112 ATF_TC_BODY(check_sdp_put_uuid, tc)
113 {
114 	uint8_t buf[256];
115 	sdp_data_t test = { buf, buf + sizeof(buf) };
116 	const uuid_t u16 = {
117 		0x00001234,
118 		0x0000,
119 		0x1000,
120 		0x80,
121 		0x00,
122 		{ 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }
123 	};
124 	const uuid_t u32 = {
125 		0x12345678,
126 		0x0000,
127 		0x1000,
128 		0x80,
129 		0x00,
130 		{ 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }
131 	};
132 	const uuid_t u128 = {
133 		0x00112233,
134 		0x4444,
135 		0x5555,
136 		0x66,
137 		0x77,
138 		{ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd }
139 	};
140 
141 	ATF_REQUIRE(sdp_put_uuid(&test, &u16));
142 	ATF_REQUIRE(sdp_put_uuid(&test, &u32));
143 	ATF_REQUIRE(sdp_put_uuid(&test, &u128));
144 	test.end = test.next;
145 	test.next = buf;
146 
147 	const uint8_t expect[] = {
148 		0x19, 0x12, 0x34,	// uuid16	0x1234
149 		0x1a, 0x12, 0x34, 0x56, // uuid32	0x12345678
150 		0x78,
151 		0x1c, 0x00, 0x11, 0x22,	// uuid128	00112233-4444-5555-6677-8899aabbccdd
152 		0x33, 0x44, 0x44, 0x55,
153 		0x55, 0x66, 0x77, 0x88,
154 		0x99, 0xaa, 0xbb, 0xcc,
155 		0xdd,
156 	};
157 
158 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
159 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
160 }
161 
162 ATF_TC(check_sdp_put_uuid16);
163 
164 ATF_TC_HEAD(check_sdp_put_uuid16, tc)
165 {
166 
167 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uuid16 results");
168 }
169 
170 ATF_TC_BODY(check_sdp_put_uuid16, tc)
171 {
172 	uint8_t buf[256];
173 	sdp_data_t test = { buf, buf + sizeof(buf) };
174 
175 	ATF_REQUIRE(sdp_put_uuid16(&test, 0x4567));
176 	test.end = test.next;
177 	test.next = buf;
178 
179 	const uint8_t expect[] = {
180 		0x19, 0x45, 0x67,	// uuid16	0x4567
181 	};
182 
183 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
184 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
185 }
186 
187 ATF_TC(check_sdp_put_uuid32);
188 
189 ATF_TC_HEAD(check_sdp_put_uuid32, tc)
190 {
191 
192 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uuid32 results");
193 }
194 
195 ATF_TC_BODY(check_sdp_put_uuid32, tc)
196 {
197 	uint8_t buf[256];
198 	sdp_data_t test = { buf, buf + sizeof(buf) };
199 
200 	ATF_REQUIRE(sdp_put_uuid32(&test, 0xabcdef00));
201 	test.end = test.next;
202 	test.next = buf;
203 
204 	const uint8_t expect[] = {
205 		0x1a, 0xab, 0xcd, 0xef, // uuid32	0xabcdef00
206 		0x00,
207 	};
208 
209 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
210 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
211 }
212 
213 ATF_TC(check_sdp_put_uuid128);
214 
215 ATF_TC_HEAD(check_sdp_put_uuid128, tc)
216 {
217 
218 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uuid128 results");
219 }
220 
221 ATF_TC_BODY(check_sdp_put_uuid128, tc)
222 {
223 	uint8_t buf[256];
224 	sdp_data_t test = { buf, buf + sizeof(buf) };
225 	uuid_t value = {
226 		0x00000100,
227 		0x0000,
228 		0x1000,
229 		0x80,
230 		0x00,
231 		{ 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb }
232 	};
233 
234 	ATF_REQUIRE(sdp_put_uuid128(&test, &value));
235 	test.end = test.next;
236 	test.next = buf;
237 
238 	const uint8_t expect[] = {
239 		0x1c, 0x00, 0x00, 0x01,	// uuid128	0000100-0000-1000-8000-00805f9b34fb
240 		0x00, 0x00, 0x00, 0x10,	//			(L2CAP protocol)
241 		0x00, 0x80, 0x00, 0x00,
242 		0x80, 0x5f, 0x9b, 0x34,
243 		0xfb,
244 	};
245 
246 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
247 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
248 }
249 
250 ATF_TC(check_sdp_put_bool);
251 
252 ATF_TC_HEAD(check_sdp_put_bool, tc)
253 {
254 
255 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_bool results");
256 }
257 
258 ATF_TC_BODY(check_sdp_put_bool, tc)
259 {
260 	uint8_t buf[256];
261 	sdp_data_t test = { buf, buf + sizeof(buf) };
262 
263 	ATF_REQUIRE(sdp_put_bool(&test, true));
264 	ATF_REQUIRE(sdp_put_bool(&test, false));
265 	test.end = test.next;
266 	test.next = buf;
267 
268 	const uint8_t expect[] = {
269 		0x28, 0x01,		// bool	true
270 		0x28, 0x00,		// bool	false
271 	};
272 
273 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
274 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
275 }
276 
277 ATF_TC(check_sdp_put_uint);
278 
279 ATF_TC_HEAD(check_sdp_put_uint, tc)
280 {
281 
282 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uint results");
283 }
284 
285 ATF_TC_BODY(check_sdp_put_uint, tc)
286 {
287 	uint8_t buf[256];
288 	sdp_data_t test = { buf, buf + sizeof(buf) };
289 
290 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)0));
291 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT8_MAX));
292 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT8_MAX + 1));
293 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT16_MAX));
294 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT16_MAX + 1));
295 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT32_MAX));
296 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT32_MAX + 1));
297 	ATF_REQUIRE(sdp_put_uint(&test, (uintmax_t)UINT64_MAX));
298 	test.end = test.next;
299 	test.next = buf;
300 
301 	const uint8_t expect[] = {
302 		0x08, 0x00,		// uint8	0x00
303 		0x08, 0xff,		// uint8	0xff
304 		0x09, 0x01, 0x00,	// uint16	0x0100
305 		0x09, 0xff, 0xff,	// uint16	0xffff
306 		0x0a, 0x00, 0x01, 0x00,	// uint32	0x00010000
307 		0x00,
308 		0x0a, 0xff, 0xff, 0xff,	// uint32	0xffffffff
309 		0xff,
310 		0x0b, 0x00, 0x00, 0x00,	// uint64	0x0000000100000000
311 		0x01, 0x00, 0x00, 0x00,
312 		0x00,
313 		0x0b, 0xff, 0xff, 0xff,	// uint64	0xffffffffffffffff
314 		0xff, 0xff, 0xff, 0xff,
315 		0xff,
316 	};
317 
318 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
319 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
320 }
321 
322 ATF_TC(check_sdp_put_uint8);
323 
324 ATF_TC_HEAD(check_sdp_put_uint8, tc)
325 {
326 
327 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uint8 results");
328 }
329 
330 ATF_TC_BODY(check_sdp_put_uint8, tc)
331 {
332 	uint8_t buf[256];
333 	sdp_data_t test = { buf, buf + sizeof(buf) };
334 
335 	ATF_REQUIRE(sdp_put_uint8(&test, (uint8_t)0));
336 	ATF_REQUIRE(sdp_put_uint8(&test, (uint8_t)UINT8_MAX));
337 	test.end = test.next;
338 	test.next = buf;
339 
340 	const uint8_t expect[] = {
341 		0x08, 0x00,		// uint8	0x00
342 		0x08, 0xff,		// uint8	0xff
343 	};
344 
345 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
346 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
347 }
348 
349 ATF_TC(check_sdp_put_uint16);
350 
351 ATF_TC_HEAD(check_sdp_put_uint16, tc)
352 {
353 
354 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uint16 results");
355 }
356 
357 ATF_TC_BODY(check_sdp_put_uint16, tc)
358 {
359 	uint8_t buf[256];
360 	sdp_data_t test = { buf, buf + sizeof(buf) };
361 
362 	ATF_REQUIRE(sdp_put_uint16(&test, (uint16_t)0));
363 	ATF_REQUIRE(sdp_put_uint16(&test, (uint16_t)UINT8_MAX));
364 	ATF_REQUIRE(sdp_put_uint16(&test, (uint16_t)UINT16_MAX));
365 	ATF_REQUIRE(sdp_put_uint16(&test, (uint16_t)0xabcd));
366 	test.end = test.next;
367 	test.next = buf;
368 
369 	const uint8_t expect[] = {
370 		0x09, 0x00, 0x00,	// uint16	0x0000
371 		0x09, 0x00, 0xff,	// uint16	0x00ff
372 		0x09, 0xff, 0xff,	// uint16	0xffff
373 		0x09, 0xab, 0xcd,	// uint16	0xabcd
374 	};
375 
376 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
377 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
378 }
379 
380 ATF_TC(check_sdp_put_uint32);
381 
382 ATF_TC_HEAD(check_sdp_put_uint32, tc)
383 {
384 
385 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uint32 results");
386 }
387 
388 ATF_TC_BODY(check_sdp_put_uint32, tc)
389 {
390 	uint8_t buf[256];
391 	sdp_data_t test = { buf, buf + sizeof(buf) };
392 
393 	ATF_REQUIRE(sdp_put_uint32(&test, (uint32_t)0));
394 	ATF_REQUIRE(sdp_put_uint32(&test, (uint32_t)UINT8_MAX));
395 	ATF_REQUIRE(sdp_put_uint32(&test, (uint32_t)UINT16_MAX));
396 	ATF_REQUIRE(sdp_put_uint32(&test, (uint32_t)UINT32_MAX));
397 	ATF_REQUIRE(sdp_put_uint32(&test, (uint32_t)0xdeadbeef));
398 	test.end = test.next;
399 	test.next = buf;
400 
401 	const uint8_t expect[] = {
402 		0x0a, 0x00, 0x00, 0x00,	// uint32	0x00000000
403 		0x00,
404 		0x0a, 0x00, 0x00, 0x00,	// uint32	0x000000ff
405 		0xff,
406 		0x0a, 0x00, 0x00, 0xff,	// uint32	0x0000ffff
407 		0xff,
408 		0x0a, 0xff, 0xff, 0xff,	// uint32	0xffffffff
409 		0xff,
410 		0x0a, 0xde, 0xad, 0xbe,	// uint32	0xdeadbeef
411 		0xef,
412 	};
413 
414 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
415 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
416 }
417 
418 ATF_TC(check_sdp_put_uint64);
419 
420 ATF_TC_HEAD(check_sdp_put_uint64, tc)
421 {
422 
423 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_uint64 results");
424 }
425 
426 ATF_TC_BODY(check_sdp_put_uint64, tc)
427 {
428 	uint8_t buf[256];
429 	sdp_data_t test = { buf, buf + sizeof(buf) };
430 
431 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)0));
432 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)UINT8_MAX));
433 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)UINT16_MAX));
434 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)UINT32_MAX));
435 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)UINT64_MAX));
436 	ATF_REQUIRE(sdp_put_uint64(&test, (uint64_t)0xc0ffeecafec0ffee));
437 	test.end = test.next;
438 	test.next = buf;
439 
440 	const uint8_t expect[] = {
441 		0x0b, 0x00, 0x00, 0x00,	// uint64	0x0000000000000000
442 		0x00, 0x00, 0x00, 0x00,
443 		0x00,
444 		0x0b, 0x00, 0x00, 0x00,	// uint64	0x00000000000000ff
445 		0x00, 0x00, 0x00, 0x00,
446 		0xff,
447 		0x0b, 0x00, 0x00, 0x00,	// uint64	0x000000000000ffff
448 		0x00, 0x00, 0x00, 0xff,
449 		0xff,
450 		0x0b, 0x00, 0x00, 0x00,	// uint64	0x00000000ffffffff
451 		0x00, 0xff, 0xff, 0xff,
452 		0xff,
453 		0x0b, 0xff, 0xff, 0xff,	// uint64	0xffffffffffffffff
454 		0xff, 0xff, 0xff, 0xff,
455 		0xff,
456 		0x0b, 0xc0, 0xff, 0xee,	// uint64	0xc0ffeecafec0ffee
457 		0xca, 0xfe, 0xc0, 0xff,
458 		0xee,
459 	};
460 
461 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
462 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
463 }
464 
465 ATF_TC(check_sdp_put_int);
466 
467 ATF_TC_HEAD(check_sdp_put_int, tc)
468 {
469 
470 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_int results");
471 }
472 
473 ATF_TC_BODY(check_sdp_put_int, tc)
474 {
475 	uint8_t buf[256];
476 	sdp_data_t test = { buf, buf + sizeof(buf) };
477 
478 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)0));
479 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT8_MIN));
480 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT8_MAX));
481 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT8_MIN - 1));
482 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT8_MAX + 1));
483 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT16_MIN));
484 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT16_MAX));
485 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT16_MIN - 1));
486 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT16_MAX + 1));
487 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT32_MIN));
488 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT32_MAX));
489 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT32_MIN - 1));
490 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT32_MAX + 1));
491 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT64_MIN));
492 	ATF_REQUIRE(sdp_put_int(&test, (intmax_t)INT64_MAX));
493 	test.end = test.next;
494 	test.next = buf;
495 
496 	const uint8_t expect[] = {
497 		0x10, 0x00,		// int8		0
498 		0x10, 0x80,		// int8		-128
499 		0x10, 0x7f,		// int8		127
500 		0x11, 0xff, 0x7f,	// int16	-129
501 		0x11, 0x00, 0x80,	// int16	128
502 		0x11, 0x80, 0x00,	// int16	-32768
503 		0x11, 0x7f, 0xff,	// int16	32767
504 		0x12, 0xff, 0xff, 0x7f,	// int32	-32769
505 		0xff,
506 		0x12, 0x00, 0x00, 0x80,	// int32	32768
507 		0x00,
508 		0x12, 0x80, 0x00, 0x00,	// int32	-2147483648
509 		0x00,
510 		0x12, 0x7f, 0xff, 0xff,	// int32	2147483647
511 		0xff,
512 		0x13, 0xff, 0xff, 0xff,	// int64	-2147483649
513 		0xff, 0x7f, 0xff, 0xff,
514 		0xff,
515 		0x13, 0x00, 0x00, 0x00,	// int64	2147483648
516 		0x00, 0x80, 0x00, 0x00,
517 		0x00,
518 		0x13, 0x80, 0x00, 0x00,	// int64	-9223372036854775808
519 		0x00, 0x00, 0x00, 0x00,
520 		0x00,
521 		0x13, 0x7f, 0xff, 0xff,	// int64	9223372036854775807
522 		0xff, 0xff, 0xff, 0xff,
523 		0xff,
524 	};
525 
526 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
527 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
528 }
529 
530 ATF_TC(check_sdp_put_int8);
531 
532 ATF_TC_HEAD(check_sdp_put_int8, tc)
533 {
534 
535 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_int8 results");
536 }
537 
538 ATF_TC_BODY(check_sdp_put_int8, tc)
539 {
540 	uint8_t buf[256];
541 	sdp_data_t test = { buf, buf + sizeof(buf) };
542 
543 	ATF_REQUIRE(sdp_put_int8(&test, (int8_t)0));
544 	ATF_REQUIRE(sdp_put_int8(&test, (int8_t)INT8_MIN));
545 	ATF_REQUIRE(sdp_put_int8(&test, (int8_t)INT8_MAX));
546 	test.end = test.next;
547 	test.next = buf;
548 
549 	const uint8_t expect[] = {
550 		0x10, 0x00,		// int8		0
551 		0x10, 0x80,		// int8		-128
552 		0x10, 0x7f,		// int8		127
553 	};
554 
555 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
556 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
557 }
558 
559 ATF_TC(check_sdp_put_int16);
560 
561 ATF_TC_HEAD(check_sdp_put_int16, tc)
562 {
563 
564 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_int16 results");
565 }
566 
567 ATF_TC_BODY(check_sdp_put_int16, tc)
568 {
569 	uint8_t buf[256];
570 	sdp_data_t test = { buf, buf + sizeof(buf) };
571 
572 	ATF_REQUIRE(sdp_put_int16(&test, (int16_t)0));
573 	ATF_REQUIRE(sdp_put_int16(&test, (int16_t)INT8_MIN));
574 	ATF_REQUIRE(sdp_put_int16(&test, (int16_t)INT8_MAX));
575 	ATF_REQUIRE(sdp_put_int16(&test, (int16_t)INT16_MIN));
576 	ATF_REQUIRE(sdp_put_int16(&test, (int16_t)INT16_MAX));
577 	test.end = test.next;
578 	test.next = buf;
579 
580 	const uint8_t expect[] = {
581 		0x11, 0x00, 0x00,	// int16	0
582 		0x11, 0xff, 0x80,	// int16	-128
583 		0x11, 0x00, 0x7f,	// int16	127
584 		0x11, 0x80, 0x00,	// int16	-32768
585 		0x11, 0x7f, 0xff,	// int16	32767
586 	};
587 
588 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
589 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
590 }
591 
592 ATF_TC(check_sdp_put_int32);
593 
594 ATF_TC_HEAD(check_sdp_put_int32, tc)
595 {
596 
597 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_int32 results");
598 }
599 
600 ATF_TC_BODY(check_sdp_put_int32, tc)
601 {
602 	uint8_t buf[256];
603 	sdp_data_t test = { buf, buf + sizeof(buf) };
604 
605 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)0));
606 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT8_MIN));
607 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT8_MAX));
608 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT16_MIN));
609 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT16_MAX));
610 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT32_MIN));
611 	ATF_REQUIRE(sdp_put_int32(&test, (int32_t)INT32_MAX));
612 	test.end = test.next;
613 	test.next = buf;
614 
615 	const uint8_t expect[] = {
616 		0x12, 0x00, 0x00, 0x00,	// int32	0
617 		0x00,
618 		0x12, 0xff, 0xff, 0xff,	// int32	-128
619 		0x80,
620 		0x12, 0x00, 0x00, 0x00,	// int32	127
621 		0x7f,
622 		0x12, 0xff, 0xff, 0x80,	// int32	-32768
623 		0x00,
624 		0x12, 0x00, 0x00, 0x7f,	// int32	32767
625 		0xff,
626 		0x12, 0x80, 0x00, 0x00,	// int32	-2147483648
627 		0x00,
628 		0x12, 0x7f, 0xff, 0xff,	// int32	2147483647
629 		0xff,
630 	};
631 
632 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
633 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
634 }
635 
636 ATF_TC(check_sdp_put_int64);
637 
638 ATF_TC_HEAD(check_sdp_put_int64, tc)
639 {
640 
641 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_int64 results");
642 }
643 
644 ATF_TC_BODY(check_sdp_put_int64, tc)
645 {
646 	uint8_t buf[256];
647 	sdp_data_t test = { buf, buf + sizeof(buf) };
648 
649 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)0));
650 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT8_MIN));
651 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT8_MAX));
652 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT16_MIN));
653 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT16_MAX));
654 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT32_MIN));
655 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT32_MAX));
656 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT64_MIN));
657 	ATF_REQUIRE(sdp_put_int64(&test, (int64_t)INT64_MAX));
658 	test.end = test.next;
659 	test.next = buf;
660 
661 	const uint8_t expect[] = {
662 		0x13, 0x00, 0x00, 0x00,	// int64	0
663 		0x00, 0x00, 0x00, 0x00,
664 		0x00,
665 		0x13, 0xff, 0xff, 0xff,	// int64	-128
666 		0xff, 0xff, 0xff, 0xff,
667 		0x80,
668 		0x13, 0x00, 0x00, 0x00,	// int64	127
669 		0x00, 0x00, 0x00, 0x00,
670 		0x7f,
671 		0x13, 0xff, 0xff, 0xff,	// int64	-32768
672 		0xff, 0xff, 0xff, 0x80,
673 		0x00,
674 		0x13, 0x00, 0x00, 0x00,	// int64	32767
675 		0x00, 0x00, 0x00, 0x7f,
676 		0xff,
677 		0x13, 0xff, 0xff, 0xff,	// int64	-2147483648
678 		0xff, 0x80, 0x00, 0x00,
679 		0x00,
680 		0x13, 0x00, 0x00, 0x00,	// int64	2147483647
681 		0x00, 0x7f, 0xff, 0xff,
682 		0xff,
683 		0x13, 0x80, 0x00, 0x00,	// int64	-9223372036854775808
684 		0x00, 0x00, 0x00, 0x00,
685 		0x00,
686 		0x13, 0x7f, 0xff, 0xff,	// int64	9223372036854775807
687 		0xff, 0xff, 0xff, 0xff,
688 		0xff,
689 	};
690 
691 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
692 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
693 }
694 
695 ATF_TC(check_sdp_put_seq);
696 
697 ATF_TC_HEAD(check_sdp_put_seq, tc)
698 {
699 
700 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_seq results");
701 }
702 
703 ATF_TC_BODY(check_sdp_put_seq, tc)
704 {
705 	uint8_t buf[512];
706 	sdp_data_t test = { buf, buf + sizeof(buf) };
707 
708 	ATF_REQUIRE(sdp_put_seq(&test, (ssize_t)0));
709 	ATF_REQUIRE(sdp_put_seq(&test, (ssize_t)UINT8_MAX));
710 	ATF_REQUIRE(sdp_put_seq(&test, (ssize_t)UINT8_MAX + 1));
711 	ATF_REQUIRE(sdp_put_seq(&test, (ssize_t)-1));
712 	ATF_CHECK_EQ(sdp_put_seq(&test, (ssize_t)UINT16_MAX), false);	/* no room */
713 	ATF_CHECK_EQ(sdp_put_seq(&test, (ssize_t)SSIZE_MAX), false);	/* no room */
714 	test.end = test.next;
715 	test.next = buf;
716 
717 	/* (not a valid element list) */
718 	const uint8_t expect[] = {
719 		0x35, 0x00,		// seq8(0)
720 		0x35, 0xff,		// seq8(255)
721 		0x36, 0x01, 0x00,	// seq16(256)
722 		0x36, 0x01, 0xf6,	// seq16(502)	<- sizeof(buf) - 7 - 3
723 	};
724 
725 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
726 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
727 }
728 
729 ATF_TC(check_sdp_put_alt);
730 
731 ATF_TC_HEAD(check_sdp_put_alt, tc)
732 {
733 
734 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_alt results");
735 }
736 
737 ATF_TC_BODY(check_sdp_put_alt, tc)
738 {
739 	uint8_t buf[512];
740 	sdp_data_t test = { buf, buf + sizeof(buf) };
741 
742 	ATF_REQUIRE(sdp_put_alt(&test, (ssize_t)0));
743 	ATF_REQUIRE(sdp_put_alt(&test, (ssize_t)UINT8_MAX));
744 	ATF_REQUIRE(sdp_put_alt(&test, (ssize_t)UINT8_MAX + 1));
745 	ATF_REQUIRE(sdp_put_alt(&test, (ssize_t)-1));
746 	ATF_CHECK_EQ(sdp_put_alt(&test, (ssize_t)UINT16_MAX), false);	/* no room */
747 	ATF_CHECK_EQ(sdp_put_alt(&test, (ssize_t)SSIZE_MAX), false);	/* no room */
748 	test.end = test.next;
749 	test.next = buf;
750 
751 	/* (not a valid element list) */
752 	const uint8_t expect[] = {
753 		0x3d, 0x00,		// alt8(0)
754 		0x3d, 0xff,		// alt8(255)
755 		0x3e, 0x01, 0x00,	// alt16(256)
756 		0x3e, 0x01, 0xf6,	// alt16(502)	<- sizeof(buf) - 7 - 3
757 	};
758 
759 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
760 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
761 }
762 
763 ATF_TC(check_sdp_put_str);
764 
765 ATF_TC_HEAD(check_sdp_put_str, tc)
766 {
767 
768 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_str results");
769 }
770 
771 ATF_TC_BODY(check_sdp_put_str, tc)
772 {
773 	uint8_t buf[512];
774 	sdp_data_t test = { buf, buf + sizeof(buf) };
775 
776 	/*
777 	 * this does not test str16 or str32, but that is
778 	 * handled by the same code as sdp_put_seq above..
779 	 */
780 
781 	ATF_REQUIRE(sdp_put_str(&test, "Hello World!", 5));
782 	ATF_REQUIRE(sdp_put_str(&test, "Hello\0World", 11));
783 	ATF_REQUIRE(sdp_put_str(&test, "Hello World!", -1));
784 	ATF_REQUIRE(sdp_put_str(&test, "Hello\0World", -1));
785 	test.end = test.next;
786 	test.next = buf;
787 
788 	const uint8_t expect[] = {
789 		0x25, 0x05, 0x48, 0x65,	// str8		"Hello"
790 		0x6c, 0x6c, 0x6f,
791 		0x25, 0x0b, 0x48, 0x65,	// str8		"Hello\0World"
792 		0x6c, 0x6c, 0x6f, 0x00,
793 		0x57, 0x6f, 0x72, 0x6c,
794 		0x64,
795 		0x25, 0x0c, 0x48, 0x65,	// str8		"Hello World!"
796 		0x6c, 0x6c, 0x6f, 0x20,
797 		0x57, 0x6f, 0x72, 0x6c,
798 		0x64, 0x21,
799 		0x25, 0x05, 0x48, 0x65,	// str8		"Hello"
800 		0x6c, 0x6c, 0x6f,
801 	};
802 
803 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
804 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
805 }
806 
807 ATF_TC(check_sdp_put_url);
808 
809 ATF_TC_HEAD(check_sdp_put_url, tc)
810 {
811 
812 	atf_tc_set_md_var(tc, "descr", "Test sdp_put_url results");
813 }
814 
815 ATF_TC_BODY(check_sdp_put_url, tc)
816 {
817 	uint8_t buf[512];
818 	sdp_data_t test = { buf, buf + sizeof(buf) };
819 
820 	/*
821 	 * this does not test url16 or url32, but that is
822 	 * handled by the same code as sdp_put_seq above..
823 	 */
824 
825 	ATF_REQUIRE(sdp_put_url(&test, "http://www.netbsd.org/", 21));
826 	ATF_REQUIRE(sdp_put_url(&test, "http://www.netbsd.org/", -1));
827 	test.end = test.next;
828 	test.next = buf;
829 
830 	const uint8_t expect[] = {
831 		0x45, 0x15, 0x68, 0x74,	// url8	"http://www.netbsd.org"
832 		0x74, 0x70, 0x3a, 0x2f,
833 		0x2f, 0x77, 0x77, 0x77,
834 		0x2e, 0x6e, 0x65, 0x74,
835 		0x62, 0x73, 0x64, 0x2e,
836 		0x6f, 0x72, 0x67,
837 		0x45, 0x16, 0x68, 0x74,	// url8	"http://www.netbsd.org/"
838 		0x74, 0x70, 0x3a, 0x2f,
839 		0x2f, 0x77, 0x77, 0x77,
840 		0x2e, 0x6e, 0x65, 0x74,
841 		0x62, 0x73, 0x64, 0x2e,
842 		0x6f, 0x72, 0x67, 0x2f,
843 	};
844 
845 	ATF_REQUIRE_EQ(test.end - test.next, sizeof(expect));
846 	ATF_CHECK(memcmp(expect, test.next, sizeof(expect)) == 0);
847 }
848 
849 ATF_TP_ADD_TCS(tp)
850 {
851 
852 	ATF_TP_ADD_TC(tp, check_sdp_put_data);
853 	ATF_TP_ADD_TC(tp, check_sdp_put_attr);
854 	ATF_TP_ADD_TC(tp, check_sdp_put_uuid);
855 	ATF_TP_ADD_TC(tp, check_sdp_put_uuid16);
856 	ATF_TP_ADD_TC(tp, check_sdp_put_uuid32);
857 	ATF_TP_ADD_TC(tp, check_sdp_put_uuid128);
858 	ATF_TP_ADD_TC(tp, check_sdp_put_bool);
859 	ATF_TP_ADD_TC(tp, check_sdp_put_uint);
860 	ATF_TP_ADD_TC(tp, check_sdp_put_uint8);
861 	ATF_TP_ADD_TC(tp, check_sdp_put_uint16);
862 	ATF_TP_ADD_TC(tp, check_sdp_put_uint32);
863 	ATF_TP_ADD_TC(tp, check_sdp_put_uint64);
864 	ATF_TP_ADD_TC(tp, check_sdp_put_int);
865 	ATF_TP_ADD_TC(tp, check_sdp_put_int8);
866 	ATF_TP_ADD_TC(tp, check_sdp_put_int16);
867 	ATF_TP_ADD_TC(tp, check_sdp_put_int32);
868 	ATF_TP_ADD_TC(tp, check_sdp_put_int64);
869 	ATF_TP_ADD_TC(tp, check_sdp_put_seq);
870 	ATF_TP_ADD_TC(tp, check_sdp_put_alt);
871 	ATF_TP_ADD_TC(tp, check_sdp_put_str);
872 	ATF_TP_ADD_TC(tp, check_sdp_put_url);
873 
874 	return atf_no_error();
875 }
876