github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/capi/test/cache_test.cc (about) 1 // Copyright 2013 <chaishushan{AT}gmail.com>. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #include "test.h" 6 #include "leveldb_c.h" 7 #include "leveldb/slice.h" 8 #include "leveldb/filter_policy.h" 9 10 #include <string.h> 11 #include <vector> 12 #include <map> 13 14 static struct { 15 const char *key; 16 const char *val; 17 } cachePairs[] = { 18 {"", ""}, 19 {"f", "Zg=="}, 20 {"fo", "Zm8="}, 21 {"foo", "Zm9v"}, 22 {"foob", "Zm9vYg=="}, 23 {"fooba", "Zm9vYmE="}, 24 {"foobar", "Zm9vYmFy"}, 25 {"sure.", "c3VyZS4="}, 26 {"sure", "c3VyZQ=="}, 27 {"sur", "c3Vy"}, 28 {"su", "c3U="}, 29 {"leasure.", "bGVhc3VyZS4="}, 30 {"easure.", "ZWFzdXJlLg=="}, 31 {"asure.", "YXN1cmUu"}, 32 {"sure.", "c3VyZS4="}, 33 }; 34 35 struct AutoCacheDeleter { 36 leveldb_cache_t* cache_; 37 AutoCacheDeleter(leveldb_cache_t* p): cache_(p) {} 38 ~AutoCacheDeleter() { leveldb_cache_destroy(cache_); } 39 }; 40 41 TEST(Cache, Simple) { 42 auto cache = leveldb_cache_create_lru(1 << 20); 43 AutoCacheDeleter cacheDeleter(cache); 44 45 // empty & lookup fail 46 for(int i = 0; i < DIM(cachePairs); ++i) { 47 leveldb_slice_t key = { cachePairs[i].key, strlen(cachePairs[i].key)+1 }; 48 leveldb_slice_t val = { cachePairs[i].val, strlen(cachePairs[i].val)+1 }; 49 auto p = leveldb_cache_lookup(cache, &key); 50 ASSERT_TRUE(p == NULL); 51 } 52 53 // insert & lookup success 54 for(int i = 0; i < DIM(cachePairs); ++i) { 55 leveldb_slice_t key = { cachePairs[i].key, strlen(cachePairs[i].key)+1 }; 56 leveldb_slice_t val = { cachePairs[i].val, strlen(cachePairs[i].val)+1 }; 57 leveldb_cache_insert(cache, &key, &val); 58 } 59 for(int i = 0; i < DIM(cachePairs); ++i) { 60 leveldb_slice_t key = { cachePairs[i].key, strlen(cachePairs[i].key)+1 }; 61 leveldb_slice_t val = { cachePairs[i].val, strlen(cachePairs[i].val)+1 }; 62 auto p = leveldb_cache_lookup(cache, &key); 63 ASSERT_TRUE(p != NULL); 64 65 leveldb_slice_t dat = { leveldb_value_data(p), leveldb_value_size(p) }; 66 ASSERT_TRUE(val.size == dat.size); 67 int cmp = memcmp(val.data, dat.data, val.size); 68 ASSERT_TRUE(cmp == 0); 69 70 leveldb_value_destroy(p); 71 } 72 73 // erase & lookup fail 74 for(int i = 0; i < DIM(cachePairs); ++i) { 75 leveldb_slice_t key = { cachePairs[i].key, strlen(cachePairs[i].key)+1 }; 76 leveldb_slice_t val = { cachePairs[i].val, strlen(cachePairs[i].val)+1 }; 77 leveldb_cache_erase(cache, &key); 78 } 79 for(int i = 0; i < DIM(cachePairs); ++i) { 80 leveldb_slice_t key = { cachePairs[i].key, strlen(cachePairs[i].key)+1 }; 81 leveldb_slice_t val = { cachePairs[i].val, strlen(cachePairs[i].val)+1 }; 82 auto p = leveldb_cache_lookup(cache, &key); 83 ASSERT_TRUE(p == NULL); 84 } 85 } 86