#include "gtest/gtest.h" #include "db/NewDB.h" // NewDB 的头文件 #include "leveldb/env.h" #include "leveldb/db.h" #include "db/write_batch_internal.h" #include #include #include #include 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 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(time(nullptr))); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }