Annotation of embedaddon/dhcp/server/tests/hash_unittest.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2012 by Internet Systems Consortium, Inc. ("ISC")
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
14: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: *
16: * Internet Systems Consortium, Inc.
17: * 950 Charter Street
18: * Redwood City, CA 94063
19: * <info@isc.org>
20: * https://www.isc.org/
21: *
22: */
23:
24: #include "config.h"
25: #include <atf-c.h>
26: #include <omapip/omapip_p.h>
27: #include "dhcpd.h"
28:
29: /*
30: * The following structures are kept here for reference only. As hash functions
31: * are somewhat convoluted, they are copied here for the reference. Original
32: * location is specified. Keep in mind that it may change over time:
33: *
34: * copied from server/omapi.c:49 *
35: * omapi_object_type_t *dhcp_type_lease;
36: * omapi_object_type_t *dhcp_type_pool;
37: * omapi_object_type_t *dhcp_type_class;
38: * omapi_object_type_t *dhcp_type_subclass;
39: * omapi_object_type_t *dhcp_type_host;
40: *
41: * copied from server/salloc.c:138
42: * OMAPI_OBJECT_ALLOC (lease, struct lease, dhcp_type_lease)
43: * OMAPI_OBJECT_ALLOC (class, struct class, dhcp_type_class)
44: * OMAPI_OBJECT_ALLOC (subclass, struct class, dhcp_type_subclass)
45: * OMAPI_OBJECT_ALLOC (pool, struct pool, dhcp_type_pool)
46: * OMAPI_OBJECT_ALLOC (host, struct host_decl, dhcp_type_host)
47: *
48: * copied from server/mdb.c:2686
49: * HASH_FUNCTIONS(lease_ip, const unsigned char *, struct lease, lease_ip_hash_t,
50: * lease_reference, lease_dereference, do_ip4_hash)
51: * HASH_FUNCTIONS(lease_id, const unsigned char *, struct lease, lease_id_hash_t,
52: * lease_reference, lease_dereference, do_id_hash)
53: * HASH_FUNCTIONS (host, const unsigned char *, struct host_decl, host_hash_t,
54: * host_reference, host_dereference, do_string_hash)
55: * HASH_FUNCTIONS (class, const char *, struct class, class_hash_t,
56: * class_reference, class_dereference, do_string_hash)
57: *
58: * copied from server/mdb.c:46
59: * host_hash_t *host_hw_addr_hash;
60: * host_hash_t *host_uid_hash;
61: * host_hash_t *host_name_hash;
62: * lease_id_hash_t *lease_uid_hash;
63: * lease_ip_hash_t *lease_ip_addr_hash;
64: * lease_id_hash_t *lease_hw_addr_hash;
65: */
66:
67: /**
68: * @brief sets client-id field in host declaration
69: *
70: * @param host pointer to host declaration
71: * @param uid pointer to client-id data
72: * @param uid_len length of the client-id data
73: *
74: * @return 1 if successful, 0 otherwise
75: */
76: int lease_set_clientid(struct host_decl *host, const unsigned char *uid, int uid_len) {
77:
78: /* clean-up this mess and set client-identifier in a sane way */
79: int real_len = uid_len;
80: if (uid_len == 0) {
81: real_len = strlen((const char *)uid) + 1;
82: }
83:
84: memset(&host->client_identifier, 0, sizeof(host->client_identifier));
85: host->client_identifier.len = uid_len;
86: if (!buffer_allocate(&host->client_identifier.buffer, real_len, MDL)) {
87: return 0;
88: }
89: host->client_identifier.data = host->client_identifier.buffer->data;
90: memcpy((char *)host->client_identifier.data, uid, real_len);
91:
92: return 1;
93: }
94:
95: /// @brief executes uid hash test for specified client-ids (2 hosts)
96: ///
97: /// Creates two host structures, adds first host to the uid hash,
98: /// then adds second host to the hash, then removes first host,
99: /// then removed the second. Many checks are performed during all
100: /// operations.
101: ///
102: /// @param clientid1 client-id of the first host
103: /// @param clientid1_len client-id1 length (may be 0 for strings)
104: /// @param clientid2 client-id of the second host
105: /// @param clientid2_len client-id2 length (may be 0 for strings)
106: void lease_hash_test_2hosts(unsigned char clientid1[], size_t clientid1_len,
107: unsigned char clientid2[], size_t clientid2_len) {
108:
109: printf("Checking hash operation for 2 hosts: clientid1-len=%lu"
110: "clientid2-len=%lu\n", (unsigned long) clientid1_len,
111: (unsigned long) clientid2_len);
112:
113: dhcp_db_objects_setup ();
114: dhcp_common_objects_setup ();
115:
116: /* check that there is actually zero hosts in the hash */
117: /* @todo: host_hash_for_each() */
118:
119: struct host_decl *host1 = 0, *host2 = 0;
120: struct host_decl *check = 0;
121:
122: /* === step 1: allocate hosts === */
123: ATF_CHECK_MSG(host_allocate(&host1, MDL) == ISC_R_SUCCESS,
124: "Failed to allocate host");
125: ATF_CHECK_MSG(host_allocate(&host2, MDL) == ISC_R_SUCCESS,
126: "Failed to allocate host");
127:
128: ATF_CHECK_MSG(host_new_hash(&host_uid_hash, HOST_HASH_SIZE, MDL) != 0,
129: "Unable to create new hash");
130:
131: ATF_CHECK_MSG(buffer_allocate(&host1->client_identifier.buffer,
132: clientid1_len, MDL) != 0,
133: "Can't allocate uid buffer for host1");
134:
135: ATF_CHECK_MSG(buffer_allocate(&host2->client_identifier.buffer,
136: clientid2_len, MDL) != 0,
137: "Can't allocate uid buffer for host2");
138:
139: /* setting up host1->client_identifier is actually not needed */
140: /*
141: ATF_CHECK_MSG(lease_set_clientid(host1, clientid1, actual1_len) != 0,
142: "Failed to set client-id for host1");
143:
144: ATF_CHECK_MSG(lease_set_clientid(host2, clientid2, actual2_len) != 0,
145: "Failed to set client-id for host2");
146: */
147:
148: ATF_CHECK_MSG(host1->refcnt == 1, "Invalid refcnt for host1");
149: ATF_CHECK_MSG(host2->refcnt == 1, "Invalid refcnt for host2");
150:
151: /* verify that our hosts are not in the hash yet */
152: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
153: clientid1_len, MDL) == 0,
154: "Host1 is not supposed to be in the uid_hash.");
155:
156: ATF_CHECK_MSG(!check, "Host1 is not supposed to be in the uid_hash.");
157:
158: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
159: clientid2_len, MDL) == 0,
160: "Host2 is not supposed to be in the uid_hash.");
161: ATF_CHECK_MSG(!check, "Host2 is not supposed to be in the uid_hash.");
162:
163:
164: /* === step 2: add first host to the hash === */
165: host_hash_add(host_uid_hash, clientid1, clientid1_len, host1, MDL);
166:
167: /* 2 pointers expected: ours (host1) and the one stored in hash */
168: ATF_CHECK_MSG(host1->refcnt == 2, "Invalid refcnt for host1");
169: /* 1 pointer expected: just ours (host2) */
170: ATF_CHECK_MSG(host2->refcnt == 1, "Invalid refcnt for host2");
171:
172: /* verify that host1 is really in the hash and the we can find it */
173: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
174: clientid1_len, MDL),
175: "Host1 was supposed to be in the uid_hash.");
176: ATF_CHECK_MSG(check, "Host1 was supposed to be in the uid_hash.");
177:
178: /* Hey! That's not the host we were looking for! */
179: ATF_CHECK_MSG(check == host1, "Wrong host returned by host_hash_lookup");
180:
181: /* 3 pointers: host1, (stored in hash), check */
182: ATF_CHECK_MSG(host1->refcnt == 3, "Invalid refcnt for host1");
183:
184: /* reference count should be increased because we not have a pointer */
185:
186: host_dereference(&check, MDL); /* we don't need it now */
187:
188: ATF_CHECK_MSG(check == NULL, "check pointer is supposed to be NULL");
189:
190: /* 2 pointers: host1, (stored in hash) */
191: ATF_CHECK_MSG(host1->refcnt == 2, "Invalid refcnt for host1");
192:
193: /* verify that host2 is not in the hash */
194: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
195: clientid2_len, MDL) == 0,
196: "Host2 was not supposed to be in the uid_hash[2].");
197: ATF_CHECK_MSG(check == NULL, "Host2 was not supposed to be in the hash.");
198:
199:
200: /* === step 3: add second hot to the hash === */
201: host_hash_add(host_uid_hash, clientid2, clientid2_len, host2, MDL);
202:
203: /* 2 pointers expected: ours (host1) and the one stored in hash */
204: ATF_CHECK_MSG(host2->refcnt == 2, "Invalid refcnt for host2");
205:
206: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
207: clientid2_len, MDL),
208: "Host2 was supposed to be in the uid_hash.");
209: ATF_CHECK_MSG(check, "Host2 was supposed to be in the uid_hash.");
210:
211: /* Hey! That's not the host we were looking for! */
212: ATF_CHECK_MSG(check == host2, "Wrong host returned by host_hash_lookup");
213:
214: /* 3 pointers: host1, (stored in hash), check */
215: ATF_CHECK_MSG(host2->refcnt == 3, "Invalid refcnt for host1");
216:
217: host_dereference(&check, MDL); /* we don't need it now */
218:
219: /* now we have 2 hosts in the hash */
220:
221: /* verify that host1 is still in the hash and the we can find it */
222: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
223: clientid1_len, MDL),
224: "Host1 was supposed to be in the uid_hash.");
225: ATF_CHECK_MSG(check, "Host1 was supposed to be in the uid_hash.");
226:
227: /* Hey! That's not the host we were looking for! */
228: ATF_CHECK_MSG(check == host1, "Wrong host returned by host_hash_lookup");
229:
230: /* 3 pointers: host1, (stored in hash), check */
231: ATF_CHECK_MSG(host1->refcnt == 3, "Invalid refcnt for host1");
232:
233: host_dereference(&check, MDL); /* we don't need it now */
234:
235:
236: /**
237: * @todo check that there is actually two hosts in the hash.
238: * Use host_hash_for_each() for that.
239: */
240:
241: /* === step 4: remove first host from the hash === */
242:
243: /* delete host from hash */
244: host_hash_delete(host_uid_hash, clientid1, clientid1_len, MDL);
245:
246: ATF_CHECK_MSG(host1->refcnt == 1, "Invalid refcnt for host1");
247: ATF_CHECK_MSG(host2->refcnt == 2, "Invalid refcnt for host2");
248:
249: /* verify that host1 is no longer in the hash */
250: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
251: clientid1_len, MDL) == 0,
252: "Host1 is not supposed to be in the uid_hash.");
253: ATF_CHECK_MSG(!check, "Host1 is not supposed to be in the uid_hash.");
254:
255: /* host2 should be still there, though */
256: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
257: clientid2_len, MDL),
258: "Host2 was supposed to still be in the uid_hash.");
259: host_dereference(&check, MDL);
260:
261: /* === step 5: remove second host from the hash === */
262: host_hash_delete(host_uid_hash, clientid2, clientid2_len, MDL);
263:
264: ATF_CHECK_MSG(host1->refcnt == 1, "Invalid refcnt for host1");
265: ATF_CHECK_MSG(host2->refcnt == 1, "Invalid refcnt for host2");
266:
267: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
268: clientid2_len, MDL) == 0,
269: "Host2 was not supposed to be in the uid_hash anymore.");
270:
271: host_dereference(&host1, MDL);
272: host_dereference(&host2, MDL);
273:
274: /*
275: * No easy way to check if the host object were actually released.
276: * We could run it in valgrind and check for memory leaks.
277: */
278:
279: #if defined (DEBUG_MEMORY_LEAKAGE) && defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
280: /* @todo: Should be called in cleanup */
281: free_everything ();
282: #endif
283: }
284:
285: /// @brief executes uid hash test for specified client-ids (3 hosts)
286: ///
287: /// Creates three host structures, adds first host to the uid hash,
288: /// then adds second host to the hash, then removes first host,
289: /// then removed the second. Many checks are performed during all
290: /// operations.
291: ///
292: /// @param clientid1 client-id of the first host
293: /// @param clientid1_len client-id1 length (may be 0 for strings)
294: /// @param clientid2 client-id of the second host
295: /// @param clientid2_len client-id2 length (may be 0 for strings)
296: /// @param clientid3 client-id of the second host
297: /// @param clientid3_len client-id2 length (may be 0 for strings)
298: void lease_hash_test_3hosts(unsigned char clientid1[], size_t clientid1_len,
299: unsigned char clientid2[], size_t clientid2_len,
300: unsigned char clientid3[], size_t clientid3_len) {
301:
302: printf("Checking hash operation for 3 hosts: clientid1-len=%lu"
303: " clientid2-len=%lu clientid3-len=%lu\n",
304: (unsigned long) clientid1_len, (unsigned long) clientid2_len,
305: (unsigned long) clientid3_len);
306:
307: dhcp_db_objects_setup ();
308: dhcp_common_objects_setup ();
309:
310: /* check that there is actually zero hosts in the hash */
311: /* @todo: host_hash_for_each() */
312:
313: struct host_decl *host1 = 0, *host2 = 0, *host3 = 0;
314: struct host_decl *check = 0;
315:
316: /* === step 1: allocate hosts === */
317: ATF_CHECK_MSG(host_allocate(&host1, MDL) == ISC_R_SUCCESS,
318: "Failed to allocate host");
319: ATF_CHECK_MSG(host_allocate(&host2, MDL) == ISC_R_SUCCESS,
320: "Failed to allocate host");
321: ATF_CHECK_MSG(host_allocate(&host3, MDL) == ISC_R_SUCCESS,
322: "Failed to allocate host");
323:
324: ATF_CHECK_MSG(host_new_hash(&host_uid_hash, HOST_HASH_SIZE, MDL) != 0,
325: "Unable to create new hash");
326:
327: ATF_CHECK_MSG(buffer_allocate(&host1->client_identifier.buffer,
328: clientid1_len, MDL) != 0,
329: "Can't allocate uid buffer for host1");
330: ATF_CHECK_MSG(buffer_allocate(&host2->client_identifier.buffer,
331: clientid2_len, MDL) != 0,
332: "Can't allocate uid buffer for host2");
333: ATF_CHECK_MSG(buffer_allocate(&host3->client_identifier.buffer,
334: clientid3_len, MDL) != 0,
335: "Can't allocate uid buffer for host3");
336:
337: /* verify that our hosts are not in the hash yet */
338: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
339: clientid1_len, MDL) == 0,
340: "Host1 is not supposed to be in the uid_hash.");
341:
342: ATF_CHECK_MSG(!check, "Host1 is not supposed to be in the uid_hash.");
343:
344: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
345: clientid2_len, MDL) == 0,
346: "Host2 is not supposed to be in the uid_hash.");
347: ATF_CHECK_MSG(!check, "Host2 is not supposed to be in the uid_hash.");
348:
349: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid3,
350: clientid3_len, MDL) == 0,
351: "Host3 is not supposed to be in the uid_hash.");
352: ATF_CHECK_MSG(!check, "Host3 is not supposed to be in the uid_hash.");
353:
354: /* === step 2: add hosts to the hash === */
355: host_hash_add(host_uid_hash, clientid1, clientid1_len, host1, MDL);
356: host_hash_add(host_uid_hash, clientid2, clientid2_len, host2, MDL);
357: host_hash_add(host_uid_hash, clientid3, clientid3_len, host3, MDL);
358:
359: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
360: clientid1_len, MDL),
361: "Host1 was supposed to be in the uid_hash.");
362: /* Hey! That's not the host we were looking for! */
363: ATF_CHECK_MSG(check == host1, "Wrong host returned by host_hash_lookup");
364: host_dereference(&check, MDL); /* we don't need it now */
365:
366: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
367: clientid2_len, MDL),
368: "Host2 was supposed to be in the uid_hash.");
369: ATF_CHECK_MSG(check, "Host2 was supposed to be in the uid_hash.");
370: /* Hey! That's not the host we were looking for! */
371: ATF_CHECK_MSG(check == host2, "Wrong host returned by host_hash_lookup");
372: host_dereference(&check, MDL); /* we don't need it now */
373:
374: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid3,
375: clientid3_len, MDL),
376: "Host3 was supposed to be in the uid_hash.");
377: ATF_CHECK_MSG(check, "Host3 was supposed to be in the uid_hash.");
378: /* Hey! That's not the host we were looking for! */
379: ATF_CHECK_MSG(check == host3, "Wrong host returned by host_hash_lookup");
380: host_dereference(&check, MDL); /* we don't need it now */
381:
382: /* === step 4: remove first host from the hash === */
383:
384: /* delete host from hash */
385: host_hash_delete(host_uid_hash, clientid1, clientid1_len, MDL);
386:
387: /* verify that host1 is no longer in the hash */
388: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid1,
389: clientid1_len, MDL) == 0,
390: "Host1 is not supposed to be in the uid_hash.");
391: ATF_CHECK_MSG(!check, "Host1 is not supposed to be in the uid_hash.");
392:
393: /* host2 and host3 should be still there, though */
394: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
395: clientid2_len, MDL),
396: "Host2 was supposed to still be in the uid_hash.");
397: host_dereference(&check, MDL);
398: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid3,
399: clientid3_len, MDL),
400: "Host3 was supposed to still be in the uid_hash.");
401: host_dereference(&check, MDL);
402:
403: /* === step 5: remove second host from the hash === */
404: host_hash_delete(host_uid_hash, clientid2, clientid2_len, MDL);
405:
406: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid2,
407: clientid2_len, MDL) == 0,
408: "Host2 was not supposed to be in the uid_hash anymore.");
409: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid3,
410: clientid3_len, MDL),
411: "Host3 was supposed to still be in the uid_hash.");
412: host_dereference(&check, MDL);
413:
414: /* === step 6: remove the last (third) host from the hash === */
415: host_hash_delete(host_uid_hash, clientid3, clientid3_len, MDL);
416:
417: ATF_CHECK_MSG(host_hash_lookup(&check, host_uid_hash, clientid3,
418: clientid3_len, MDL) == 0,
419: "Host3 was not supposed to be in the uid_hash anymore.");
420: host_dereference(&check, MDL);
421:
422:
423: host_dereference(&host1, MDL);
424: host_dereference(&host2, MDL);
425: host_dereference(&host3, MDL);
426:
427: /*
428: * No easy way to check if the host object were actually released.
429: * We could run it in valgrind and check for memory leaks.
430: */
431:
432: #if defined (DEBUG_MEMORY_LEAKAGE) && defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT)
433: /* @todo: Should be called in cleanup */
434: free_everything ();
435: #endif
436: }
437:
438: ATF_TC(lease_hash_basic_2hosts);
439:
440: ATF_TC_HEAD(lease_hash_basic_2hosts, tc) {
441: atf_tc_set_md_var(tc, "descr", "Basic lease hash tests");
442: /*
443: * The following functions are tested:
444: * host_allocate(), host_new_hash(), buffer_allocate(), host_hash_lookup()
445: * host_hash_add(), host_hash_delete()
446: */
447: }
448:
449: ATF_TC_BODY(lease_hash_basic_2hosts, tc) {
450:
451: unsigned char clientid1[] = { 0x1, 0x2, 0x3 };
452: unsigned char clientid2[] = { 0xff, 0xfe };
453:
454: lease_hash_test_2hosts(clientid1, sizeof(clientid1),
455: clientid2, sizeof(clientid2));
456: }
457:
458:
459: ATF_TC(lease_hash_string_2hosts);
460:
461: ATF_TC_HEAD(lease_hash_string_2hosts, tc) {
462: atf_tc_set_md_var(tc, "descr", "string-based lease hash tests");
463: /*
464: * The following functions are tested:
465: * host_allocate(), host_new_hash(), buffer_allocate(), host_hash_lookup()
466: * host_hash_add(), host_hash_delete()
467: */
468: }
469:
470: ATF_TC_BODY(lease_hash_string_2hosts, tc) {
471:
472: unsigned char clientid1[] = "Alice";
473: unsigned char clientid2[] = "Bob";
474:
475: lease_hash_test_2hosts(clientid1, 0, clientid2, 0);
476: }
477:
478:
479: ATF_TC(lease_hash_negative1);
480:
481: ATF_TC_HEAD(lease_hash_negative1, tc) {
482: atf_tc_set_md_var(tc, "descr", "Negative tests for lease hash");
483: }
484:
485: ATF_TC_BODY(lease_hash_negative1, tc) {
486:
487: unsigned char clientid1[] = { 0x1 };
488: unsigned char clientid2[] = { 0x0 };
489:
490: lease_hash_test_2hosts(clientid1, 0, clientid2, 1);
491: }
492:
493:
494:
495: ATF_TC(lease_hash_string_3hosts);
496: ATF_TC_HEAD(lease_hash_string_3hosts, tc) {
497: atf_tc_set_md_var(tc, "descr", "string-based lease hash tests");
498: /*
499: * The following functions are tested:
500: * host_allocate(), host_new_hash(), buffer_allocate(), host_hash_lookup()
501: * host_hash_add(), host_hash_delete()
502: */
503: }
504: ATF_TC_BODY(lease_hash_string_3hosts, tc) {
505:
506: unsigned char clientid1[] = "Alice";
507: unsigned char clientid2[] = "Bob";
508: unsigned char clientid3[] = "Charlie";
509:
510: lease_hash_test_3hosts(clientid1, 0, clientid2, 0, clientid3, 0);
511: }
512:
513:
514: ATF_TC(lease_hash_basic_3hosts);
515: ATF_TC_HEAD(lease_hash_basic_3hosts, tc) {
516: atf_tc_set_md_var(tc, "descr", "Basic lease hash tests");
517: /*
518: * The following functions are tested:
519: * host_allocate(), host_new_hash(), buffer_allocate(), host_hash_lookup()
520: * host_hash_add(), host_hash_delete()
521: */
522: }
523: ATF_TC_BODY(lease_hash_basic_3hosts, tc) {
524:
525: unsigned char clientid1[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9 };
526: unsigned char clientid2[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 };
527: unsigned char clientid3[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7 };
528:
529: lease_hash_test_3hosts(clientid1, sizeof(clientid1),
530: clientid2, sizeof(clientid2),
531: clientid3, sizeof(clientid3));
532: }
533:
534: /* this test is a direct reproduction of 29851 issue */
535: ATF_TC(uid_hash_rt29851);
536:
537: ATF_TC_HEAD(uid_hash_rt29851, tc) {
538: atf_tc_set_md_var(tc, "descr", "Uid hash tests");
539:
540: /*
541: * this test should last less than millisecond. If its execution
542: * is longer than 3 second, we hit infinite loop.
543: */
544: atf_tc_set_md_var(tc, "timeout", "3");
545: }
546:
547: ATF_TC_BODY(uid_hash_rt29851, tc) {
548:
549: unsigned char clientid1[] = { 0x0 };
550: unsigned char clientid2[] = { 0x0 };
551: unsigned char clientid3[] = { 0x0 };
552:
553: int clientid1_len = 1;
554: int clientid2_len = 1;
555: int clientid3_len = 0;
556:
557: struct lease *lease1 = 0, *lease2 = 0, *lease3 = 0;
558:
559: dhcp_db_objects_setup ();
560: dhcp_common_objects_setup ();
561:
562: ATF_CHECK(lease_id_new_hash(&lease_uid_hash, LEASE_HASH_SIZE, MDL));
563:
564: ATF_CHECK(lease_allocate (&lease1, MDL) == ISC_R_SUCCESS);
565: ATF_CHECK(lease_allocate (&lease2, MDL) == ISC_R_SUCCESS);
566: ATF_CHECK(lease_allocate (&lease3, MDL) == ISC_R_SUCCESS);
567:
568: lease1->uid = clientid1;
569: lease2->uid = clientid2;
570: lease3->uid = clientid3;
571:
572: lease1->uid_len = clientid1_len;
573: lease2->uid_len = clientid2_len;
574: lease3->uid_len = clientid3_len;
575:
576: uid_hash_add(lease1);
577: /* uid_hash_delete(lease2); // not necessary for actual issue repro */
578: uid_hash_add(lease3);
579:
580: /* lease2->uid_len = 0; // not necessary for actual issue repro */
581: /* uid_hash_delete(lease2); // not necessary for actual issue repro */
582: /* uid_hash_delete(lease3); // not necessary for actual issue repro */
583: uid_hash_delete(lease1);
584:
585: /* lease2->uid_len = 1; // not necessary for actual issue repro */
586: uid_hash_add(lease1);
587: uid_hash_delete(lease2);
588: }
589:
590:
591:
592:
593:
594:
595: ATF_TP_ADD_TCS(tp) {
596: ATF_TP_ADD_TC(tp, lease_hash_basic_2hosts);
597: ATF_TP_ADD_TC(tp, lease_hash_basic_3hosts);
598: ATF_TP_ADD_TC(tp, lease_hash_string_2hosts);
599: ATF_TP_ADD_TC(tp, lease_hash_string_3hosts);
600: ATF_TP_ADD_TC(tp, lease_hash_negative1);
601: ATF_TP_ADD_TC(tp, uid_hash_rt29851);
602: return (atf_no_error());
603: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>