git-svn-id: https://leveldb.googlecode.com/svn/trunk@33 62dab493-f737-651d-591e-8d6aee1b9529main
parent
ccf0fcd5c2
commit
e0cbd242cb
@ -0,0 +1,115 @@ |
|||||||
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
||||||
|
|
||||||
|
#include "db/version_set.h" |
||||||
|
#include "util/logging.h" |
||||||
|
#include "util/testharness.h" |
||||||
|
#include "util/testutil.h" |
||||||
|
|
||||||
|
namespace leveldb { |
||||||
|
|
||||||
|
class FindFileTest { |
||||||
|
public: |
||||||
|
std::vector<FileMetaData*> files_; |
||||||
|
|
||||||
|
~FindFileTest() { |
||||||
|
for (int i = 0; i < files_.size(); i++) { |
||||||
|
delete files_[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void Add(const char* smallest, const char* largest) { |
||||||
|
FileMetaData* f = new FileMetaData; |
||||||
|
f->number = files_.size() + 1; |
||||||
|
f->smallest = InternalKey(smallest, 100, kTypeValue); |
||||||
|
f->largest = InternalKey(largest, 100, kTypeValue); |
||||||
|
files_.push_back(f); |
||||||
|
} |
||||||
|
|
||||||
|
int Find(const char* key) { |
||||||
|
InternalKey target(key, 100, kTypeValue); |
||||||
|
InternalKeyComparator cmp(BytewiseComparator()); |
||||||
|
return FindFile(cmp, files_, target.Encode()); |
||||||
|
} |
||||||
|
|
||||||
|
bool Overlaps(const char* smallest, const char* largest) { |
||||||
|
InternalKey s(smallest, 100, kTypeValue); |
||||||
|
InternalKey l(largest, 100, kTypeValue); |
||||||
|
InternalKeyComparator cmp(BytewiseComparator()); |
||||||
|
return SomeFileOverlapsRange(cmp, files_, s, l); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
TEST(FindFileTest, Empty) { |
||||||
|
ASSERT_EQ(0, Find("foo")); |
||||||
|
ASSERT_TRUE(! Overlaps("a", "z")); |
||||||
|
} |
||||||
|
|
||||||
|
TEST(FindFileTest, Single) { |
||||||
|
Add("p", "q"); |
||||||
|
ASSERT_EQ(0, Find("a")); |
||||||
|
ASSERT_EQ(0, Find("p")); |
||||||
|
ASSERT_EQ(0, Find("p1")); |
||||||
|
ASSERT_EQ(0, Find("q")); |
||||||
|
ASSERT_EQ(1, Find("q1")); |
||||||
|
ASSERT_EQ(1, Find("z")); |
||||||
|
|
||||||
|
ASSERT_TRUE(! Overlaps("a", "b")); |
||||||
|
ASSERT_TRUE(! Overlaps("z1", "z2")); |
||||||
|
ASSERT_TRUE(Overlaps("a", "p")); |
||||||
|
ASSERT_TRUE(Overlaps("a", "q")); |
||||||
|
ASSERT_TRUE(Overlaps("a", "z")); |
||||||
|
ASSERT_TRUE(Overlaps("p", "p1")); |
||||||
|
ASSERT_TRUE(Overlaps("p", "q")); |
||||||
|
ASSERT_TRUE(Overlaps("p", "z")); |
||||||
|
ASSERT_TRUE(Overlaps("p1", "p2")); |
||||||
|
ASSERT_TRUE(Overlaps("p1", "z")); |
||||||
|
ASSERT_TRUE(Overlaps("q", "q")); |
||||||
|
ASSERT_TRUE(Overlaps("q", "q1")); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
TEST(FindFileTest, Multiple) { |
||||||
|
Add("150", "200"); |
||||||
|
Add("200", "250"); |
||||||
|
Add("300", "350"); |
||||||
|
Add("400", "450"); |
||||||
|
ASSERT_EQ(0, Find("100")); |
||||||
|
ASSERT_EQ(0, Find("150")); |
||||||
|
ASSERT_EQ(0, Find("151")); |
||||||
|
ASSERT_EQ(0, Find("199")); |
||||||
|
ASSERT_EQ(0, Find("200")); |
||||||
|
ASSERT_EQ(1, Find("201")); |
||||||
|
ASSERT_EQ(1, Find("249")); |
||||||
|
ASSERT_EQ(1, Find("250")); |
||||||
|
ASSERT_EQ(2, Find("251")); |
||||||
|
ASSERT_EQ(2, Find("299")); |
||||||
|
ASSERT_EQ(2, Find("300")); |
||||||
|
ASSERT_EQ(2, Find("349")); |
||||||
|
ASSERT_EQ(2, Find("350")); |
||||||
|
ASSERT_EQ(3, Find("351")); |
||||||
|
ASSERT_EQ(3, Find("400")); |
||||||
|
ASSERT_EQ(3, Find("450")); |
||||||
|
ASSERT_EQ(4, Find("451")); |
||||||
|
|
||||||
|
ASSERT_TRUE(! Overlaps("100", "149")); |
||||||
|
ASSERT_TRUE(! Overlaps("251", "299")); |
||||||
|
ASSERT_TRUE(! Overlaps("451", "500")); |
||||||
|
ASSERT_TRUE(! Overlaps("351", "399")); |
||||||
|
|
||||||
|
ASSERT_TRUE(Overlaps("100", "150")); |
||||||
|
ASSERT_TRUE(Overlaps("100", "200")); |
||||||
|
ASSERT_TRUE(Overlaps("100", "300")); |
||||||
|
ASSERT_TRUE(Overlaps("100", "400")); |
||||||
|
ASSERT_TRUE(Overlaps("100", "500")); |
||||||
|
ASSERT_TRUE(Overlaps("375", "400")); |
||||||
|
ASSERT_TRUE(Overlaps("450", "450")); |
||||||
|
ASSERT_TRUE(Overlaps("450", "500")); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
return leveldb::test::RunAllTests(); |
||||||
|
} |
Loading…
Reference in new issue