2015-02-26 17:05:05 +01:00
|
|
|
#include "testutils/DataTreeTest.h"
|
2016-02-11 15:19:58 +01:00
|
|
|
#include <gmock/gmock.h>
|
2015-02-26 17:04:02 +01:00
|
|
|
|
|
|
|
using ::testing::WithParamInterface;
|
|
|
|
using ::testing::Values;
|
|
|
|
|
|
|
|
using blobstore::onblocks::datanodestore::DataNodeLayout;
|
2017-09-17 03:07:27 +02:00
|
|
|
using blockstore::BlockId;
|
2015-02-26 17:04:02 +01:00
|
|
|
|
|
|
|
class DataTreeTest_NumStoredBytes: public DataTreeTest {
|
|
|
|
public:
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(DataTreeTest_NumStoredBytes, CreatedTreeIsEmpty) {
|
|
|
|
auto tree = treeStore.createNewTree();
|
2016-02-11 15:19:58 +01:00
|
|
|
EXPECT_EQ(0u, tree->numStoredBytes());
|
2015-02-26 17:04:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
class DataTreeTest_NumStoredBytes_P: public DataTreeTest_NumStoredBytes, public WithParamInterface<uint32_t> {};
|
|
|
|
INSTANTIATE_TEST_CASE_P(EmptyLastLeaf, DataTreeTest_NumStoredBytes_P, Values(0u));
|
|
|
|
INSTANTIATE_TEST_CASE_P(HalfFullLastLeaf, DataTreeTest_NumStoredBytes_P, Values(5u, 10u));
|
2015-12-11 00:18:17 +01:00
|
|
|
INSTANTIATE_TEST_CASE_P(FullLastLeaf, DataTreeTest_NumStoredBytes_P, Values((uint32_t)DataNodeLayout(DataTreeTest_NumStoredBytes::BLOCKSIZE_BYTES).maxBytesPerLeaf()));
|
2015-02-26 17:04:02 +01:00
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, SingleLeaf) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateLeafWithSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, TwoLeafTree) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateTwoLeafWithSecondLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf() + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, FullTwolevelTree) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateFullTwoLevelWithLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf()*(nodeStore->layout().maxChildrenPerInnerNode()-1) + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, ThreeLevelTreeWithOneChild) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateThreeLevelWithOneChildAndLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf() + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, ThreeLevelTreeWithTwoChildren) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateThreeLevelWithTwoChildrenAndLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf()*nodeStore->layout().maxChildrenPerInnerNode() + nodeStore->layout().maxBytesPerLeaf() + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, ThreeLevelTreeWithThreeChildren) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateThreeLevelWithThreeChildrenAndLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(2*nodeStore->layout().maxBytesPerLeaf()*nodeStore->layout().maxChildrenPerInnerNode() + nodeStore->layout().maxBytesPerLeaf() + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, FullThreeLevelTree) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateFullThreeLevelWithLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf()*nodeStore->layout().maxChildrenPerInnerNode()*(nodeStore->layout().maxChildrenPerInnerNode()-1) + nodeStore->layout().maxBytesPerLeaf()*(nodeStore->layout().maxChildrenPerInnerNode()-1) + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_P(DataTreeTest_NumStoredBytes_P, FourLevelMinDataTree) {
|
2017-09-17 03:07:27 +02:00
|
|
|
BlockId blockId = CreateFourLevelMinDataWithLastLeafSize(GetParam())->blockId();
|
|
|
|
auto tree = treeStore.load(blockId).value();
|
2015-02-26 17:04:02 +01:00
|
|
|
EXPECT_EQ(nodeStore->layout().maxBytesPerLeaf()*nodeStore->layout().maxChildrenPerInnerNode()*nodeStore->layout().maxChildrenPerInnerNode() + GetParam(), tree->numStoredBytes());
|
|
|
|
}
|