YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/rocksdb/table/merger_test.cc
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under the BSD-style license found in the
3
//  LICENSE file in the root directory of this source tree. An additional grant
4
//  of patent rights can be found in the PATENTS file in the same directory.
5
//
6
// The following only applies to changes made to this file as part of YugaByte development.
7
//
8
// Portions Copyright (c) YugaByte, Inc.
9
//
10
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
11
// in compliance with the License.  You may obtain a copy of the License at
12
//
13
// http://www.apache.org/licenses/LICENSE-2.0
14
//
15
// Unless required by applicable law or agreed to in writing, software distributed under the License
16
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
17
// or implied.  See the License for the specific language governing permissions and limitations
18
// under the License.
19
//
20
21
#include <vector>
22
#include <string>
23
24
#include "yb/rocksdb/table/merger.h"
25
#include <gtest/gtest.h>
26
#include "yb/rocksdb/env.h"
27
#include "yb/rocksdb/util/testutil.h"
28
29
namespace rocksdb {
30
31
class MergerTest : public RocksDBTest {
32
 public:
33
  MergerTest()
34
6
      : rnd_(3), merging_iterator_(nullptr), single_iterator_(nullptr) {}
35
6
  ~MergerTest() = default;
36
5.20k
  std::vector<std::string> GenerateStrings(size_t len, int string_len) {
37
5.20k
    std::vector<std::string> ret;
38
265k
    for (size_t i = 0; i < len; ++i) {
39
260k
      ret.push_back(test::RandomHumanReadableString(&rnd_, string_len));
40
260k
    }
41
5.20k
    return ret;
42
5.20k
  }
43
44
1.75M
  void AssertEquivalence() {
45
1.75M
    auto a = merging_iterator_.get();
46
1.75M
    auto b = single_iterator_.get();
47
1.75M
    if (!a->Valid()) {
48
50
      ASSERT_TRUE(!b->Valid());
49
1.75M
    } else {
50
1.75M
      ASSERT_TRUE(b->Valid());
51
1.75M
      ASSERT_EQ(b->key().ToString(), a->key().ToString());
52
1.75M
      ASSERT_EQ(b->value().ToString(), a->value().ToString());
53
1.75M
    }
54
1.75M
  }
55
56
33
  void SeekToRandom() { Seek(test::RandomHumanReadableString(&rnd_, 5)); }
57
58
33
  void Seek(std::string target) {
59
33
    merging_iterator_->Seek(target);
60
33
    single_iterator_->Seek(target);
61
33
  }
62
63
10
  void SeekToFirst() {
64
10
    merging_iterator_->SeekToFirst();
65
10
    single_iterator_->SeekToFirst();
66
10
  }
67
68
10
  void SeekToLast() {
69
10
    merging_iterator_->SeekToLast();
70
10
    single_iterator_->SeekToLast();
71
10
  }
72
73
30
  void Next(int times) {
74
885k
    for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
75
885k
      AssertEquivalence();
76
885k
      merging_iterator_->Next();
77
885k
      single_iterator_->Next();
78
885k
    }
79
30
    AssertEquivalence();
80
30
  }
81
82
20
  void Prev(int times) {
83
855k
    for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
84
855k
      AssertEquivalence();
85
855k
      merging_iterator_->Prev();
86
855k
      single_iterator_->Prev();
87
855k
    }
88
20
    AssertEquivalence();
89
20
  }
90
91
3
  void NextAndPrev(int times) {
92
15.0k
    for (int i = 0; i < times && merging_iterator_->Valid(); ++i) {
93
15.0k
      AssertEquivalence();
94
15.0k
      if (rnd_.OneIn(2)) {
95
7.57k
        merging_iterator_->Prev();
96
7.57k
        single_iterator_->Prev();
97
7.43k
      } else {
98
7.43k
        merging_iterator_->Next();
99
7.43k
        single_iterator_->Next();
100
7.43k
      }
101
15.0k
    }
102
3
    AssertEquivalence();
103
3
  }
104
105
  void Generate(size_t num_iterators, size_t strings_per_iterator,
106
6
                int letters_per_string) {
107
6
    std::vector<InternalIterator*> small_iterators;
108
5.20k
    for (size_t i = 0; i < num_iterators; ++i) {
109
5.20k
      auto strings = GenerateStrings(strings_per_iterator, letters_per_string);
110
5.20k
      small_iterators.push_back(new test::VectorIterator(strings));
111
5.20k
      all_keys_.insert(all_keys_.end(), strings.begin(), strings.end());
112
5.20k
    }
113
114
6
    merging_iterator_.reset(
115
6
        NewMergingIterator(BytewiseComparator(), &small_iterators[0],
116
6
                           static_cast<int>(small_iterators.size())));
117
6
    single_iterator_.reset(new test::VectorIterator(all_keys_));
118
6
  }
119
120
  Random rnd_;
121
  std::unique_ptr<InternalIterator> merging_iterator_;
122
  std::unique_ptr<InternalIterator> single_iterator_;
123
  std::vector<std::string> all_keys_;
124
};
125
126
1
TEST_F(MergerTest, SeekToRandomNextTest) {
127
1
  Generate(1000, 50, 50);
128
11
  for (int i = 0; i < 10; ++i) {
129
10
    SeekToRandom();
130
10
    AssertEquivalence();
131
10
    Next(50000);
132
10
  }
133
1
}
134
135
1
TEST_F(MergerTest, SeekToRandomNextSmallStringsTest) {
136
1
  Generate(1000, 50, 2);
137
11
  for (int i = 0; i < 10; ++i) {
138
10
    SeekToRandom();
139
10
    AssertEquivalence();
140
10
    Next(50000);
141
10
  }
142
1
}
143
144
1
TEST_F(MergerTest, SeekToRandomPrevTest) {
145
1
  Generate(1000, 50, 50);
146
11
  for (int i = 0; i < 10; ++i) {
147
10
    SeekToRandom();
148
10
    AssertEquivalence();
149
10
    Prev(50000);
150
10
  }
151
1
}
152
153
1
TEST_F(MergerTest, SeekToRandomRandomTest) {
154
1
  Generate(200, 50, 50);
155
4
  for (int i = 0; i < 3; ++i) {
156
3
    SeekToRandom();
157
3
    AssertEquivalence();
158
3
    NextAndPrev(5000);
159
3
  }
160
1
}
161
162
1
TEST_F(MergerTest, SeekToFirstTest) {
163
1
  Generate(1000, 50, 50);
164
11
  for (int i = 0; i < 10; ++i) {
165
10
    SeekToFirst();
166
10
    AssertEquivalence();
167
10
    Next(50000);
168
10
  }
169
1
}
170
171
1
TEST_F(MergerTest, SeekToLastTest) {
172
1
  Generate(1000, 50, 50);
173
11
  for (int i = 0; i < 10; ++i) {
174
10
    SeekToLast();
175
10
    AssertEquivalence();
176
10
    Prev(50000);
177
10
  }
178
1
}
179
180
}  // namespace rocksdb
181
182
13.2k
int main(int argc, char** argv) {
183
13.2k
  ::testing::InitGoogleTest(&argc, argv);
184
13.2k
  return RUN_ALL_TESTS();
185
13.2k
}