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>