作者: 韩晨旭 10225101440 李畅 10225102463
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

125 lines
3.3 KiB

#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();
}