| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- // 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).
- #include <vector>
- #include <string>
- #include "table/merging_iterator.h"
- #include "test_util/testharness.h"
- #include "test_util/testutil.h"
- namespace ROCKSDB_NAMESPACE {
- class MergerTest : public testing::Test {
- public:
- MergerTest()
- : icomp_(BytewiseComparator()),
- rnd_(3),
- merging_iterator_(nullptr),
- single_iterator_(nullptr) {}
- ~MergerTest() override = default;
- std::vector<std::string> GenerateStrings(size_t len, int string_len) {
- std::vector<std::string> ret;
- for (size_t i = 0; i < len; ++i) {
- InternalKey ik(test::RandomHumanReadableString(&rnd_, string_len), 0,
- ValueType::kTypeValue);
- ret.push_back(ik.Encode().ToString(false));
- }
- return ret;
- }
- void AssertEquivalence() {
- auto a = merging_iterator_.get();
- auto b = single_iterator_.get();
- if (!a->Valid()) {
- ASSERT_TRUE(!b->Valid());
- } else {
- ASSERT_TRUE(b->Valid());
- ASSERT_EQ(b->key().ToString(), a->key().ToString());
- ASSERT_EQ(b->value().ToString(), a->value().ToString());
- }
- }
- void SeekToRandom() {
- InternalKey ik(test::RandomHumanReadableString(&rnd_, 5), 0,
- ValueType::kTypeValue);
- Seek(ik.Encode().ToString(false));
- }
- void Seek(std::string target) {
- merging_iterator_->Seek(target);
- single_iterator_->Seek(target);
- }
- void SeekToFirst() {
- merging_iterator_->SeekToFirst();
- single_iterator_->SeekToFirst();
- }
- void SeekToLast() {
- merging_iterator_->SeekToLast();
- single_iterator_->SeekToLast();
- }
- void Next(int times) {
- for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
- AssertEquivalence();
- merging_iterator_->Next();
- single_iterator_->Next();
- }
- AssertEquivalence();
- }
- void Prev(int times) {
- for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
- AssertEquivalence();
- merging_iterator_->Prev();
- single_iterator_->Prev();
- }
- AssertEquivalence();
- }
- void NextAndPrev(int times) {
- for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
- AssertEquivalence();
- if (rnd_.OneIn(2)) {
- merging_iterator_->Prev();
- single_iterator_->Prev();
- } else {
- merging_iterator_->Next();
- single_iterator_->Next();
- }
- }
- AssertEquivalence();
- }
- void Generate(size_t num_iterators, size_t strings_per_iterator,
- int letters_per_string) {
- std::vector<InternalIterator*> small_iterators;
- for (size_t i = 0; i < num_iterators; ++i) {
- auto strings = GenerateStrings(strings_per_iterator, letters_per_string);
- small_iterators.push_back(new test::VectorIterator(strings));
- all_keys_.insert(all_keys_.end(), strings.begin(), strings.end());
- }
- merging_iterator_.reset(
- NewMergingIterator(&icomp_, &small_iterators[0],
- static_cast<int>(small_iterators.size())));
- single_iterator_.reset(new test::VectorIterator(all_keys_));
- }
- InternalKeyComparator icomp_;
- Random rnd_;
- std::unique_ptr<InternalIterator> merging_iterator_;
- std::unique_ptr<InternalIterator> single_iterator_;
- std::vector<std::string> all_keys_;
- };
- TEST_F(MergerTest, SeekToRandomNextTest) {
- Generate(1000, 50, 50);
- for (int i = 0; i < 10; ++i) {
- SeekToRandom();
- AssertEquivalence();
- Next(50000);
- }
- }
- TEST_F(MergerTest, SeekToRandomNextSmallStringsTest) {
- Generate(1000, 50, 2);
- for (int i = 0; i < 10; ++i) {
- SeekToRandom();
- AssertEquivalence();
- Next(50000);
- }
- }
- TEST_F(MergerTest, SeekToRandomPrevTest) {
- Generate(1000, 50, 50);
- for (int i = 0; i < 10; ++i) {
- SeekToRandom();
- AssertEquivalence();
- Prev(50000);
- }
- }
- TEST_F(MergerTest, SeekToRandomRandomTest) {
- Generate(200, 50, 50);
- for (int i = 0; i < 3; ++i) {
- SeekToRandom();
- AssertEquivalence();
- NextAndPrev(5000);
- }
- }
- TEST_F(MergerTest, SeekToFirstTest) {
- Generate(1000, 50, 50);
- for (int i = 0; i < 10; ++i) {
- SeekToFirst();
- AssertEquivalence();
- Next(50000);
- }
- }
- TEST_F(MergerTest, SeekToLastTest) {
- Generate(1000, 50, 50);
- for (int i = 0; i < 10; ++i) {
- SeekToLast();
- AssertEquivalence();
- Prev(50000);
- }
- }
- } // namespace ROCKSDB_NAMESPACE
- int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
- }
|