小组成员:陈予曈、朱陈媛
 
 

94 lines
2.4 KiB

#include "gtest/gtest.h"
#include "db/NewDB.h" // NewDB 的头文件
#include "leveldb/env.h"
#include "leveldb/db.h"
#include "db/write_batch_internal.h"
#include <iostream>
#include <random>
#include <ctime>
#include <thread>
using namespace leveldb;
Status OpenNewDB(std::string dbName, NewDB** db) {
Options options = Options();
options.create_if_missing = true;
return NewDB::Open(options, dbName, db);
}
Status OpenDB(std::string dbName, DB **db) {
Options options;
options.create_if_missing = true;
return DB::Open(options, dbName, db);
}
// 全局的随机数引擎
std::default_random_engine rng;
// 设置随机种子
void SetGlobalSeed(unsigned seed) {
rng.seed(seed);
}
// 生成随机字符串
std::string GenerateRandomString(size_t length) {
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
std::uniform_int_distribution<int> dist(0, sizeof(alphanum) - 2);
std::string str(length, 0);
for (size_t i = 0; i < length; ++i) {
str[i] = alphanum[dist(rng)];
}
return str;
}
std::string testdbname = "dbtest1";
TEST(TestNewDB, ConstancyTest) {
// 创建 NewDB 实例
NewDB* db;
ASSERT_TRUE(OpenNewDB(testdbname, &db).ok());
db->CreateIndexOnField("address");
delete db;
// 创建 NewDB 实例
NewDB* db_2;
ASSERT_TRUE(OpenNewDB(testdbname, &db_2).ok());
std::string key = "k_" + GenerateRandomString(10);
FieldArray fields = {
{"name", GenerateRandomString(5)},
{"address", GenerateRandomString(15)},
{"phone", GenerateRandomString(11)}
};
std::string index_key = db->ConstructIndexKey(key, fields[1]);
db->Put_fields(WriteOptions(), key, fields);
delete db_2;
// 创建 DB 实例
DB* index_db;
ASSERT_TRUE(OpenDB(testdbname + "_index", &index_db).ok());
std::string prefix = index_key;
leveldb::Iterator* iter = index_db->NewIterator(leveldb::ReadOptions());
for(iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix); iter->Next()){
Slice find_key = iter->key();
EXPECT_EQ(find_key.ToString(), index_key);
}
delete iter;
delete index_db;
}
int main(int argc, char** argv) {
// 设置全局随机种子
SetGlobalSeed(static_cast<unsigned>(time(nullptr)));
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}