Feathercoin  0.5.0
P2P Digital Currency
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
version_set_test.cc
Go to the documentation of this file.
1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
4 
5 #include "db/version_set.h"
6 #include "util/logging.h"
7 #include "util/testharness.h"
8 #include "util/testutil.h"
9 
10 namespace leveldb {
11 
12 class FindFileTest {
13  public:
14  std::vector<FileMetaData*> files_;
16 
17  FindFileTest() : disjoint_sorted_files_(true) { }
18 
20  for (int i = 0; i < files_.size(); i++) {
21  delete files_[i];
22  }
23  }
24 
25  void Add(const char* smallest, const char* largest,
26  SequenceNumber smallest_seq = 100,
27  SequenceNumber largest_seq = 100) {
28  FileMetaData* f = new FileMetaData;
29  f->number = files_.size() + 1;
30  f->smallest = InternalKey(smallest, smallest_seq, kTypeValue);
31  f->largest = InternalKey(largest, largest_seq, kTypeValue);
32  files_.push_back(f);
33  }
34 
35  int Find(const char* key) {
36  InternalKey target(key, 100, kTypeValue);
38  return FindFile(cmp, files_, target.Encode());
39  }
40 
41  bool Overlaps(const char* smallest, const char* largest) {
43  Slice s(smallest != NULL ? smallest : "");
44  Slice l(largest != NULL ? largest : "");
45  return SomeFileOverlapsRange(cmp, disjoint_sorted_files_, files_,
46  (smallest != NULL ? &s : NULL),
47  (largest != NULL ? &l : NULL));
48  }
49 };
50 
51 TEST(FindFileTest, Empty) {
52  ASSERT_EQ(0, Find("foo"));
53  ASSERT_TRUE(! Overlaps("a", "z"));
54  ASSERT_TRUE(! Overlaps(NULL, "z"));
55  ASSERT_TRUE(! Overlaps("a", NULL));
56  ASSERT_TRUE(! Overlaps(NULL, NULL));
57 }
58 
59 TEST(FindFileTest, Single) {
60  Add("p", "q");
61  ASSERT_EQ(0, Find("a"));
62  ASSERT_EQ(0, Find("p"));
63  ASSERT_EQ(0, Find("p1"));
64  ASSERT_EQ(0, Find("q"));
65  ASSERT_EQ(1, Find("q1"));
66  ASSERT_EQ(1, Find("z"));
67 
68  ASSERT_TRUE(! Overlaps("a", "b"));
69  ASSERT_TRUE(! Overlaps("z1", "z2"));
70  ASSERT_TRUE(Overlaps("a", "p"));
71  ASSERT_TRUE(Overlaps("a", "q"));
72  ASSERT_TRUE(Overlaps("a", "z"));
73  ASSERT_TRUE(Overlaps("p", "p1"));
74  ASSERT_TRUE(Overlaps("p", "q"));
75  ASSERT_TRUE(Overlaps("p", "z"));
76  ASSERT_TRUE(Overlaps("p1", "p2"));
77  ASSERT_TRUE(Overlaps("p1", "z"));
78  ASSERT_TRUE(Overlaps("q", "q"));
79  ASSERT_TRUE(Overlaps("q", "q1"));
80 
81  ASSERT_TRUE(! Overlaps(NULL, "j"));
82  ASSERT_TRUE(! Overlaps("r", NULL));
83  ASSERT_TRUE(Overlaps(NULL, "p"));
84  ASSERT_TRUE(Overlaps(NULL, "p1"));
85  ASSERT_TRUE(Overlaps("q", NULL));
86  ASSERT_TRUE(Overlaps(NULL, NULL));
87 }
88 
89 
90 TEST(FindFileTest, Multiple) {
91  Add("150", "200");
92  Add("200", "250");
93  Add("300", "350");
94  Add("400", "450");
95  ASSERT_EQ(0, Find("100"));
96  ASSERT_EQ(0, Find("150"));
97  ASSERT_EQ(0, Find("151"));
98  ASSERT_EQ(0, Find("199"));
99  ASSERT_EQ(0, Find("200"));
100  ASSERT_EQ(1, Find("201"));
101  ASSERT_EQ(1, Find("249"));
102  ASSERT_EQ(1, Find("250"));
103  ASSERT_EQ(2, Find("251"));
104  ASSERT_EQ(2, Find("299"));
105  ASSERT_EQ(2, Find("300"));
106  ASSERT_EQ(2, Find("349"));
107  ASSERT_EQ(2, Find("350"));
108  ASSERT_EQ(3, Find("351"));
109  ASSERT_EQ(3, Find("400"));
110  ASSERT_EQ(3, Find("450"));
111  ASSERT_EQ(4, Find("451"));
112 
113  ASSERT_TRUE(! Overlaps("100", "149"));
114  ASSERT_TRUE(! Overlaps("251", "299"));
115  ASSERT_TRUE(! Overlaps("451", "500"));
116  ASSERT_TRUE(! Overlaps("351", "399"));
117 
118  ASSERT_TRUE(Overlaps("100", "150"));
119  ASSERT_TRUE(Overlaps("100", "200"));
120  ASSERT_TRUE(Overlaps("100", "300"));
121  ASSERT_TRUE(Overlaps("100", "400"));
122  ASSERT_TRUE(Overlaps("100", "500"));
123  ASSERT_TRUE(Overlaps("375", "400"));
124  ASSERT_TRUE(Overlaps("450", "450"));
125  ASSERT_TRUE(Overlaps("450", "500"));
126 }
127 
128 TEST(FindFileTest, MultipleNullBoundaries) {
129  Add("150", "200");
130  Add("200", "250");
131  Add("300", "350");
132  Add("400", "450");
133  ASSERT_TRUE(! Overlaps(NULL, "149"));
134  ASSERT_TRUE(! Overlaps("451", NULL));
135  ASSERT_TRUE(Overlaps(NULL, NULL));
136  ASSERT_TRUE(Overlaps(NULL, "150"));
137  ASSERT_TRUE(Overlaps(NULL, "199"));
138  ASSERT_TRUE(Overlaps(NULL, "200"));
139  ASSERT_TRUE(Overlaps(NULL, "201"));
140  ASSERT_TRUE(Overlaps(NULL, "400"));
141  ASSERT_TRUE(Overlaps(NULL, "800"));
142  ASSERT_TRUE(Overlaps("100", NULL));
143  ASSERT_TRUE(Overlaps("200", NULL));
144  ASSERT_TRUE(Overlaps("449", NULL));
145  ASSERT_TRUE(Overlaps("450", NULL));
146 }
147 
148 TEST(FindFileTest, OverlapSequenceChecks) {
149  Add("200", "200", 5000, 3000);
150  ASSERT_TRUE(! Overlaps("199", "199"));
151  ASSERT_TRUE(! Overlaps("201", "300"));
152  ASSERT_TRUE(Overlaps("200", "200"));
153  ASSERT_TRUE(Overlaps("190", "200"));
154  ASSERT_TRUE(Overlaps("200", "210"));
155 }
156 
157 TEST(FindFileTest, OverlappingFiles) {
158  Add("150", "600");
159  Add("400", "500");
160  disjoint_sorted_files_ = false;
161  ASSERT_TRUE(! Overlaps("100", "149"));
162  ASSERT_TRUE(! Overlaps("601", "700"));
163  ASSERT_TRUE(Overlaps("100", "150"));
164  ASSERT_TRUE(Overlaps("100", "200"));
165  ASSERT_TRUE(Overlaps("100", "300"));
166  ASSERT_TRUE(Overlaps("100", "400"));
167  ASSERT_TRUE(Overlaps("100", "500"));
168  ASSERT_TRUE(Overlaps("375", "400"));
169  ASSERT_TRUE(Overlaps("450", "450"));
170  ASSERT_TRUE(Overlaps("450", "500"));
171  ASSERT_TRUE(Overlaps("450", "700"));
172  ASSERT_TRUE(Overlaps("600", "700"));
173 }
174 
175 } // namespace leveldb
176 
177 int main(int argc, char** argv) {
179 }
Slice Encode() const
Definition: dbformat.h:154
void Add(const char *smallest, const char *largest, SequenceNumber smallest_seq=100, SequenceNumber largest_seq=100)
bool Overlaps(const char *smallest, const char *largest)
int RunAllTests()
Definition: testharness.cc:36
bool SomeFileOverlapsRange(const InternalKeyComparator &icmp, bool disjoint_sorted_files, const std::vector< FileMetaData * > &files, const Slice *smallest_user_key, const Slice *largest_user_key)
Definition: version_set.cc:126
std::vector< FileMetaData * > files_
InternalKey smallest
Definition: version_edit.h:22
#define ASSERT_EQ(a, b)
Definition: testharness.h:107
uint64_t SequenceNumber
Definition: dbformat.h:63
TEST(CorruptionTest, Recovery)
#define ASSERT_TRUE(c)
Definition: testharness.h:105
const Comparator * BytewiseComparator()
Definition: comparator.cc:76
int Find(const char *key)
const Comparator * cmp
Definition: table_test.cc:80
int main(int argc, char **argv)
int FindFile(const InternalKeyComparator &icmp, const std::vector< FileMetaData * > &files, const Slice &key)
Definition: version_set.cc:91