#include "gtest/gtest.h" #include "leveldb/env.h" #include "leveldb/db.h" #include "util/coding.h" #include using namespace leveldb; using Field=std::pair; using FieldArray=std::vector>; Status OpenDB(std::string dbName, DB **db) { Options options; options.max_file_size=16*1024; options.write_buffer_size=32*1024; options.create_if_missing = true; return DB::Open(options, dbName, db); } TEST(Test, checkIterator) { DB *db; WriteOptions writeOptions; ReadOptions readOptions; if(OpenDB("testdb_for_XOY_search", &db).ok() == false) { std::cerr << "open db failed" << std::endl; abort(); } std::vector values; for(int i=0;i<5000;i++){ std::string key=std::to_string(i); while(key.size()<4){ key='0'+key; } std::string value; for(int j=0;j<5000;j++){ value+=std::to_string(i); } values.push_back(value); Status s=db->Put(writeOptions,key,value); assert(s.ok()); } auto iter=db->NewIterator(readOptions); iter->SeekToFirst(); for(int i=0;i<5000;i++){ assert(iter->Valid()); auto value=iter->value(); assert(values[i]==value); iter->Next(); } assert(!iter->Valid()); iter->SeekToLast(); for(int i=4999;i>=0;i--){ assert(iter->Valid()); auto value=iter->value(); assert(values[i]==value); iter->Prev(); } assert(!iter->Valid()); iter->Seek("4990"); for(int i=4990;i<5000;i++){ assert(iter->Valid()); auto value=iter->value(); assert(values[i]==value); iter->Next(); } assert(!iter->Valid()); delete iter; delete db; } TEST(Test, CheckGetFields) { DB *db; WriteOptions writeOptions; ReadOptions readOptions; if(OpenDB("testdb_for_XOY_large", &db).ok() == false) { std::cerr << "open db failed" << std::endl; abort(); } std::string key1 = "k_1"; FieldArray fields1 = { {"name", "Customer#000000001"}, {"address", "IVhzIApeRb"}, {"phone", "25-989-741-2988"} }; auto value1=SerializeValue(fields1); db->Put(WriteOptions(), key1, value1); std::string value_ret; FieldArray res1; db->Get(ReadOptions(), key1, &value_ret); DeserializeValue(value_ret, &res1); for(auto pr:res1){ std::cout<Delete(WriteOptions(),key1); std::cout<<"get serialized value done"< keys; std::vector target_keys; for(int i=0;i<10000;i++){ std::string key=std::to_string(rand()%10000)+"_"+std::to_string(i);//random for generate nonincreasing keys FieldArray fields={ {"name", key}, {"address", std::to_string(rand()%7)}, {"phone", std::to_string(rand()%114514)} }; if(rand()%5==0){ fields[0].second="special_key"; target_keys.push_back(key); } keys.push_back(key); db->Put(WriteOptions(),key,SerializeValue(fields)); } std::sort(target_keys.begin(),target_keys.end()); std::vector key_res; Get_keys_by_field(db,ReadOptions(),{"name", "special_key"},&key_res); std::sort(key_res.begin(),key_res.end()); std::sort(target_keys.begin(),target_keys.end()); ASSERT_TRUE(CompareKey(key_res, target_keys)); std::cout<<"get key by field done"<Delete(WriteOptions(),s); } delete db; } TEST(Test, LARGE_DATA_COMPACT_TEST) { DB *db; WriteOptions writeOptions; ReadOptions readOptions; if(OpenDB("testdb_for_XOY_large", &db).ok() == false) { std::cerr << "open db failed" << std::endl; abort(); } std::vector values; for(int i=0;i<50000;i++){ std::string key=std::to_string(i); std::string value; for(int j=0;j<5000;j++){ value+=std::to_string(i); } values.push_back(value); db->Put(writeOptions,key,value); } for(int i=0;i<50000;i++){ std::string key=std::to_string(i); std::string value; Status s=db->Get(readOptions,key,&value); assert(s.ok()); if(values[i]!=value){ std::cout< values; for(int i=0;i<50000;i++){ std::string key=std::to_string(i); std::string value; for(int j=0;j<1000;j++){ value+=std::to_string(i); } values.push_back(value); db->Put(writeOptions,key,value); } std::cout<<"start gc"<TEST_GarbageCollect(); std::cout<<"finish gc"<Get(readOptions,key,&value); assert(s.ok()); if(values[i]!=value){ std::cout<