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 "test_util/testharness.h"
11 #include "test_util/testutil.h"
12 #include "util/random.h"
13 #include "util/vector_iterator.h"
15 namespace ROCKSDB_NAMESPACE
{
17 class MergerTest
: public testing::Test
{
20 : icomp_(BytewiseComparator()),
22 merging_iterator_(nullptr),
23 single_iterator_(nullptr) {}
24 ~MergerTest() override
= default;
25 std::vector
<std::string
> GenerateStrings(size_t len
, int string_len
) {
26 std::vector
<std::string
> ret
;
28 for (size_t i
= 0; i
< len
; ++i
) {
29 InternalKey
ik(rnd_
.HumanReadableString(string_len
), 0,
30 ValueType::kTypeValue
);
31 ret
.push_back(ik
.Encode().ToString(false));
36 void AssertEquivalence() {
37 auto a
= merging_iterator_
.get();
38 auto b
= single_iterator_
.get();
40 ASSERT_TRUE(!b
->Valid());
42 ASSERT_TRUE(b
->Valid());
43 ASSERT_EQ(b
->key().ToString(), a
->key().ToString());
44 ASSERT_EQ(b
->value().ToString(), a
->value().ToString());
49 InternalKey
ik(rnd_
.HumanReadableString(5), 0, ValueType::kTypeValue
);
50 Seek(ik
.Encode().ToString(false));
53 void Seek(std::string target
) {
54 merging_iterator_
->Seek(target
);
55 single_iterator_
->Seek(target
);
59 merging_iterator_
->SeekToFirst();
60 single_iterator_
->SeekToFirst();
64 merging_iterator_
->SeekToLast();
65 single_iterator_
->SeekToLast();
68 void Next(int times
) {
69 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
71 merging_iterator_
->Next();
72 single_iterator_
->Next();
77 void Prev(int times
) {
78 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
80 merging_iterator_
->Prev();
81 single_iterator_
->Prev();
86 void NextAndPrev(int times
) {
87 for (int i
= 0; i
< times
&& merging_iterator_
->Valid(); ++i
) {
90 merging_iterator_
->Prev();
91 single_iterator_
->Prev();
93 merging_iterator_
->Next();
94 single_iterator_
->Next();
100 void Generate(size_t num_iterators
, size_t strings_per_iterator
,
101 int letters_per_string
) {
102 std::vector
<InternalIterator
*> small_iterators
;
103 for (size_t i
= 0; i
< num_iterators
; ++i
) {
104 auto strings
= GenerateStrings(strings_per_iterator
, letters_per_string
);
105 small_iterators
.push_back(new VectorIterator(strings
, strings
, &icomp_
));
106 all_keys_
.insert(all_keys_
.end(), strings
.begin(), strings
.end());
109 merging_iterator_
.reset(
110 NewMergingIterator(&icomp_
, &small_iterators
[0],
111 static_cast<int>(small_iterators
.size())));
112 single_iterator_
.reset(new VectorIterator(all_keys_
, all_keys_
, &icomp_
));
115 InternalKeyComparator icomp_
;
117 std::unique_ptr
<InternalIterator
> merging_iterator_
;
118 std::unique_ptr
<InternalIterator
> single_iterator_
;
119 std::vector
<std::string
> all_keys_
;
122 TEST_F(MergerTest
, SeekToRandomNextTest
) {
123 Generate(1000, 50, 50);
124 for (int i
= 0; i
< 10; ++i
) {
131 TEST_F(MergerTest
, SeekToRandomNextSmallStringsTest
) {
132 Generate(1000, 50, 2);
133 for (int i
= 0; i
< 10; ++i
) {
140 TEST_F(MergerTest
, SeekToRandomPrevTest
) {
141 Generate(1000, 50, 50);
142 for (int i
= 0; i
< 10; ++i
) {
149 TEST_F(MergerTest
, SeekToRandomRandomTest
) {
150 Generate(200, 50, 50);
151 for (int i
= 0; i
< 3; ++i
) {
158 TEST_F(MergerTest
, SeekToFirstTest
) {
159 Generate(1000, 50, 50);
160 for (int i
= 0; i
< 10; ++i
) {
167 TEST_F(MergerTest
, SeekToLastTest
) {
168 Generate(1000, 50, 50);
169 for (int i
= 0; i
< 10; ++i
) {
176 } // namespace ROCKSDB_NAMESPACE
178 int main(int argc
, char** argv
) {
179 ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
180 ::testing::InitGoogleTest(&argc
, argv
);
181 return RUN_ALL_TESTS();