merger_test.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #include <vector>
  6. #include <string>
  7. #include "table/merging_iterator.h"
  8. #include "test_util/testharness.h"
  9. #include "test_util/testutil.h"
  10. namespace ROCKSDB_NAMESPACE {
  11. class MergerTest : public testing::Test {
  12. public:
  13. MergerTest()
  14. : icomp_(BytewiseComparator()),
  15. rnd_(3),
  16. merging_iterator_(nullptr),
  17. single_iterator_(nullptr) {}
  18. ~MergerTest() override = default;
  19. std::vector<std::string> GenerateStrings(size_t len, int string_len) {
  20. std::vector<std::string> ret;
  21. for (size_t i = 0; i < len; ++i) {
  22. InternalKey ik(test::RandomHumanReadableString(&rnd_, string_len), 0,
  23. ValueType::kTypeValue);
  24. ret.push_back(ik.Encode().ToString(false));
  25. }
  26. return ret;
  27. }
  28. void AssertEquivalence() {
  29. auto a = merging_iterator_.get();
  30. auto b = single_iterator_.get();
  31. if (!a->Valid()) {
  32. ASSERT_TRUE(!b->Valid());
  33. } else {
  34. ASSERT_TRUE(b->Valid());
  35. ASSERT_EQ(b->key().ToString(), a->key().ToString());
  36. ASSERT_EQ(b->value().ToString(), a->value().ToString());
  37. }
  38. }
  39. void SeekToRandom() {
  40. InternalKey ik(test::RandomHumanReadableString(&rnd_, 5), 0,
  41. ValueType::kTypeValue);
  42. Seek(ik.Encode().ToString(false));
  43. }
  44. void Seek(std::string target) {
  45. merging_iterator_->Seek(target);
  46. single_iterator_->Seek(target);
  47. }
  48. void SeekToFirst() {
  49. merging_iterator_->SeekToFirst();
  50. single_iterator_->SeekToFirst();
  51. }
  52. void SeekToLast() {
  53. merging_iterator_->SeekToLast();
  54. single_iterator_->SeekToLast();
  55. }
  56. void Next(int times) {
  57. for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
  58. AssertEquivalence();
  59. merging_iterator_->Next();
  60. single_iterator_->Next();
  61. }
  62. AssertEquivalence();
  63. }
  64. void Prev(int times) {
  65. for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
  66. AssertEquivalence();
  67. merging_iterator_->Prev();
  68. single_iterator_->Prev();
  69. }
  70. AssertEquivalence();
  71. }
  72. void NextAndPrev(int times) {
  73. for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
  74. AssertEquivalence();
  75. if (rnd_.OneIn(2)) {
  76. merging_iterator_->Prev();
  77. single_iterator_->Prev();
  78. } else {
  79. merging_iterator_->Next();
  80. single_iterator_->Next();
  81. }
  82. }
  83. AssertEquivalence();
  84. }
  85. void Generate(size_t num_iterators, size_t strings_per_iterator,
  86. int letters_per_string) {
  87. std::vector<InternalIterator*> small_iterators;
  88. for (size_t i = 0; i < num_iterators; ++i) {
  89. auto strings = GenerateStrings(strings_per_iterator, letters_per_string);
  90. small_iterators.push_back(new test::VectorIterator(strings));
  91. all_keys_.insert(all_keys_.end(), strings.begin(), strings.end());
  92. }
  93. merging_iterator_.reset(
  94. NewMergingIterator(&icomp_, &small_iterators[0],
  95. static_cast<int>(small_iterators.size())));
  96. single_iterator_.reset(new test::VectorIterator(all_keys_));
  97. }
  98. InternalKeyComparator icomp_;
  99. Random rnd_;
  100. std::unique_ptr<InternalIterator> merging_iterator_;
  101. std::unique_ptr<InternalIterator> single_iterator_;
  102. std::vector<std::string> all_keys_;
  103. };
  104. TEST_F(MergerTest, SeekToRandomNextTest) {
  105. Generate(1000, 50, 50);
  106. for (int i = 0; i < 10; ++i) {
  107. SeekToRandom();
  108. AssertEquivalence();
  109. Next(50000);
  110. }
  111. }
  112. TEST_F(MergerTest, SeekToRandomNextSmallStringsTest) {
  113. Generate(1000, 50, 2);
  114. for (int i = 0; i < 10; ++i) {
  115. SeekToRandom();
  116. AssertEquivalence();
  117. Next(50000);
  118. }
  119. }
  120. TEST_F(MergerTest, SeekToRandomPrevTest) {
  121. Generate(1000, 50, 50);
  122. for (int i = 0; i < 10; ++i) {
  123. SeekToRandom();
  124. AssertEquivalence();
  125. Prev(50000);
  126. }
  127. }
  128. TEST_F(MergerTest, SeekToRandomRandomTest) {
  129. Generate(200, 50, 50);
  130. for (int i = 0; i < 3; ++i) {
  131. SeekToRandom();
  132. AssertEquivalence();
  133. NextAndPrev(5000);
  134. }
  135. }
  136. TEST_F(MergerTest, SeekToFirstTest) {
  137. Generate(1000, 50, 50);
  138. for (int i = 0; i < 10; ++i) {
  139. SeekToFirst();
  140. AssertEquivalence();
  141. Next(50000);
  142. }
  143. }
  144. TEST_F(MergerTest, SeekToLastTest) {
  145. Generate(1000, 50, 50);
  146. for (int i = 0; i < 10; ++i) {
  147. SeekToLast();
  148. AssertEquivalence();
  149. Prev(50000);
  150. }
  151. }
  152. } // namespace ROCKSDB_NAMESPACE
  153. int main(int argc, char** argv) {
  154. ::testing::InitGoogleTest(&argc, argv);
  155. return RUN_ALL_TESTS();
  156. }