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  }