1 
2 #ifndef __WRAPPER_INT_H_
3 #define __WRAPPER_INT_H_
4 
5 #include "lsmtest_tdb.h"
6 #include "sqlite3.h"
7 #include "lsm.h"
8 
9 #include <assert.h>
10 #include <stdarg.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <stdio.h>
14 #ifndef _WIN32
15 # include <unistd.h>
16 #endif
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 #include <fcntl.h>
20 #include <ctype.h>
21 #include <stdlib.h>
22 #include <errno.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #ifdef _WIN32
29 # include "windows.h"
30 # define gettimeofday win32GetTimeOfDay
31 # define F_OK  (0)
32 # define sleep(sec) Sleep(1000 * (sec))
33 # define usleep(usec) Sleep(((usec) + 999) / 1000)
34 # ifdef _MSC_VER
35 #  include <io.h>
36 #  define snprintf _snprintf
37 #  define fsync(fd) FlushFileBuffers((HANDLE)_get_osfhandle((fd)))
38 #  define fdatasync(fd) FlushFileBuffers((HANDLE)_get_osfhandle((fd)))
39 #  define __va_copy(dst,src) ((dst) = (src))
40 #  define ftruncate(fd,sz) ((_chsize_s((fd), (sz))==0) ? 0 : -1)
41 # else
42 #  error Unsupported C compiler for Windows.
43 # endif
44 int win32GetTimeOfDay(struct timeval *, void *);
45 #endif
46 
47 #ifndef _LSM_INT_H
48 typedef unsigned int  u32;
49 typedef unsigned char u8;
50 typedef long long int i64;
51 typedef unsigned long long int u64;
52 #endif
53 
54 
55 #define ArraySize(x) ((int)(sizeof(x) / sizeof((x)[0])))
56 
57 #define MIN(x,y) ((x)<(y) ? (x) : (y))
58 #define MAX(x,y) ((x)>(y) ? (x) : (y))
59 
60 #define unused_parameter(x) (void)(x)
61 
62 #define TESTDB_DEFAULT_PAGE_SIZE   4096
63 #define TESTDB_DEFAULT_CACHE_SIZE  2048
64 
65 #ifndef _O_BINARY
66 # define _O_BINARY (0)
67 #endif
68 
69 /*
70 ** Ideally, these should be in wrapper.c. But they are here instead so that
71 ** they can be used by the C++ database wrappers in wrapper2.cc.
72 */
73 typedef struct DatabaseMethods DatabaseMethods;
74 struct TestDb {
75   DatabaseMethods const *pMethods;          /* Database methods */
76   const char *zLibrary;                     /* Library name for tdb_open() */
77 };
78 struct DatabaseMethods {
79   int (*xClose)(TestDb *);
80   int (*xWrite)(TestDb *, void *, int , void *, int);
81   int (*xDelete)(TestDb *, void *, int);
82   int (*xDeleteRange)(TestDb *, void *, int, void *, int);
83   int (*xFetch)(TestDb *, void *, int, void **, int *);
84   int (*xScan)(TestDb *, void *, int, void *, int, void *, int,
85     void (*)(void *, void *, int , void *, int)
86   );
87   int (*xBegin)(TestDb *, int);
88   int (*xCommit)(TestDb *, int);
89   int (*xRollback)(TestDb *, int);
90 };
91 
92 /*
93 ** Functions in wrapper2.cc (a C++ source file). wrapper2.cc contains the
94 ** wrapper for Kyoto Cabinet. Kyoto cabinet has a C API, but
95 ** the primary interface is the C++ API.
96 */
97 int test_kc_open(const char*, const char *zFilename, int bClear, TestDb **ppDb);
98 int test_kc_close(TestDb *);
99 int test_kc_write(TestDb *, void *, int , void *, int);
100 int test_kc_delete(TestDb *, void *, int);
101 int test_kc_delete_range(TestDb *, void *, int, void *, int);
102 int test_kc_fetch(TestDb *, void *, int, void **, int *);
103 int test_kc_scan(TestDb *, void *, int, void *, int, void *, int,
104   void (*)(void *, void *, int , void *, int)
105 );
106 
107 int test_mdb_open(const char*, const char *zFile, int bClear, TestDb **ppDb);
108 int test_mdb_close(TestDb *);
109 int test_mdb_write(TestDb *, void *, int , void *, int);
110 int test_mdb_delete(TestDb *, void *, int);
111 int test_mdb_fetch(TestDb *, void *, int, void **, int *);
112 int test_mdb_scan(TestDb *, void *, int, void *, int, void *, int,
113   void (*)(void *, void *, int , void *, int)
114 );
115 
116 /*
117 ** Functions in wrapper3.c. This file contains the tdb wrapper for lsm.
118 ** The wrapper for lsm is a bit more involved than the others, as it
119 ** includes code for a couple of different lsm configurations, and for
120 ** various types of fault injection and robustness testing.
121 */
122 int test_lsm_open(const char*, const char *zFile, int bClear, TestDb **ppDb);
123 int test_lsm_lomem_open(const char*, const char*, int bClear, TestDb **ppDb);
124 int test_lsm_lomem2_open(const char*, const char*, int bClear, TestDb **ppDb);
125 int test_lsm_zip_open(const char*, const char*, int bClear, TestDb **ppDb);
126 int test_lsm_small_open(const char*, const char*, int bClear, TestDb **ppDb);
127 int test_lsm_mt2(const char*, const char *zFile, int bClear, TestDb **ppDb);
128 int test_lsm_mt3(const char*, const char *zFile, int bClear, TestDb **ppDb);
129 
130 int tdb_lsm_configure(lsm_db *, const char *);
131 
132 /* Functions in lsmtest_tdb4.c */
133 int test_bt_open(const char*, const char *zFile, int bClear, TestDb **ppDb);
134 int test_fbt_open(const char*, const char *zFile, int bClear, TestDb **ppDb);
135 int test_fbts_open(const char*, const char *zFile, int bClear, TestDb **ppDb);
136 
137 
138 /* Functions in testutil.c. */
139 int  testPrngInit(void);
140 u32  testPrngValue(u32 iVal);
141 void testPrngArray(u32 iVal, u32 *aOut, int nOut);
142 void testPrngString(u32 iVal, char *aOut, int nOut);
143 
144 void testErrorInit(int argc, char **);
145 void testPrintError(const char *zFormat, ...);
146 void testPrintUsage(const char *zArgs);
147 void testPrintFUsage(const char *zFormat, ...);
148 void testTimeInit(void);
149 int  testTimeGet(void);
150 
151 /* Functions in testmem.c. */
152 void testMallocInstall(lsm_env *pEnv);
153 void testMallocUninstall(lsm_env *pEnv);
154 void testMallocCheck(lsm_env *pEnv, int *, int *, FILE *);
155 void testMallocOom(lsm_env *pEnv, int, int, void(*)(void*), void *);
156 void testMallocOomEnable(lsm_env *pEnv, int);
157 
158 /* lsmtest.c */
159 TestDb *testOpen(const char *zSystem, int, int *pRc);
160 void testReopen(TestDb **ppDb, int *pRc);
161 void testClose(TestDb **ppDb);
162 
163 void testFetch(TestDb *, void *, int, void *, int, int *);
164 void testWrite(TestDb *, void *, int, void *, int, int *);
165 void testDelete(TestDb *, void *, int, int *);
166 void testDeleteRange(TestDb *, void *, int, void *, int, int *);
167 void testWriteStr(TestDb *, const char *, const char *zVal, int *pRc);
168 void testFetchStr(TestDb *, const char *, const char *, int *pRc);
169 
170 void testBegin(TestDb *pDb, int iTrans, int *pRc);
171 void testCommit(TestDb *pDb, int iTrans, int *pRc);
172 
173 void test_failed(void);
174 
175 char *testMallocPrintf(const char *zFormat, ...);
176 char *testMallocVPrintf(const char *zFormat, va_list ap);
177 int testGlobMatch(const char *zPattern, const char *zStr);
178 
179 void testScanCompare(TestDb *, TestDb *, int, void *, int, void *, int, int *);
180 void testFetchCompare(TestDb *, TestDb *, void *, int, int *);
181 
182 void *testMalloc(int);
183 void *testMallocCopy(void *pCopy, int nByte);
184 void *testRealloc(void *, int);
185 void testFree(void *);
186 
187 /* lsmtest_bt.c */
188 int do_bt(int nArg, char **azArg);
189 
190 /* testio.c */
191 int testVfsConfigureDb(TestDb *pDb);
192 
193 /* testfunc.c */
194 int do_show(int nArg, char **azArg);
195 int do_work(int nArg, char **azArg);
196 
197 /* testio.c */
198 int do_io(int nArg, char **azArg);
199 
200 /* lsmtest2.c */
201 void do_crash_test(const char *zPattern, int *pRc);
202 int do_rollback_test(int nArg, char **azArg);
203 
204 /* test3.c */
205 void test_rollback(const char *zSystem, const char *zPattern, int *pRc);
206 
207 /* test4.c */
208 void test_mc(const char *zSystem, const char *zPattern, int *pRc);
209 
210 /* test5.c */
211 void test_mt(const char *zSystem, const char *zPattern, int *pRc);
212 
213 /* lsmtest6.c */
214 void test_oom(const char *zPattern, int *pRc);
215 void testDeleteLsmdb(const char *zFile);
216 
217 void testSaveDb(const char *zFile, const char *zAuxExt);
218 void testRestoreDb(const char *zFile, const char *zAuxExt);
219 void testCopyLsmdb(const char *zFrom, const char *zTo);
220 
221 /* lsmtest7.c */
222 void test_api(const char *zPattern, int *pRc);
223 
224 /* lsmtest8.c */
225 void do_writer_crash_test(const char *zPattern, int *pRc);
226 
227 /*************************************************************************
228 ** Interface to functionality in test_datasource.c.
229 */
230 typedef struct Datasource Datasource;
231 typedef struct DatasourceDefn DatasourceDefn;
232 
233 struct DatasourceDefn {
234   int eType;                      /* A TEST_DATASOURCE_* value */
235   int nMinKey;                    /* Minimum key size */
236   int nMaxKey;                    /* Maximum key size */
237   int nMinVal;                    /* Minimum value size */
238   int nMaxVal;                    /* Maximum value size */
239 };
240 
241 #define TEST_DATASOURCE_RANDOM    1
242 #define TEST_DATASOURCE_SEQUENCE  2
243 
244 char *testDatasourceName(const DatasourceDefn *);
245 Datasource *testDatasourceNew(const DatasourceDefn *);
246 void testDatasourceFree(Datasource *);
247 void testDatasourceEntry(Datasource *, int, void **, int *, void **, int *);
248 /* End of test_datasource.c interface.
249 *************************************************************************/
250 void testDatasourceFetch(
251   TestDb *pDb,                    /* Database handle */
252   Datasource *pData,
253   int iKey,
254   int *pRc                        /* IN/OUT: Error code */
255 );
256 
257 void testWriteDatasource(TestDb *, Datasource *, int, int *);
258 void testWriteDatasourceRange(TestDb *, Datasource *, int, int, int *);
259 void testDeleteDatasource(TestDb *, Datasource *, int, int *);
260 void testDeleteDatasourceRange(TestDb *, Datasource *, int, int, int *);
261 
262 
263 /* test1.c */
264 void test_data_1(const char *, const char *, int *pRc);
265 void test_data_2(const char *, const char *, int *pRc);
266 void test_data_3(const char *, const char *, int *pRc);
267 void testDbContents(TestDb *, Datasource *, int, int, int, int, int, int *);
268 void testCaseProgress(int, int, int, int *);
269 int testCaseNDot(void);
270 
271 void testCompareDb(Datasource *, int, int, TestDb *, TestDb *, int *);
272 int testControlDb(TestDb **ppDb);
273 
274 typedef struct CksumDb CksumDb;
275 CksumDb *testCksumArrayNew(Datasource *, int, int, int);
276 char *testCksumArrayGet(CksumDb *, int);
277 void testCksumArrayFree(CksumDb *);
278 void testCaseStart(int *pRc, char *zFmt, ...);
279 void testCaseFinish(int rc);
280 void testCaseSkip(void);
281 int testCaseBegin(int *, const char *, const char *, ...);
282 
283 #define TEST_CKSUM_BYTES 29
284 int testCksumDatabase(TestDb *pDb, char *zOut);
285 int testCountDatabase(TestDb *pDb);
286 void testCompareInt(int, int, int *);
287 void testCompareStr(const char *z1, const char *z2, int *pRc);
288 
289 /* lsmtest9.c */
290 void test_data_4(const char *, const char *, int *pRc);
291 
292 
293 /*
294 ** Similar to the Tcl_GetIndexFromObjStruct() Tcl library function.
295 */
296 #define testArgSelect(w,x,y,z) testArgSelectX(w,x,sizeof(w[0]),y,z)
297 int testArgSelectX(void *, const char *, int, const char *, int *);
298 
299 #ifdef __cplusplus
300 }  /* End of the 'extern "C"' block */
301 #endif
302 
303 #endif
304