11 #include <sys/types.h>
15 static char dbname[200];
17 static void StartPhase(
const char*
name) {
18 fprintf(stderr,
"=== Test %s\n", name);
22 static const char* GetTempDir(
void) {
23 const char* ret = getenv(
"TEST_TMPDIR");
24 if (ret == NULL || ret[0] ==
'\0')
29 #define CheckNoError(err) \
30 if ((err) != NULL) { \
31 fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, (err)); \
35 #define CheckCondition(cond) \
37 fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, #cond); \
41 static void CheckEqual(
const char* expected,
const char* v,
size_t n) {
42 if (expected == NULL && v == NULL) {
44 }
else if (expected != NULL && v != NULL && n == strlen(expected) &&
45 memcmp(expected, v, n) == 0) {
49 fprintf(stderr,
"%s: expected '%s', got '%s'\n",
51 (expected ? expected :
"(null)"),
57 static void Free(
char** ptr) {
68 const char* expected) {
72 val =
leveldb_get(db, options, key, strlen(key), &val_len, &err);
74 CheckEqual(expected, val, val_len);
79 const char* key,
const char* val) {
83 CheckEqual(key, str, len);
85 CheckEqual(val, str, len);
89 static void CheckPut(
void* ptr,
90 const char* k,
size_t klen,
91 const char* v,
size_t vlen) {
92 int*
state = (
int*) ptr;
96 CheckEqual(
"bar", k, klen);
97 CheckEqual(
"b", v, vlen);
100 CheckEqual(
"box", k, klen);
101 CheckEqual(
"c", v, vlen);
108 static void CheckDel(
void* ptr,
const char* k,
size_t klen) {
109 int* state = (
int*) ptr;
111 CheckEqual(
"bar", k, klen);
115 static void CmpDestroy(
void*
arg) { }
117 static int CmpCompare(
void*
arg,
const char* a,
size_t alen,
118 const char* b,
size_t blen) {
119 int n = (alen < blen) ? alen : blen;
120 int r = memcmp(a, b, n);
122 if (alen < blen) r = -1;
123 else if (alen > blen) r = +1;
128 static const char* CmpName(
void* arg) {
133 static unsigned char fake_filter_result = 1;
134 static void FilterDestroy(
void* arg) { }
135 static const char* FilterName(
void* arg) {
138 static char* FilterCreate(
140 const char*
const* key_array,
const size_t* key_length_array,
142 size_t* filter_length) {
144 char* result = malloc(4);
145 memcpy(result,
"fake", 4);
150 const char* key,
size_t length,
151 const char* filter,
size_t filter_length) {
154 return fake_filter_result;
157 int main(
int argc,
char** argv) {
171 snprintf(dbname,
sizeof(dbname),
172 "%s/leveldb_c_test-%d",
176 StartPhase(
"create_objects");
201 StartPhase(
"destroy");
205 StartPhase(
"open_error");
210 StartPhase(
"leveldb_free");
220 CheckGet(db, roptions,
"foo", NULL);
223 leveldb_put(db, woptions,
"foo", 3,
"hello", 5, &err);
225 CheckGet(db, roptions,
"foo",
"hello");
227 StartPhase(
"compactall");
229 CheckGet(db, roptions,
"foo",
"hello");
231 StartPhase(
"compactrange");
233 CheckGet(db, roptions,
"foo",
"hello");
235 StartPhase(
"writebatch");
245 CheckGet(db, roptions,
"foo",
"hello");
246 CheckGet(db, roptions,
"bar", NULL);
247 CheckGet(db, roptions,
"box",
"c");
260 CheckIter(iter,
"box",
"c");
262 CheckIter(iter,
"foo",
"hello");
264 CheckIter(iter,
"box",
"c");
268 CheckIter(iter,
"foo",
"hello");
270 CheckIter(iter,
"box",
"c");
276 StartPhase(
"approximate_sizes");
283 const char*
start[2] = {
"a",
"k00000000000000010000" };
284 size_t start_len[2] = { 1, 21 };
285 const char* limit[2] = {
"k00000000000000010000",
"z" };
286 size_t limit_len[2] = { 21, 1 };
288 for (i = 0; i < n; i++) {
289 snprintf(keybuf,
sizeof(keybuf),
"k%020d", i);
290 snprintf(valbuf,
sizeof(valbuf),
"v%020d", i);
291 leveldb_put(db, woptions, keybuf, strlen(keybuf), valbuf, strlen(valbuf),
300 StartPhase(
"property");
309 StartPhase(
"snapshot");
316 CheckGet(db, roptions,
"foo",
"hello");
318 CheckGet(db, roptions,
"foo", NULL);
322 StartPhase(
"repair");
331 CheckGet(db, roptions,
"foo", NULL);
332 CheckGet(db, roptions,
"bar", NULL);
333 CheckGet(db, roptions,
"box",
"c");
338 StartPhase(
"filter");
339 for (run = 0; run < 2; run++) {
356 leveldb_put(db, woptions,
"foo", 3,
"foovalue", 8, &err);
358 leveldb_put(db, woptions,
"bar", 3,
"barvalue", 8, &err);
362 fake_filter_result = 1;
363 CheckGet(db, roptions,
"foo",
"foovalue");
364 CheckGet(db, roptions,
"bar",
"barvalue");
367 fake_filter_result = 0;
368 CheckGet(db, roptions,
"foo", NULL);
369 CheckGet(db, roptions,
"bar", NULL);
370 fake_filter_result = 1;
372 CheckGet(db, roptions,
"foo",
"foovalue");
373 CheckGet(db, roptions,
"bar",
"barvalue");
379 StartPhase(
"cleanup");
388 fprintf(stderr,
"PASS\n");
void leveldb_writebatch_clear(leveldb_writebatch_t *b)
void leveldb_options_set_cache(leveldb_options_t *opt, leveldb_cache_t *c)
void leveldb_options_set_paranoid_checks(leveldb_options_t *opt, unsigned char v)
char * leveldb_get(leveldb_t *db, const leveldb_readoptions_t *options, const char *key, size_t keylen, size_t *vallen, char **errptr)
void leveldb_cache_destroy(leveldb_cache_t *cache)
void leveldb_iter_seek_to_last(leveldb_iterator_t *iter)
void leveldb_options_set_block_restart_interval(leveldb_options_t *opt, int n)
int leveldb_minor_version()
void leveldb_release_snapshot(leveldb_t *db, const leveldb_snapshot_t *snapshot)
unsigned char FilterKeyMatch(void *arg, const char *key, size_t length, const char *filter, size_t filter_length)
const char * leveldb_iter_key(const leveldb_iterator_t *iter, size_t *klen)
void leveldb_iter_prev(leveldb_iterator_t *iter)
int leveldb_major_version()
void leveldb_options_set_create_if_missing(leveldb_options_t *opt, unsigned char v)
void leveldb_destroy_db(const leveldb_options_t *options, const char *name, char **errptr)
void leveldb_options_set_filter_policy(leveldb_options_t *opt, leveldb_filterpolicy_t *policy)
leveldb_writebatch_t * leveldb_writebatch_create()
void leveldb_iter_next(leveldb_iterator_t *iter)
leveldb_comparator_t * leveldb_comparator_create(void *state, void(*destructor)(void *), int(*compare)(void *, const char *a, size_t alen, const char *b, size_t blen), const char *(*name)(void *))
void leveldb_put(leveldb_t *db, const leveldb_writeoptions_t *options, const char *key, size_t keylen, const char *val, size_t vallen, char **errptr)
leveldb_readoptions_t * leveldb_readoptions_create()
void leveldb_write(leveldb_t *db, const leveldb_writeoptions_t *options, leveldb_writebatch_t *batch, char **errptr)
void leveldb_iter_get_error(const leveldb_iterator_t *iter, char **errptr)
void leveldb_options_destroy(leveldb_options_t *options)
void leveldb_writebatch_destroy(leveldb_writebatch_t *b)
const leveldb_snapshot_t * leveldb_create_snapshot(leveldb_t *db)
void leveldb_writebatch_delete(leveldb_writebatch_t *b, const char *key, size_t klen)
char * leveldb_property_value(leveldb_t *db, const char *propname)
void leveldb_iter_destroy(leveldb_iterator_t *iter)
void leveldb_iter_seek_to_first(leveldb_iterator_t *iter)
unsigned long long uint64_t
void leveldb_free(void *ptr)
leveldb_writeoptions_t * leveldb_writeoptions_create()
leveldb_env_t * leveldb_create_default_env()
void leveldb_writebatch_put(leveldb_writebatch_t *b, const char *key, size_t klen, const char *val, size_t vlen)
unsigned char leveldb_iter_valid(const leveldb_iterator_t *iter)
void leveldb_options_set_comparator(leveldb_options_t *opt, leveldb_comparator_t *cmp)
void leveldb_options_set_max_open_files(leveldb_options_t *opt, int n)
const char * leveldb_iter_value(const leveldb_iterator_t *iter, size_t *vlen)
void leveldb_compact_range(leveldb_t *db, const char *start_key, size_t start_key_len, const char *limit_key, size_t limit_key_len)
void leveldb_options_set_error_if_exists(leveldb_options_t *opt, unsigned char v)
#define CheckCondition(cond)
void leveldb_close(leveldb_t *db)
void leveldb_options_set_info_log(leveldb_options_t *opt, leveldb_logger_t *l)
leveldb_filterpolicy_t * leveldb_filterpolicy_create(void *state, void(*destructor)(void *), char *(*create_filter)(void *, const char *const *key_array, const size_t *key_length_array, int num_keys, size_t *filter_length), unsigned char(*key_may_match)(void *, const char *key, size_t length, const char *filter, size_t filter_length), const char *(*name)(void *))
void leveldb_readoptions_set_snapshot(leveldb_readoptions_t *opt, const leveldb_snapshot_t *snap)
void leveldb_options_set_compression(leveldb_options_t *opt, int t)
void leveldb_filterpolicy_destroy(leveldb_filterpolicy_t *filter)
#define CheckNoError(err)
void leveldb_delete(leveldb_t *db, const leveldb_writeoptions_t *options, const char *key, size_t keylen, char **errptr)
leveldb_filterpolicy_t * leveldb_filterpolicy_create_bloom(int bits_per_key)
leveldb_options_t * leveldb_options_create()
void leveldb_iter_seek(leveldb_iterator_t *iter, const char *k, size_t klen)
void leveldb_env_destroy(leveldb_env_t *env)
void leveldb_readoptions_destroy(leveldb_readoptions_t *opt)
void leveldb_readoptions_set_verify_checksums(leveldb_readoptions_t *opt, unsigned char v)
void leveldb_approximate_sizes(leveldb_t *db, int num_ranges, const char *const *range_start_key, const size_t *range_start_key_len, const char *const *range_limit_key, const size_t *range_limit_key_len, uint64_t *sizes)
void leveldb_comparator_destroy(leveldb_comparator_t *cmp)
void leveldb_writeoptions_destroy(leveldb_writeoptions_t *opt)
void leveldb_options_set_env(leveldb_options_t *opt, leveldb_env_t *env)
void leveldb_readoptions_set_fill_cache(leveldb_readoptions_t *opt, unsigned char v)
void leveldb_options_set_write_buffer_size(leveldb_options_t *opt, size_t s)
leveldb_iterator_t * leveldb_create_iterator(leveldb_t *db, const leveldb_readoptions_t *options)
leveldb_cache_t * leveldb_cache_create_lru(size_t capacity)
void leveldb_writeoptions_set_sync(leveldb_writeoptions_t *opt, unsigned char v)
leveldb_t * leveldb_open(const leveldb_options_t *options, const char *name, char **errptr)
void leveldb_repair_db(const leveldb_options_t *options, const char *name, char **errptr)
void leveldb_options_set_block_size(leveldb_options_t *opt, size_t s)
void leveldb_writebatch_iterate(leveldb_writebatch_t *b, void *state, void(*put)(void *, const char *k, size_t klen, const char *v, size_t vlen), void(*deleted)(void *, const char *k, size_t klen))
int main(int argc, char **argv)