2014-12-09 17:19:59 +01:00
|
|
|
#pragma once
|
|
|
|
#ifndef TEST_BLOCKSTORE_IMPLEMENTATIONS_TESTUTILS_BLOCKSTOREWITHRANDOMKEYSTEST_H_
|
|
|
|
#define TEST_BLOCKSTORE_IMPLEMENTATIONS_TESTUTILS_BLOCKSTOREWITHRANDOMKEYSTEST_H_
|
|
|
|
|
2015-02-17 00:23:33 +01:00
|
|
|
#include <google/gtest/gtest.h>
|
2014-12-09 17:19:59 +01:00
|
|
|
|
2015-02-17 00:23:33 +01:00
|
|
|
#include "../../interface/BlockStore.h"
|
2014-12-09 17:19:59 +01:00
|
|
|
|
|
|
|
class BlockStoreWithRandomKeysTestFixture {
|
|
|
|
public:
|
|
|
|
virtual std::unique_ptr<blockstore::BlockStoreWithRandomKeys> createBlockStore() = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class ConcreteBlockStoreWithRandomKeysTestFixture>
|
|
|
|
class BlockStoreWithRandomKeysTest: public ::testing::Test {
|
|
|
|
public:
|
|
|
|
BOOST_STATIC_ASSERT_MSG(
|
|
|
|
(std::is_base_of<BlockStoreWithRandomKeysTestFixture, ConcreteBlockStoreWithRandomKeysTestFixture>::value),
|
|
|
|
"Given test fixture for instantiating the (type parameterized) BlockStoreWithRandomKeysTest must inherit from BlockStoreWithRandomKeysTestFixture"
|
|
|
|
);
|
|
|
|
|
2014-12-09 20:57:10 +01:00
|
|
|
blockstore::Key key = blockstore::Key::FromString("1491BB4932A389EE14BC7090AC772972");
|
2014-12-09 20:36:32 +01:00
|
|
|
|
2014-12-09 17:19:59 +01:00
|
|
|
const std::vector<size_t> SIZES = {0, 1, 1024, 4096, 10*1024*1024};
|
|
|
|
|
|
|
|
ConcreteBlockStoreWithRandomKeysTestFixture fixture;
|
|
|
|
};
|
|
|
|
|
|
|
|
TYPED_TEST_CASE_P(BlockStoreWithRandomKeysTest);
|
|
|
|
|
|
|
|
TYPED_TEST_P(BlockStoreWithRandomKeysTest, CreateTwoBlocksWithSameKeyAndSameSize) {
|
|
|
|
auto blockStore = this->fixture.createBlockStore();
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block = blockStore->tryCreate(this->key, cpputils::Data(1024));
|
2015-07-20 18:57:48 +02:00
|
|
|
(*block)->flush(); //TODO Ideally, flush shouldn't be necessary here.
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block2 = blockStore->tryCreate(this->key, cpputils::Data(1024));
|
2015-07-20 18:57:48 +02:00
|
|
|
EXPECT_NE(boost::none, block);
|
|
|
|
EXPECT_EQ(boost::none, block2);
|
2014-12-09 17:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TYPED_TEST_P(BlockStoreWithRandomKeysTest, CreateTwoBlocksWithSameKeyAndDifferentSize) {
|
|
|
|
auto blockStore = this->fixture.createBlockStore();
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block = blockStore->tryCreate(this->key, cpputils::Data(1024));
|
2015-07-20 18:57:48 +02:00
|
|
|
(*block)->flush(); //TODO Ideally, flush shouldn't be necessary here.
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block2 = blockStore->tryCreate(this->key, cpputils::Data(4096));
|
2015-07-20 18:57:48 +02:00
|
|
|
EXPECT_NE(boost::none, block);
|
|
|
|
EXPECT_EQ(boost::none, block2);
|
2014-12-09 17:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TYPED_TEST_P(BlockStoreWithRandomKeysTest, CreateTwoBlocksWithSameKeyAndFirstNullSize) {
|
|
|
|
auto blockStore = this->fixture.createBlockStore();
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block = blockStore->tryCreate(this->key, cpputils::Data(0));
|
2015-07-20 18:57:48 +02:00
|
|
|
(*block)->flush(); //TODO Ideally, flush shouldn't be necessary here.
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block2 = blockStore->tryCreate(this->key, cpputils::Data(1024));
|
2015-07-20 18:57:48 +02:00
|
|
|
EXPECT_NE(boost::none, block);
|
|
|
|
EXPECT_EQ(boost::none, block2);
|
2014-12-09 17:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TYPED_TEST_P(BlockStoreWithRandomKeysTest, CreateTwoBlocksWithSameKeyAndSecondNullSize) {
|
|
|
|
auto blockStore = this->fixture.createBlockStore();
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block = blockStore->tryCreate(this->key, cpputils::Data(1024));
|
2015-07-20 18:57:48 +02:00
|
|
|
(*block)->flush(); //TODO Ideally, flush shouldn't be necessary here.
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block2 = blockStore->tryCreate(this->key, cpputils::Data(0));
|
2015-07-20 18:57:48 +02:00
|
|
|
EXPECT_NE(boost::none, block);
|
|
|
|
EXPECT_EQ(boost::none, block2);
|
2014-12-09 17:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
TYPED_TEST_P(BlockStoreWithRandomKeysTest, CreateTwoBlocksWithSameKeyAndBothNullSize) {
|
|
|
|
auto blockStore = this->fixture.createBlockStore();
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block = blockStore->tryCreate(this->key, cpputils::Data(0));
|
2015-07-20 18:57:48 +02:00
|
|
|
(*block)->flush(); //TODO Ideally, flush shouldn't be necessary here.
|
2015-04-25 02:48:41 +02:00
|
|
|
auto block2 = blockStore->tryCreate(this->key, cpputils::Data(0));
|
2015-07-20 18:57:48 +02:00
|
|
|
EXPECT_NE(boost::none, block);
|
|
|
|
EXPECT_EQ(boost::none, block2);
|
2014-12-09 17:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
REGISTER_TYPED_TEST_CASE_P(BlockStoreWithRandomKeysTest,
|
|
|
|
CreateTwoBlocksWithSameKeyAndSameSize,
|
|
|
|
CreateTwoBlocksWithSameKeyAndDifferentSize,
|
|
|
|
CreateTwoBlocksWithSameKeyAndFirstNullSize,
|
|
|
|
CreateTwoBlocksWithSameKeyAndSecondNullSize,
|
|
|
|
CreateTwoBlocksWithSameKeyAndBothNullSize
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|