Summary: This is a standalone unit test to test the format of a block. Test Plan: ./block_test Reviewers: sheki Reviewed By: sheki Differential Revision: https://reviews.facebook.net/D7533main
parent
58d144444e
commit
551f01fb23
@ -0,0 +1,106 @@ |
||||
// Copyright (c) 2012 Facebook.
|
||||
// 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 "leveldb/table.h" |
||||
|
||||
#include <string> |
||||
#include "db/dbformat.h" |
||||
#include "db/memtable.h" |
||||
#include "db/write_batch_internal.h" |
||||
#include "leveldb/db.h" |
||||
#include "leveldb/env.h" |
||||
#include "leveldb/iterator.h" |
||||
#include "leveldb/table_builder.h" |
||||
#include "table/block.h" |
||||
#include "table/block_builder.h" |
||||
#include "table/format.h" |
||||
#include "util/random.h" |
||||
#include "util/testharness.h" |
||||
#include "util/testutil.h" |
||||
|
||||
namespace leveldb { |
||||
|
||||
static std::string RandomString(Random* rnd, int len) { |
||||
std::string r; |
||||
test::RandomString(rnd, len, &r); |
||||
return r; |
||||
} |
||||
|
||||
class BlockTest {}; |
||||
|
||||
// block test
|
||||
TEST(BlockTest, SimpleTest) { |
||||
Random rnd(301); |
||||
Options options = Options(); |
||||
std::vector<std::string> keys; |
||||
std::vector<std::string> values; |
||||
BlockBuilder builder(&options); |
||||
int num_records = 100000; |
||||
char buf[10]; |
||||
char* p = &buf[0]; |
||||
|
||||
// add a bunch of records to a block
|
||||
for (int i = 0; i < num_records; i++) { |
||||
// generate random kvs
|
||||
sprintf(p, "%6d", i); |
||||
std::string k(p); |
||||
std::string v = RandomString(&rnd, 100); // 100 byte values
|
||||
|
||||
// write kvs to the block
|
||||
Slice key(k); |
||||
Slice value(v); |
||||
builder.Add(key, value); |
||||
|
||||
// remember kvs in a lookaside array
|
||||
keys.push_back(k); |
||||
values.push_back(v); |
||||
} |
||||
|
||||
// read serialized contents of the block
|
||||
Slice rawblock = builder.Finish(); |
||||
|
||||
// create block reader
|
||||
BlockContents contents; |
||||
contents.data = rawblock; |
||||
contents.cachable = false; |
||||
contents.heap_allocated = false; |
||||
Block reader(contents); |
||||
|
||||
// read contents of block sequentially
|
||||
int count = 0; |
||||
Iterator* iter = reader.NewIterator(options.comparator); |
||||
for (iter->SeekToFirst();iter->Valid(); count++, iter->Next()) { |
||||
|
||||
// read kv from block
|
||||
Slice k = iter->key(); |
||||
Slice v = iter->value(); |
||||
|
||||
// compare with lookaside array
|
||||
ASSERT_EQ(k.ToString().compare(keys[count]), 0); |
||||
ASSERT_EQ(v.ToString().compare(values[count]), 0); |
||||
} |
||||
delete iter; |
||||
|
||||
// read block contents randomly
|
||||
iter = reader.NewIterator(options.comparator); |
||||
for (int i = 0; i < num_records; i++) { |
||||
|
||||
// find a random key in the lookaside array
|
||||
int index = rnd.Uniform(num_records); |
||||
Slice k(keys[index]); |
||||
|
||||
// search in block for this key
|
||||
iter->Seek(k); |
||||
ASSERT_TRUE(iter->Valid()); |
||||
Slice v = iter->value(); |
||||
ASSERT_EQ(v.ToString().compare(values[index]), 0); |
||||
} |
||||
delete iter; |
||||
} |
||||
|
||||
} // namespace leveldb
|
||||
|
||||
int main(int argc, char** argv) { |
||||
return leveldb::test::RunAllTests(); |
||||
} |
Loading…
Reference in new issue