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