1290001Sglebius/* 2290001Sglebius * Copyright (C) 2011, 2012 Internet Systems Consortium, Inc. ("ISC") 3290001Sglebius * 4290001Sglebius * Permission to use, copy, modify, and/or distribute this software for any 5290001Sglebius * purpose with or without fee is hereby granted, provided that the above 6290001Sglebius * copyright notice and this permission notice appear in all copies. 7290001Sglebius * 8290001Sglebius * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9290001Sglebius * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10290001Sglebius * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11290001Sglebius * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12290001Sglebius * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13290001Sglebius * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14290001Sglebius * PERFORMANCE OF THIS SOFTWARE. 15290001Sglebius */ 16290001Sglebius 17290001Sglebius/* $Id$ */ 18290001Sglebius 19290001Sglebius/*! \file */ 20290001Sglebius 21290001Sglebius#include <config.h> 22290001Sglebius 23290001Sglebius#include <atf-c.h> 24290001Sglebius 25290001Sglebius#include <unistd.h> 26290001Sglebius 27290001Sglebius#include <isc/symtab.h> 28290001Sglebius#include <isc/print.h> 29290001Sglebius 30290001Sglebius#include "isctest.h" 31290001Sglebius 32290001Sglebiusstatic void 33290001Sglebiusundefine(char *key, unsigned int type, isc_symvalue_t value, void *arg) { 34290001Sglebius UNUSED(arg); 35290001Sglebius 36290001Sglebius ATF_REQUIRE_EQ(type, 1); 37290001Sglebius isc_mem_free(mctx, key); 38290001Sglebius isc_mem_free(mctx, value.as_pointer); 39290001Sglebius} 40290001Sglebius 41290001Sglebius/* 42290001Sglebius * Individual unit tests 43290001Sglebius */ 44290001Sglebius 45290001SglebiusATF_TC(symtab_grow); 46290001SglebiusATF_TC_HEAD(symtab_grow, tc) { 47290001Sglebius atf_tc_set_md_var(tc, "descr", "symbol table growth"); 48290001Sglebius} 49290001SglebiusATF_TC_BODY(symtab_grow, tc) { 50290001Sglebius isc_result_t result; 51290001Sglebius isc_symtab_t *st = NULL; 52290001Sglebius isc_symvalue_t value; 53290001Sglebius isc_symexists_t policy = isc_symexists_reject; 54290001Sglebius int i; 55290001Sglebius 56290001Sglebius UNUSED(tc); 57290001Sglebius 58290001Sglebius result = isc_test_begin(NULL, ISC_TRUE); 59290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 60290001Sglebius 61290001Sglebius result = isc_symtab_create(mctx, 3, undefine, NULL, ISC_FALSE, &st); 62290001Sglebius ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); 63290001Sglebius ATF_REQUIRE(st != NULL); 64290001Sglebius 65290001Sglebius /* Nothing should be in the table yet */ 66290001Sglebius 67290001Sglebius /* 68290001Sglebius * Put 1024 entries in the table (this should necessate 69290001Sglebius * regrowing the hash table several times 70290001Sglebius */ 71290001Sglebius for (i = 0; i < 1024; i++) { 72290001Sglebius char str[16], *key; 73290001Sglebius 74290001Sglebius snprintf(str, sizeof(str), "%04x", i); 75290001Sglebius key = isc_mem_strdup(mctx, str); 76290001Sglebius ATF_REQUIRE(key != NULL); 77290001Sglebius value.as_pointer = isc_mem_strdup(mctx, str); 78290001Sglebius ATF_REQUIRE(value.as_pointer != NULL); 79290001Sglebius result = isc_symtab_define(st, key, 1, value, policy); 80290001Sglebius ATF_CHECK_EQ(result, ISC_R_SUCCESS); 81290001Sglebius if (result != ISC_R_SUCCESS) 82290001Sglebius undefine(key, 1, value, NULL); 83290001Sglebius } 84290001Sglebius 85290001Sglebius /* 86290001Sglebius * Try to put them in again; this should fail 87290001Sglebius */ 88290001Sglebius for (i = 0; i < 1024; i++) { 89290001Sglebius char str[16], *key; 90290001Sglebius 91290001Sglebius snprintf(str, sizeof(str), "%04x", i); 92290001Sglebius key = isc_mem_strdup(mctx, str); 93290001Sglebius ATF_REQUIRE(key != NULL); 94290001Sglebius value.as_pointer = isc_mem_strdup(mctx, str); 95290001Sglebius ATF_REQUIRE(value.as_pointer != NULL); 96290001Sglebius result = isc_symtab_define(st, key, 1, value, policy); 97290001Sglebius ATF_CHECK_EQ(result, ISC_R_EXISTS); 98290001Sglebius undefine(key, 1, value, NULL); 99290001Sglebius } 100290001Sglebius 101290001Sglebius /* 102290001Sglebius * Retrieve them; this should succeed 103290001Sglebius */ 104290001Sglebius for (i = 0; i < 1024; i++) { 105290001Sglebius char str[16]; 106290001Sglebius 107290001Sglebius snprintf(str, sizeof(str), "%04x", i); 108290001Sglebius result = isc_symtab_lookup(st, str, 0, &value); 109290001Sglebius ATF_CHECK_EQ(result, ISC_R_SUCCESS); 110290001Sglebius ATF_CHECK_STREQ(str, value.as_pointer); 111290001Sglebius } 112290001Sglebius 113290001Sglebius /* 114290001Sglebius * Undefine them 115290001Sglebius */ 116290001Sglebius for (i = 0; i < 1024; i++) { 117290001Sglebius char str[16]; 118290001Sglebius 119290001Sglebius snprintf(str, sizeof(str), "%04x", i); 120290001Sglebius result = isc_symtab_undefine(st, str, 1); 121290001Sglebius ATF_CHECK_EQ(result, ISC_R_SUCCESS); 122290001Sglebius } 123290001Sglebius 124290001Sglebius /* 125290001Sglebius * Retrieve them again; this should fail 126290001Sglebius */ 127290001Sglebius for (i = 0; i < 1024; i++) { 128290001Sglebius char str[16]; 129290001Sglebius 130290001Sglebius snprintf(str, sizeof(str), "%04x", i); 131290001Sglebius result = isc_symtab_lookup(st, str, 0, &value); 132290001Sglebius ATF_CHECK_EQ(result, ISC_R_NOTFOUND); 133290001Sglebius } 134290001Sglebius 135290001Sglebius isc_symtab_destroy(&st); 136290001Sglebius isc_test_end(); 137290001Sglebius} 138290001Sglebius 139290001Sglebius/* 140290001Sglebius * Main 141290001Sglebius */ 142290001SglebiusATF_TP_ADD_TCS(tp) { 143290001Sglebius ATF_TP_ADD_TC(tp, symtab_grow); 144290001Sglebius 145290001Sglebius return (atf_no_error()); 146290001Sglebius} 147290001Sglebius 148