#include #include #include "leveldb/db.h" #include "leveldb/env.h" using namespace std; using namespace leveldb; Status OpenDB(std::string dbName, DB **db) { Options options; options.create_if_missing = true; return DB::Open(options, dbName, db); } template // Return true if v1 and v2 have same elements bool CompareVector(const std::vector& v1, const std::vector& v2) { if (v1.size() != v2.size()) { return false; } else { std::set compare_set(v1.begin(), v1.end()); for (const auto &ele : v2) { if (compare_set.insert(ele).second == true) { return false; } } } return true; } TEST(TestFields, GetPutIterator) { DB *db; if(OpenDB("testdb", &db).ok() == false) { cerr << "Open DB Failed" << endl; } std::string key_1 = "k_1"; std::string key_2 = "k_2"; FieldArray field_array_1 = { {"name", "Arcueid01"}, {"address", "tYpeMuuN"}, {"phone", "122-233-4455"} }; FieldArray field_array_2 = { {"name", "Arcueid02"}, {"address", "tYpeMuuN"}, {"phone", "199-999-2004"} }; const auto fields_1 = Fields(field_array_1); const auto fields_2 = Fields(field_array_2); db->Put(WriteOptions(), key_1, fields_1); db->Put(WriteOptions(), key_2, fields_2); Fields ret; db->Get(ReadOptions(), key_1, &ret); const auto fields_ret = ret.GetFieldArray(); ASSERT_EQ(CompareVector(fields_ret, field_array_1), true); db->Get(ReadOptions(), key_2, &ret); ASSERT_EQ(ret["name"], "Arcueid02"); ASSERT_EQ(ret["address"], "tYpeMuuN"); ASSERT_EQ(ret["phone"], "199-999-2004"); auto iter = db->NewIterator(ReadOptions()); iter->SeekToFirst(); while (iter->Valid()) { auto key = iter->key().ToString(); auto fields = iter->fields(); if (key == "k_1") { ASSERT_EQ(fields["name"], "Arcueid01"); ASSERT_EQ(fields["address"], "tYpeMuuN"); ASSERT_EQ(fields["phone"], "122-233-4455"); } if (key == "k_2") { ASSERT_EQ(fields["name"], "Arcueid02"); ASSERT_EQ(fields["address"], "tYpeMuuN"); ASSERT_EQ(fields["phone"], "199-999-2004"); } iter->Next(); } delete iter; delete db; } TEST(TestFields, SearchKey) { DB *db; if(OpenDB("testdb", &db).ok() == false) { cerr << "Open DB Failed" << endl; } std::vector keys_have_field = {"k_1", "k_3"}; std::vector keys_wo_field = {"k_2", "k_4"}; Field field_test = {"test_name", "Harry"}; FieldArray field_array_have_field = { {"name", "Arcueid"}, {"address", "tYpeMuuN"}, {"phone", "122-233-4455"}, field_test }; FieldArray field_array_wo_field = { {"name", "Arcueid"}, {"address", "tYpeMuuN"}, {"phone", "122-233-4455"}}; const auto fields_have_field = Fields(field_array_have_field); const auto fields_wo_field = Fields(field_array_wo_field); for(const auto& key : keys_have_field){ db->Put(WriteOptions(), key, fields_have_field); } for (const auto& key : keys_wo_field) { db->Put(WriteOptions(), key, fields_wo_field); } const std::vector key_ret = db->FindKeysByField(field_test); ASSERT_EQ(CompareVector(key_ret, keys_have_field), true); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }