#include <iostream>
|
|
#include <gtest/gtest.h>
|
|
|
|
#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<typename T>
|
|
// Return true if v1 and v2 have same elements
|
|
bool CompareVector(const std::vector<T>& v1, const std::vector<T>& v2) {
|
|
if (v1.size() != v2.size()) {
|
|
return false;
|
|
} else {
|
|
std::set<T> 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<Field>(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<std::string> keys_have_field = {"k_1", "k_3"};
|
|
std::vector<std::string> 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<std::string> key_ret = db->FindKeysByField(field_test);
|
|
|
|
ASSERT_EQ(CompareVector<std::string>(key_ret, keys_have_field), true);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|