2016-02-11 15:19:58 +01:00
|
|
|
#include "blobstore/implementations/onblocks/datanodestore/DataNodeView.h"
|
|
|
|
#include <gtest/gtest.h>
|
2014-12-10 17:26:49 +01:00
|
|
|
|
2016-02-11 15:19:58 +01:00
|
|
|
#include <blockstore/implementations/testfake/FakeBlockStore.h>
|
|
|
|
#include <blockstore/implementations/testfake/FakeBlock.h>
|
|
|
|
#include "blobstore/implementations/onblocks/BlobStoreOnBlocks.h"
|
|
|
|
#include <cpp-utils/data/DataFixture.h>
|
2014-12-10 17:26:49 +01:00
|
|
|
|
|
|
|
using ::testing::Test;
|
|
|
|
using ::testing::WithParamInterface;
|
|
|
|
using ::testing::Values;
|
|
|
|
using std::string;
|
|
|
|
|
|
|
|
using blockstore::BlockStore;
|
2014-12-11 01:31:21 +01:00
|
|
|
using blockstore::testfake::FakeBlockStore;
|
2015-04-25 02:55:34 +02:00
|
|
|
using cpputils::Data;
|
2015-04-25 16:44:00 +02:00
|
|
|
using cpputils::DataFixture;
|
2015-06-26 15:59:18 +02:00
|
|
|
using cpputils::unique_ref;
|
|
|
|
using cpputils::make_unique_ref;
|
2014-12-10 17:26:49 +01:00
|
|
|
using namespace blobstore;
|
|
|
|
using namespace blobstore::onblocks;
|
2014-12-13 19:17:08 +01:00
|
|
|
using namespace blobstore::onblocks::datanodestore;
|
2014-12-10 17:26:49 +01:00
|
|
|
|
|
|
|
class DataNodeViewTest: public Test {
|
|
|
|
public:
|
2015-02-25 22:30:48 +01:00
|
|
|
static constexpr uint32_t BLOCKSIZE_BYTES = 1024;
|
|
|
|
static constexpr uint32_t DATASIZE_BYTES = DataNodeLayout(DataNodeViewTest::BLOCKSIZE_BYTES).datasizeBytes();
|
|
|
|
|
2015-06-26 15:59:18 +02:00
|
|
|
unique_ref<BlockStore> blockStore = make_unique_ref<FakeBlockStore>();
|
2014-12-10 17:26:49 +01:00
|
|
|
};
|
|
|
|
|
2014-12-13 12:00:19 +01:00
|
|
|
class DataNodeViewDepthTest: public DataNodeViewTest, public WithParamInterface<uint8_t> {
|
|
|
|
};
|
|
|
|
INSTANTIATE_TEST_CASE_P(DataNodeViewDepthTest, DataNodeViewDepthTest, Values(0, 1, 3, 10, 100));
|
|
|
|
|
|
|
|
TEST_P(DataNodeViewDepthTest, DepthIsStored) {
|
2015-04-25 00:08:29 +02:00
|
|
|
auto block = blockStore->create(Data(BLOCKSIZE_BYTES));
|
2017-09-17 03:07:27 +02:00
|
|
|
auto blockId = block->blockId();
|
2014-12-10 17:26:49 +01:00
|
|
|
{
|
2015-01-24 22:27:14 +01:00
|
|
|
DataNodeView view(std::move(block));
|
2015-03-04 20:58:39 +01:00
|
|
|
view.setDepth(GetParam());
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
2017-09-17 03:07:27 +02:00
|
|
|
DataNodeView view(blockStore->load(blockId).value());
|
2015-03-04 20:58:39 +01:00
|
|
|
EXPECT_EQ(GetParam(), view.Depth());
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
class DataNodeViewSizeTest: public DataNodeViewTest, public WithParamInterface<uint32_t> {
|
|
|
|
};
|
|
|
|
INSTANTIATE_TEST_CASE_P(DataNodeViewSizeTest, DataNodeViewSizeTest, Values(0, 50, 64, 1024, 1024*1024*1024));
|
|
|
|
|
|
|
|
TEST_P(DataNodeViewSizeTest, SizeIsStored) {
|
2015-04-25 00:08:29 +02:00
|
|
|
auto block = blockStore->create(Data(BLOCKSIZE_BYTES));
|
2017-09-17 03:07:27 +02:00
|
|
|
auto blockId = block->blockId();
|
2014-12-10 17:26:49 +01:00
|
|
|
{
|
2015-01-24 22:27:14 +01:00
|
|
|
DataNodeView view(std::move(block));
|
2015-03-04 20:58:39 +01:00
|
|
|
view.setSize(GetParam());
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
2017-09-17 03:07:27 +02:00
|
|
|
DataNodeView view(blockStore->load(blockId).value());
|
2015-03-04 20:58:39 +01:00
|
|
|
EXPECT_EQ(GetParam(), view.Size());
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(DataNodeViewTest, DataIsStored) {
|
2015-04-25 16:44:00 +02:00
|
|
|
Data randomData = DataFixture::generate(DATASIZE_BYTES);
|
2015-04-25 00:08:29 +02:00
|
|
|
auto block = blockStore->create(Data(BLOCKSIZE_BYTES));
|
2017-09-17 03:07:27 +02:00
|
|
|
auto blockId = block->blockId();
|
2014-12-10 17:26:49 +01:00
|
|
|
{
|
2015-01-24 22:27:14 +01:00
|
|
|
DataNodeView view(std::move(block));
|
2015-03-05 22:22:22 +01:00
|
|
|
view.write(randomData.data(), 0, randomData.size());
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
2017-09-17 03:07:27 +02:00
|
|
|
DataNodeView view(blockStore->load(blockId).value());
|
2015-03-05 22:22:22 +01:00
|
|
|
EXPECT_EQ(0, std::memcmp(view.data(), randomData.data(), randomData.size()));
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(DataNodeViewTest, HeaderAndBodyDontOverlap) {
|
2015-04-25 16:44:00 +02:00
|
|
|
Data randomData = DataFixture::generate(DATASIZE_BYTES);
|
2015-04-25 00:08:29 +02:00
|
|
|
auto block = blockStore->create(Data(BLOCKSIZE_BYTES));
|
2017-09-17 03:07:27 +02:00
|
|
|
auto blockId = block->blockId();
|
2014-12-10 17:26:49 +01:00
|
|
|
{
|
2015-01-24 22:27:14 +01:00
|
|
|
DataNodeView view(std::move(block));
|
2015-03-04 20:58:39 +01:00
|
|
|
view.setDepth(3);
|
|
|
|
view.setSize(1000000000u);
|
2015-03-05 22:22:22 +01:00
|
|
|
view.write(randomData.data(), 0, DATASIZE_BYTES);
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
2017-09-17 03:07:27 +02:00
|
|
|
DataNodeView view(blockStore->load(blockId).value());
|
2015-03-04 20:58:39 +01:00
|
|
|
EXPECT_EQ(3, view.Depth());
|
|
|
|
EXPECT_EQ(1000000000u, view.Size());
|
2015-03-05 22:22:22 +01:00
|
|
|
EXPECT_EQ(0, std::memcmp(view.data(), randomData.data(), DATASIZE_BYTES));
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
|
|
|
|
2017-12-03 20:01:41 +01:00
|
|
|
TEST_F(DataNodeViewTest, Data) {
|
2015-04-25 00:08:29 +02:00
|
|
|
auto block = blockStore->create(Data(BLOCKSIZE_BYTES));
|
2017-12-03 20:01:41 +01:00
|
|
|
const uint8_t *blockBegin = static_cast<const uint8_t*>(block->data());
|
2015-01-24 22:27:14 +01:00
|
|
|
DataNodeView view(std::move(block));
|
2014-12-10 17:26:49 +01:00
|
|
|
|
2017-12-03 20:01:41 +01:00
|
|
|
EXPECT_EQ(blockBegin+DataNodeLayout::HEADERSIZE_BYTES, static_cast<const uint8_t*>(view.data()));
|
2014-12-10 17:26:49 +01:00
|
|
|
}
|
2015-03-04 20:58:39 +01:00
|
|
|
|
|
|
|
//TODO Test that header fields (and data) are also stored over reloads
|