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).
9 #include "table/merging_iterator.h"
10 #include "util/testharness.h"
11 #include "util/testutil.h"
15 class MergerTest
: public testing::Test
{
18 : icomp_(BytewiseComparator()),
20 merging_iterator_(nullptr),
21 single_iterator_(nullptr) {}
22 ~MergerTest() override
= default;
23 std::vector
<std::string
> GenerateStrings(size_t len
, int string_len
) {
24 std::vector
<std::string
> ret
;
26 for (size_t i
= 0; i
< len
; ++i
) {
27 InternalKey
ik(test::RandomHumanReadableString(&rnd_
, string_len
), 0,
28 ValueType::kTypeValue
);
29 ret
.push_back(ik
.Encode().ToString(false));
34 void AssertEquivalence() {
35 auto a
= merging_iterator_
.get();
36 auto b
= single_iterator_
.get();
38 ASSERT_TRUE(!b
->Valid());
40 ASSERT_TRUE(b
->Valid());
41 ASSERT_EQ(b
->key().ToString(), a
->key().ToString());
42 ASSERT_EQ(b
->value().ToString(), a
->value().ToString());
47 InternalKey
ik(test::RandomHumanReadableString(&rnd_
, 5), 0,
48 ValueType::kTypeValue
);
49 Seek(ik
.Encode().ToString(false));
52 void Seek(std::string target
) {
53 merging_iterator_
->Seek(target
);
54 single_iterator_
->Seek(target
);
58 merging_iterator_
->SeekToFirst();
59 single_iterator_
->SeekToFirst();
63 merging_iterator_
->SeekToLast();
64 single_iterator_
->SeekToLast();
67 void Next(int times
) {
68 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
70 merging_iterator_
->Next();
71 single_iterator_
->Next();
76 void Prev(int times
) {
77 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
79 merging_iterator_
->Prev();
80 single_iterator_
->Prev();
85 void NextAndPrev(int times
) {
86 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
89 merging_iterator_
->Prev();
90 single_iterator_
->Prev();
92 merging_iterator_
->Next();
93 single_iterator_
->Next();
99 void Generate(size_t num_iterators
, size_t strings_per_iterator
,
100 int letters_per_string
) {
101 std::vector
<InternalIterator
*> small_iterators
;
102 for (size_t i
= 0; i
< num_iterators
; ++i
) {
103 auto strings
= GenerateStrings(strings_per_iterator
, letters_per_string
);
104 small_iterators
.push_back(new test::VectorIterator(strings
));
105 all_keys_
.insert(all_keys_
.end(), strings
.begin(), strings
.end());
108 merging_iterator_
.reset(
109 NewMergingIterator(&icomp_
, &small_iterators
[0],
110 static_cast<int>(small_iterators
.size())));
111 single_iterator_
.reset(new test::VectorIterator(all_keys_
));
114 InternalKeyComparator icomp_
;
116 std::unique_ptr
<InternalIterator
> merging_iterator_
;
117 std::unique_ptr
<InternalIterator
> single_iterator_
;
118 std::vector
<std::string
> all_keys_
;
121 TEST_F(MergerTest
, SeekToRandomNextTest
) {
122 Generate(1000, 50, 50);
123 for (int i
= 0; i
< 10; ++i
) {
130 TEST_F(MergerTest
, SeekToRandomNextSmallStringsTest
) {
131 Generate(1000, 50, 2);
132 for (int i
= 0; i
< 10; ++i
) {
139 TEST_F(MergerTest
, SeekToRandomPrevTest
) {
140 Generate(1000, 50, 50);
141 for (int i
= 0; i
< 10; ++i
) {
148 TEST_F(MergerTest
, SeekToRandomRandomTest
) {
149 Generate(200, 50, 50);
150 for (int i
= 0; i
< 3; ++i
) {
157 TEST_F(MergerTest
, SeekToFirstTest
) {
158 Generate(1000, 50, 50);
159 for (int i
= 0; i
< 10; ++i
) {
166 TEST_F(MergerTest
, SeekToLastTest
) {
167 Generate(1000, 50, 50);
168 for (int i
= 0; i
< 10; ++i
) {
175 } // namespace rocksdb
177 int main(int argc
, char** argv
) {
178 ::testing::InitGoogleTest(&argc
, argv
);
179 return RUN_ALL_TESTS();