// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #ifndef ROCKSDB_LITE #include #include "rocksdb/sst_file_reader.h" #include "rocksdb/sst_file_writer.h" #include "util/testharness.h" #include "util/testutil.h" #include "utilities/merge_operators.h" namespace rocksdb { std::string EncodeAsString(uint64_t v) { char buf[16]; snprintf(buf, sizeof(buf), "%08" PRIu64, v); return std::string(buf); } std::string EncodeAsUint64(uint64_t v) { std::string dst; PutFixed64(&dst, v); return dst; } class SstFileReaderTest : public testing::Test { public: SstFileReaderTest() { options_.merge_operator = MergeOperators::CreateUInt64AddOperator(); sst_name_ = test::PerThreadDBPath("sst_file"); } void CreateFileAndCheck(const std::vector& keys) { SstFileWriter writer(soptions_, options_); ASSERT_OK(writer.Open(sst_name_)); for (size_t i = 0; i + 2 < keys.size(); i += 3) { ASSERT_OK(writer.Put(keys[i], keys[i])); ASSERT_OK(writer.Merge(keys[i + 1], EncodeAsUint64(i + 1))); ASSERT_OK(writer.Delete(keys[i + 2])); } ASSERT_OK(writer.Finish()); ReadOptions ropts; SstFileReader reader(options_); ASSERT_OK(reader.Open(sst_name_)); ASSERT_OK(reader.VerifyChecksum()); std::unique_ptr iter(reader.NewIterator(ropts)); iter->SeekToFirst(); for (size_t i = 0; i + 2 < keys.size(); i += 3) { ASSERT_TRUE(iter->Valid()); ASSERT_EQ(iter->key().compare(keys[i]), 0); ASSERT_EQ(iter->value().compare(keys[i]), 0); iter->Next(); ASSERT_TRUE(iter->Valid()); ASSERT_EQ(iter->key().compare(keys[i + 1]), 0); ASSERT_EQ(iter->value().compare(EncodeAsUint64(i + 1)), 0); iter->Next(); } ASSERT_FALSE(iter->Valid()); } protected: Options options_; EnvOptions soptions_; std::string sst_name_; }; const uint64_t kNumKeys = 100; TEST_F(SstFileReaderTest, Basic) { std::vector keys; for (uint64_t i = 0; i < kNumKeys; i++) { keys.emplace_back(EncodeAsString(i)); } CreateFileAndCheck(keys); } TEST_F(SstFileReaderTest, Uint64Comparator) { options_.comparator = test::Uint64Comparator(); std::vector keys; for (uint64_t i = 0; i < kNumKeys; i++) { keys.emplace_back(EncodeAsUint64(i)); } CreateFileAndCheck(keys); } } // namespace rocksdb int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } #else #include int main(int /*argc*/, char** /*argv*/) { fprintf(stderr, "SKIPPED as SstFileReader is not supported in ROCKSDB_LITE\n"); return 0; } #endif // ROCKSDB_LITE