• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2 
3 #include <sys/param.h>
4 
5 #include <sys/types.h>
6 
7 #include <sys/mman.h>
8 #include <sys/stat.h>
9 
10 #include <assert.h>
11 #include <cdbr.h>
12 #include <cdbw.h>
13 #include <fcntl.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <unistd.h>
18 
19 static char *name;
20 
21 const char data1[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
22 const char data2[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17};
23 const char key1[] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27};
24 const char key2[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37};
25 
test_cdbw()26 void test_cdbw() {
27   uint32_t idx;
28 
29   struct cdbw *cdbw = cdbw_open();
30   assert(cdbw);
31 
32   int rv = cdbw_put_data(cdbw, data1, __arraycount(data1), &idx);
33   assert(!rv);
34 
35   rv = cdbw_put_key(cdbw, key1, __arraycount(key1), idx);
36   assert(!rv);
37 
38   rv = cdbw_put(cdbw, key2, __arraycount(key2), data2, __arraycount(data2));
39   assert(!rv);
40 
41   name = strdup("/tmp/temp.XXXXXX");
42   assert(name);
43 
44   name = mktemp(name);
45   assert(name);
46 
47   int fd = open(name, O_RDWR | O_CREAT, 0644);
48   assert(fd != -1);
49 
50   cdbw_output(cdbw, fd, "TEST1", cdbw_stable_seeder);
51 
52   cdbw_close(cdbw);
53 
54   rv = close(fd);
55   assert(rv != -1);
56 }
57 
test_cdbr1()58 void test_cdbr1() {
59   struct cdbr *cdbr = cdbr_open(name, CDBR_DEFAULT);
60   assert(cdbr);
61 
62   uint32_t idx = cdbr_entries(cdbr);
63   assert(idx > 0);
64   printf("entries: %" PRIu32 "\n", idx);
65 
66   const void *data;
67   size_t data_len;
68   int rv = cdbr_get(cdbr, idx - 1, &data, &data_len);
69   assert(rv == 0);
70 
71   printf("data: ");
72   for (size_t i = 0; i < data_len; i++)
73     printf("%02" PRIx8, ((uint8_t *)data)[i]);
74   printf("\n");
75 
76   rv = cdbr_find(cdbr, key1, __arraycount(key1), &data, &data_len);
77 
78   printf("data: ");
79   for (size_t i = 0; i < data_len; i++)
80     printf("%02" PRIx8, ((uint8_t *)data)[i]);
81   printf("\n");
82 
83   cdbr_close(cdbr);
84 }
85 
86 #define COOKIE ((void *)1)
87 
cdbr_unmap(void * cookie,void * base,size_t sz)88 static void cdbr_unmap(void *cookie, void *base, size_t sz) {
89   assert(cookie == COOKIE);
90   int rv = munmap(base, sz);
91   assert(rv != -1);
92 }
93 
test_cdbr2()94 void test_cdbr2() {
95   struct stat sb;
96 
97   int fd = open(name, O_RDONLY);
98   assert(fd != -1);
99 
100   int rv = fstat(fd, &sb);
101   assert(rv != -1);
102 
103   size_t sz = sb.st_size;
104   assert(sz < SSIZE_MAX);
105 
106   void *base = mmap(NULL, sz, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
107   assert(base != MAP_FAILED);
108 
109   rv = close(fd);
110   assert(rv != -1);
111 
112   struct cdbr *cdbr = cdbr_open_mem(base, sz, CDBR_DEFAULT, cdbr_unmap, COOKIE);
113   assert(cdbr);
114 
115   printf("entries: %" PRIu32 "\n", cdbr_entries(cdbr));
116 
117   cdbr_close(cdbr);
118 }
119 
main(void)120 int main(void) {
121   printf("cdb\n");
122 
123   test_cdbw();
124   test_cdbr1();
125   test_cdbr2();
126 
127   // CHECK: cdb
128   // CHECK: entries: 2
129   // CHECK: data: 1011121314151617
130   // CHECK: data: 0001020304050607
131   // CHECK: entries: 2
132 
133   return 0;
134 }
135