1*57718be8SEnji Cooper /* $NetBSD: t_cdb.c,v 1.1 2012/09/27 00:38:57 joerg Exp $ */ 2*57718be8SEnji Cooper /*- 3*57718be8SEnji Cooper * Copyright (c) 2012 The NetBSD Foundation, Inc. 4*57718be8SEnji Cooper * All rights reserved. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 7*57718be8SEnji Cooper * by Joerg Sonnenberger. 8*57718be8SEnji Cooper * 9*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 10*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 11*57718be8SEnji Cooper * are met: 12*57718be8SEnji Cooper * 13*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 14*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 15*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 16*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in 17*57718be8SEnji Cooper * the documentation and/or other materials provided with the 18*57718be8SEnji Cooper * distribution. 19*57718be8SEnji Cooper * 20*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*57718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*57718be8SEnji Cooper * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*57718be8SEnji Cooper * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24*57718be8SEnji Cooper * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*57718be8SEnji Cooper * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*57718be8SEnji Cooper * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27*57718be8SEnji Cooper * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*57718be8SEnji Cooper * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*57718be8SEnji Cooper * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 30*57718be8SEnji Cooper * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*57718be8SEnji Cooper * SUCH DAMAGE. 32*57718be8SEnji Cooper */ 33*57718be8SEnji Cooper 34*57718be8SEnji Cooper #include <sys/cdefs.h> 35*57718be8SEnji Cooper __RCSID("$NetBSD: t_cdb.c,v 1.1 2012/09/27 00:38:57 joerg Exp $"); 36*57718be8SEnji Cooper 37*57718be8SEnji Cooper #include <atf-c.h> 38*57718be8SEnji Cooper #include <assert.h> 39*57718be8SEnji Cooper #include <cdbr.h> 40*57718be8SEnji Cooper #include <cdbw.h> 41*57718be8SEnji Cooper #include <fcntl.h> 42*57718be8SEnji Cooper #include <stdlib.h> 43*57718be8SEnji Cooper #include <string.h> 44*57718be8SEnji Cooper #include <unistd.h> 45*57718be8SEnji Cooper 46*57718be8SEnji Cooper #define MAXKEYS 16384 47*57718be8SEnji Cooper 48*57718be8SEnji Cooper static const char database_name[] = "test.cdb"; 49*57718be8SEnji Cooper 50*57718be8SEnji Cooper uint32_t keys[MAXKEYS]; 51*57718be8SEnji Cooper 52*57718be8SEnji Cooper static int 53*57718be8SEnji Cooper cmp_keys(const void *a_, const void *b_) 54*57718be8SEnji Cooper { 55*57718be8SEnji Cooper uint32_t a = *(const uint32_t *)a_; 56*57718be8SEnji Cooper uint32_t b = *(const uint32_t *)b_; 57*57718be8SEnji Cooper 58*57718be8SEnji Cooper return a > b ? 1 : (a < b ? 1 : 0); 59*57718be8SEnji Cooper } 60*57718be8SEnji Cooper 61*57718be8SEnji Cooper static void 62*57718be8SEnji Cooper init_keys(size_t len) 63*57718be8SEnji Cooper { 64*57718be8SEnji Cooper uint32_t sorted_keys[MAXKEYS]; 65*57718be8SEnji Cooper size_t i; 66*57718be8SEnji Cooper 67*57718be8SEnji Cooper assert(len <= MAXKEYS); 68*57718be8SEnji Cooper 69*57718be8SEnji Cooper if (len == 0) 70*57718be8SEnji Cooper return; 71*57718be8SEnji Cooper 72*57718be8SEnji Cooper do { 73*57718be8SEnji Cooper for (i = 0; i < len; ++i) 74*57718be8SEnji Cooper sorted_keys[i] = keys[i] = arc4random(); 75*57718be8SEnji Cooper 76*57718be8SEnji Cooper qsort(sorted_keys, len, sizeof(*sorted_keys), cmp_keys); 77*57718be8SEnji Cooper for (i = 1; i < len; ++i) { 78*57718be8SEnji Cooper if (sorted_keys[i - 1] == sorted_keys[i]) 79*57718be8SEnji Cooper break; 80*57718be8SEnji Cooper } 81*57718be8SEnji Cooper } while (i != len); 82*57718be8SEnji Cooper } 83*57718be8SEnji Cooper 84*57718be8SEnji Cooper static void 85*57718be8SEnji Cooper write_database(size_t len) 86*57718be8SEnji Cooper { 87*57718be8SEnji Cooper struct cdbw *db; 88*57718be8SEnji Cooper int fd; 89*57718be8SEnji Cooper size_t i; 90*57718be8SEnji Cooper uint32_t buf[2]; 91*57718be8SEnji Cooper 92*57718be8SEnji Cooper ATF_REQUIRE((db = cdbw_open()) != NULL); 93*57718be8SEnji Cooper ATF_REQUIRE((fd = creat(database_name, S_IRUSR|S_IWUSR)) != -1); 94*57718be8SEnji Cooper for (i = 0; i < len; ++i) { 95*57718be8SEnji Cooper buf[0] = i; 96*57718be8SEnji Cooper buf[1] = keys[i]; 97*57718be8SEnji Cooper ATF_REQUIRE(cdbw_put(db, &keys[i], sizeof(keys[i]), 98*57718be8SEnji Cooper buf, sizeof(buf)) == 0); 99*57718be8SEnji Cooper } 100*57718be8SEnji Cooper ATF_REQUIRE(cdbw_output(db, fd, "test database", arc4random) == 0); 101*57718be8SEnji Cooper cdbw_close(db); 102*57718be8SEnji Cooper ATF_REQUIRE(close(fd) == 0); 103*57718be8SEnji Cooper } 104*57718be8SEnji Cooper 105*57718be8SEnji Cooper static void 106*57718be8SEnji Cooper check_database(size_t len) 107*57718be8SEnji Cooper { 108*57718be8SEnji Cooper struct cdbr *db; 109*57718be8SEnji Cooper size_t i, data_len; 110*57718be8SEnji Cooper const void *data; 111*57718be8SEnji Cooper uint32_t buf[2]; 112*57718be8SEnji Cooper 113*57718be8SEnji Cooper ATF_REQUIRE((db = cdbr_open(database_name, CDBR_DEFAULT)) != NULL); 114*57718be8SEnji Cooper ATF_REQUIRE_EQ(cdbr_entries(db), len); 115*57718be8SEnji Cooper for (i = 0; i < len; ++i) { 116*57718be8SEnji Cooper ATF_REQUIRE(cdbr_find(db, &keys[i], sizeof(keys[i]), 117*57718be8SEnji Cooper &data, &data_len) != -1); 118*57718be8SEnji Cooper ATF_REQUIRE_EQ(data_len, sizeof(buf)); 119*57718be8SEnji Cooper memcpy(buf, data, sizeof(buf)); 120*57718be8SEnji Cooper ATF_REQUIRE_EQ(buf[0], i); 121*57718be8SEnji Cooper ATF_REQUIRE_EQ(buf[1], keys[i]); 122*57718be8SEnji Cooper } 123*57718be8SEnji Cooper cdbr_close(db); 124*57718be8SEnji Cooper } 125*57718be8SEnji Cooper 126*57718be8SEnji Cooper ATF_TC_WITH_CLEANUP(cdb); 127*57718be8SEnji Cooper 128*57718be8SEnji Cooper ATF_TC_HEAD(cdb, tc) 129*57718be8SEnji Cooper { 130*57718be8SEnji Cooper 131*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test cdb(5) reading and writing"); 132*57718be8SEnji Cooper } 133*57718be8SEnji Cooper 134*57718be8SEnji Cooper ATF_TC_BODY(cdb, tc) 135*57718be8SEnji Cooper { 136*57718be8SEnji Cooper size_t i, sizes[] = { 0, 16, 64, 1024, 2048 }; 137*57718be8SEnji Cooper for (i = 0; i < __arraycount(sizes); ++i) { 138*57718be8SEnji Cooper init_keys(sizes[i]); 139*57718be8SEnji Cooper write_database(sizes[i]); 140*57718be8SEnji Cooper check_database(sizes[i]); 141*57718be8SEnji Cooper unlink(database_name); 142*57718be8SEnji Cooper } 143*57718be8SEnji Cooper } 144*57718be8SEnji Cooper 145*57718be8SEnji Cooper ATF_TC_CLEANUP(cdb, tc) 146*57718be8SEnji Cooper { 147*57718be8SEnji Cooper 148*57718be8SEnji Cooper unlink(database_name); 149*57718be8SEnji Cooper } 150*57718be8SEnji Cooper 151*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 152*57718be8SEnji Cooper { 153*57718be8SEnji Cooper 154*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, cdb); 155*57718be8SEnji Cooper 156*57718be8SEnji Cooper return atf_no_error(); 157*57718be8SEnji Cooper } 158*57718be8SEnji Cooper 159