github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/capi/test/all_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/options.h" 9 #include "leveldb/filter_policy.h" 10 11 #include <string.h> 12 #include <vector> 13 #include <map> 14 15 static leveldb_bool_t fromStdBool(bool v) { 16 return (v)? 1: 0; 17 } 18 19 static leveldb_slice_t newSlice(const char* data, int32_t size) { 20 leveldb_slice_t a = { data, size }; 21 return a; 22 } 23 24 static bool strHasPrefix(const char* str, const char* prefix) { 25 int a = strlen(str); 26 int b = strlen(prefix); 27 if(a < b) return false; 28 for(int i = 0; i < b; ++i) { 29 if(str[i] != prefix[i]) return false; 30 } 31 return true; 32 } 33 34 TEST(Version, Simple) { 35 ASSERT_TRUE(leveldb_major_version() == 1); 36 ASSERT_TRUE(leveldb_minor_version() == 14); 37 } 38 39 TEST(CompressionType, Simple) { 40 ASSERT_TRUE(leveldb_compression_nil == leveldb::kNoCompression); 41 ASSERT_TRUE(leveldb_compression_snappy == leveldb::kSnappyCompression); 42 } 43 44 TEST(Value, Simple) { 45 leveldb_value_t* value; 46 const char* data = "hello go-leveldb!"; 47 48 value = leveldb_value_create(NULL, 0); 49 50 ASSERT_TRUE(leveldb_value_data(value) == NULL); 51 ASSERT_TRUE(leveldb_value_size(value) == 0); 52 leveldb_value_destroy(value); 53 54 value = leveldb_value_create(NULL, 10); 55 ASSERT_TRUE(leveldb_value_data(value) == NULL); 56 ASSERT_TRUE(leveldb_value_size(value) == 0); 57 leveldb_value_destroy(value); 58 59 value = leveldb_value_create(data, 0); 60 ASSERT_TRUE(leveldb_value_data(value) == NULL); 61 ASSERT_TRUE(leveldb_value_size(value) == 0); 62 leveldb_value_destroy(value); 63 64 value = leveldb_value_create(data, strlen(data)); 65 ASSERT_TRUE(leveldb_value_data(value) != data); 66 ASSERT_TRUE(leveldb_value_data(value) != NULL); 67 ASSERT_TRUE(leveldb_value_size(value) == strlen(data)); 68 ASSERT_STREQ(leveldb_value_data(value), data); 69 70 leveldb_value_destroy(value); 71 } 72 73 TEST(Options, Simple) { 74 leveldb_options_t* opt; 75 leveldb_comparator_t* cmp = (leveldb_comparator_t*)"leveldb_comparator_t"; 76 leveldb_filterpolicy_t* filter = (leveldb_filterpolicy_t*)"leveldb_filterpolicy_t"; 77 leveldb_cache_t* cache = (leveldb_cache_t*)"leveldb_cache_t"; 78 79 opt = leveldb_options_create(); 80 81 ASSERT_TRUE(leveldb_options_get_comparator(opt) != NULL); 82 leveldb_options_set_comparator(opt, cmp); 83 ASSERT_TRUE(leveldb_options_get_comparator(opt) == cmp); 84 leveldb_options_set_comparator(opt, NULL); 85 ASSERT_TRUE(leveldb_options_get_comparator(opt) == NULL); 86 87 ASSERT_TRUE(leveldb_options_get_filter_policy(opt) == NULL); 88 leveldb_options_set_filter_policy(opt, filter); 89 ASSERT_TRUE(leveldb_options_get_filter_policy(opt) == filter); 90 leveldb_options_set_filter_policy(opt, NULL); 91 ASSERT_TRUE(leveldb_options_get_filter_policy(opt) == NULL); 92 93 ASSERT_TRUE(leveldb_options_get_create_if_missing(opt) == fromStdBool(false)); 94 leveldb_options_set_create_if_missing(opt, true); 95 ASSERT_TRUE(leveldb_options_get_create_if_missing(opt) == fromStdBool(true)); 96 leveldb_options_set_create_if_missing(opt, false); 97 ASSERT_TRUE(leveldb_options_get_create_if_missing(opt) == fromStdBool(false)); 98 99 ASSERT_TRUE(leveldb_options_get_error_if_exists(opt) == fromStdBool(false)); 100 leveldb_options_set_error_if_exists(opt, true); 101 ASSERT_TRUE(leveldb_options_get_error_if_exists(opt) == fromStdBool(true)); 102 leveldb_options_set_error_if_exists(opt, false); 103 ASSERT_TRUE(leveldb_options_get_error_if_exists(opt) == fromStdBool(false)); 104 105 ASSERT_TRUE(leveldb_options_get_paranoid_checks(opt) == fromStdBool(false)); 106 leveldb_options_set_paranoid_checks(opt, true); 107 ASSERT_TRUE(leveldb_options_get_paranoid_checks(opt) == fromStdBool(true)); 108 leveldb_options_set_paranoid_checks(opt, false); 109 ASSERT_TRUE(leveldb_options_get_paranoid_checks(opt) == fromStdBool(false)); 110 111 ASSERT_TRUE(leveldb_options_get_max_open_files(opt) == 1000); 112 leveldb_options_set_max_open_files(opt, 500); 113 ASSERT_TRUE(leveldb_options_get_max_open_files(opt) == 500); 114 leveldb_options_set_max_open_files(opt, 100); 115 ASSERT_TRUE(leveldb_options_get_max_open_files(opt) == 100); 116 117 ASSERT_TRUE(leveldb_options_get_cache(opt) == NULL); 118 leveldb_options_set_cache(opt, cache); 119 ASSERT_TRUE(leveldb_options_get_cache(opt) == cache); 120 leveldb_options_set_cache(opt, NULL); 121 ASSERT_TRUE(leveldb_options_get_cache(opt) == NULL); 122 123 ASSERT_TRUE(leveldb_options_get_block_size(opt) == 4096); 124 leveldb_options_set_block_size(opt, 1024); 125 ASSERT_TRUE(leveldb_options_get_block_size(opt) == 1024); 126 leveldb_options_set_block_size(opt, 100); 127 ASSERT_TRUE(leveldb_options_get_block_size(opt) == 100); 128 129 ASSERT_TRUE(leveldb_options_get_block_restart_interval(opt) == 16); 130 leveldb_options_set_block_restart_interval(opt, 10); 131 ASSERT_TRUE(leveldb_options_get_block_restart_interval(opt) == 10); 132 leveldb_options_set_block_restart_interval(opt, 100); 133 ASSERT_TRUE(leveldb_options_get_block_restart_interval(opt) == 100); 134 135 ASSERT_TRUE(leveldb_options_get_compression(opt) == leveldb_compression_snappy); 136 leveldb_options_set_compression(opt, leveldb_compression_nil); 137 ASSERT_TRUE(leveldb_options_get_compression(opt) == leveldb_compression_nil); 138 leveldb_options_set_compression(opt, leveldb_compression_snappy); 139 ASSERT_TRUE(leveldb_options_get_compression(opt) == leveldb_compression_snappy); 140 141 leveldb_options_destroy(opt); 142 } 143 144 TEST(ReadOptions, Simple) { 145 leveldb_readoptions_t* opt; 146 leveldb_snapshot_t* snap = (leveldb_snapshot_t*)"leveldb_snapshot_t"; 147 148 opt = leveldb_readoptions_create(); 149 150 ASSERT_TRUE(leveldb_readoptions_get_verify_checksums(opt) == fromStdBool(false)); 151 leveldb_readoptions_set_verify_checksums(opt, true); 152 ASSERT_TRUE(leveldb_readoptions_get_verify_checksums(opt) == fromStdBool(true)); 153 leveldb_readoptions_set_verify_checksums(opt, false); 154 ASSERT_TRUE(leveldb_readoptions_get_verify_checksums(opt) == fromStdBool(false)); 155 156 ASSERT_TRUE(leveldb_readoptions_get_fill_cache(opt) == fromStdBool(true)); 157 leveldb_readoptions_set_fill_cache(opt, false); 158 ASSERT_TRUE(leveldb_readoptions_get_fill_cache(opt) == fromStdBool(false)); 159 leveldb_readoptions_set_fill_cache(opt, true); 160 ASSERT_TRUE(leveldb_readoptions_get_fill_cache(opt) == fromStdBool(true)); 161 162 ASSERT_TRUE(leveldb_readoptions_get_snapshot(opt) == NULL); 163 leveldb_readoptions_set_snapshot(opt, snap); 164 ASSERT_TRUE(leveldb_readoptions_get_snapshot(opt) == snap); 165 leveldb_readoptions_set_snapshot(opt, NULL); 166 ASSERT_TRUE(leveldb_readoptions_get_snapshot(opt) == NULL); 167 168 leveldb_readoptions_destroy(opt); 169 } 170 171 TEST(WriteOptions, Simple) { 172 leveldb_writeoptions_t* opt; 173 174 opt = leveldb_writeoptions_create(); 175 176 ASSERT_TRUE(leveldb_writeoptions_get_sync(opt) == fromStdBool(false)); 177 leveldb_writeoptions_set_sync(opt, true); 178 ASSERT_TRUE(leveldb_writeoptions_get_sync(opt) == fromStdBool(true)); 179 leveldb_writeoptions_set_sync(opt, false); 180 ASSERT_TRUE(leveldb_writeoptions_get_sync(opt) == fromStdBool(false)); 181 182 leveldb_writeoptions_destroy(opt); 183 } 184 185 TEST(DB, Simple) { 186 // TODO 187 } 188 189 TEST(Iterator, Simple) { 190 // TODO 191 } 192 193 TEST(WriteBatch, Simple) { 194 struct H { 195 static void put( 196 void* state, 197 const leveldb_slice_t* key, 198 const leveldb_slice_t* val 199 ) { 200 auto dict = (std::map<std::string,std::string>*)state; 201 (*dict)[std::string(key->data)] = std::string("put:") + val->data; 202 } 203 static void deleted( 204 void* state, 205 const leveldb_slice_t* key 206 ) { 207 auto dict = (std::map<std::string,std::string>*)state; 208 (*dict)[std::string(key->data)] = std::string("delete:"); 209 } 210 }; 211 212 leveldb_writebatch_t* batch; 213 leveldb_slice_t key, val; 214 215 batch = leveldb_writebatch_create(); 216 217 key = newSlice("key1", strlen("key1")+1); 218 val = newSlice("val1", strlen("val1")+1); 219 leveldb_writebatch_put(batch, &key, &val); 220 221 key = newSlice("key2", strlen("key2")+1); 222 val = newSlice("val2", strlen("val2")+1); 223 leveldb_writebatch_put(batch, &key, &val); 224 225 key = newSlice("key1", strlen("key1")+1); 226 leveldb_writebatch_delete(batch, &key); 227 228 key = newSlice("key1", strlen("key1")+1); 229 val = newSlice("val1-new", strlen("val1-new")+1); 230 leveldb_writebatch_put(batch, &key, &val); 231 232 key = newSlice("key-unkown", strlen("key-unkown")+1); 233 leveldb_writebatch_delete(batch, &key); 234 235 std::map<std::string,std::string> dict; 236 leveldb_writebatch_iterate(batch, &dict, H::put, H::deleted); 237 238 // key-unkown: delete: 239 // key1: put:val1-new 240 // key2: put:val2 241 ASSERT_TRUE(dict.size() == 3); 242 ASSERT_STREQ(dict["key-unkown"].c_str(), "delete:"); 243 ASSERT_STREQ(dict["key1"].c_str(), "put:val1-new"); 244 ASSERT_STREQ(dict["key2"].c_str(), "put:val2"); 245 246 leveldb_writebatch_destroy(batch); 247 } 248 249 TEST(Comparator, Simple) { 250 struct H { 251 static void destructor(void* state) { 252 // Empty 253 } 254 static int32_t compare(void* state, 255 const leveldb_slice_t* a, 256 const leveldb_slice_t* b 257 ) { 258 leveldb::Slice a_(a->data, a->size); 259 leveldb::Slice b_(b->data, b->size); 260 return int32_t(a_.compare(b_)); 261 } 262 static const char* name(void* state) { 263 return "goleveldb.comparator.test"; 264 } 265 }; 266 267 leveldb_comparator_t* cmp; 268 cmp = leveldb_comparator_create(NULL, H::destructor, H::compare, H::name); 269 leveldb_comparator_destroy(cmp); 270 } 271 272 TEST(FilterPolicy, Simple) { 273 struct H { 274 static void destructor(void* state) { 275 leveldb::FilterPolicy* bloomFilter = (leveldb::FilterPolicy*)state; 276 delete bloomFilter; 277 } 278 static leveldb_value_t* create_filter( 279 void* state, 280 const leveldb_slice_t** keys, 281 int32_t num_keys 282 ) { 283 leveldb::FilterPolicy* bloomFilter = (leveldb::FilterPolicy*)state; 284 285 std::vector<leveldb::Slice> keys_(num_keys); 286 for(int32_t i = 0; i < num_keys; ++i) { 287 keys_[i] = leveldb::Slice(keys[i]->data, keys[i]->size); 288 } 289 290 std::string tmp; 291 bloomFilter->CreateFilter(&keys_[0], num_keys, &tmp); 292 return leveldb_value_create(tmp.data(), tmp.size()); 293 } 294 static leveldb_bool_t key_may_match( 295 void* state, 296 const leveldb_slice_t* key, 297 const leveldb_slice_t* filter 298 ) { 299 leveldb::FilterPolicy* bloomFilter = (leveldb::FilterPolicy*)state; 300 301 leveldb::Slice key_(key->data, key->size); 302 leveldb::Slice filter_(filter->data, filter->size); 303 bool rv = bloomFilter->KeyMayMatch(key_, filter_); 304 return rv? 1: 0; 305 } 306 static const char* name(void* state) { 307 return "goleveldb.filterpolicy.test"; 308 } 309 }; 310 311 leveldb_filterpolicy_t* filter; 312 313 filter = leveldb_filterpolicy_create_bloom(13); 314 leveldb_filterpolicy_destroy(filter); 315 316 filter = leveldb_filterpolicy_create( 317 (void*)leveldb::NewBloomFilterPolicy(15), 318 H::destructor, 319 H::create_filter, 320 H::key_may_match, 321 H::name 322 ); 323 leveldb_filterpolicy_destroy(filter); 324 }