diff --git a/src/blockstore/utils/BlockStoreUtils.cpp b/src/blockstore/utils/BlockStoreUtils.cpp new file mode 100644 index 00000000..cfd4e247 --- /dev/null +++ b/src/blockstore/utils/BlockStoreUtils.cpp @@ -0,0 +1,18 @@ +#include +#include "blockstore/interface/BlockStore.h" + +#include + +using std::unique_ptr; + +namespace blockstore { +namespace utils { + +BlockWithKey copyToNewBlock(BlockStore *blockStore, const Block &block) { + auto newBlock = blockStore->create(block.size()); + std::memcpy(newBlock.block->data(), block.data(), block.size()); + return newBlock; +} + +} +} diff --git a/src/blockstore/utils/BlockStoreUtils.h b/src/blockstore/utils/BlockStoreUtils.h new file mode 100644 index 00000000..5341cecd --- /dev/null +++ b/src/blockstore/utils/BlockStoreUtils.h @@ -0,0 +1,18 @@ +#pragma once +#ifndef BLOCKSTORE_UTILS_BLOCKSTOREUTILS_H_ +#define BLOCKSTORE_UTILS_BLOCKSTOREUTILS_H_ + +#include +#include "BlockWithKey.h" + +namespace blockstore { +class BlockStore; +class Block; +namespace utils { + +BlockWithKey copyToNewBlock(BlockStore *blockStore, const Block &block); + +} +} + +#endif diff --git a/src/blockstore/utils/CMakeLists.txt b/src/blockstore/utils/CMakeLists.txt index b68f1941..1a62b338 100644 --- a/src/blockstore/utils/CMakeLists.txt +++ b/src/blockstore/utils/CMakeLists.txt @@ -1,3 +1,3 @@ -add_library(blockstore_utils Data.cpp Key.cpp FileDoesntExistException.cpp) +add_library(blockstore_utils Data.cpp Key.cpp FileDoesntExistException.cpp BlockStoreUtils.cpp) target_link_libraries(blockstore_utils cryptopp) diff --git a/src/test/blockstore/utils/BlockStoreUtilsTest.cpp b/src/test/blockstore/utils/BlockStoreUtilsTest.cpp new file mode 100644 index 00000000..b25837fc --- /dev/null +++ b/src/test/blockstore/utils/BlockStoreUtilsTest.cpp @@ -0,0 +1,67 @@ +#include "gtest/gtest.h" + +#include "blockstore/implementations/testfake/FakeBlockStore.h" +#include "test/testutils/DataBlockFixture.h" +#include "blockstore/utils/BlockStoreUtils.h" + +#include + +using ::testing::Test; +using ::testing::WithParamInterface; +using ::testing::Values; + +using std::make_unique; +using std::unique_ptr; + +using namespace blockstore; +using namespace blockstore::utils; + +using blockstore::testfake::FakeBlockStore; + +class BlockStoreUtilsTest: public Test { +public: + unsigned int SIZE = 1024 * 1024; + BlockStoreUtilsTest(): + ZEROES(SIZE), + dataFixture(SIZE), + blockStore(make_unique()) { + ZEROES.FillWithZeroes(); + } + + Data ZEROES; + DataBlockFixture dataFixture; + unique_ptr blockStore; +}; + +TEST_F(BlockStoreUtilsTest, CopyEmptyBlock) { + auto block = blockStore->create(0); + auto block2 = copyToNewBlock(blockStore.get(), *block.block); + + EXPECT_EQ(0u, block2.block->size()); +} + +TEST_F(BlockStoreUtilsTest, CopyZeroBlock) { + auto block = blockStore->create(SIZE).block; + auto block2 = copyToNewBlock(blockStore.get(), *block).block; + + EXPECT_EQ(SIZE, block2->size()); + EXPECT_EQ(0, std::memcmp(ZEROES.data(), block2->data(), SIZE)); +} + +TEST_F(BlockStoreUtilsTest, CopyDataBlock) { + auto block = blockStore->create(SIZE).block; + std::memcpy(block->data(), dataFixture.data(), SIZE); + auto block2 = copyToNewBlock(blockStore.get(), *block).block; + + EXPECT_EQ(SIZE, block2->size()); + EXPECT_EQ(0, std::memcmp(dataFixture.data(), block2->data(), SIZE)); +} + +TEST_F(BlockStoreUtilsTest, OriginalBlockUnchanged) { + auto block = blockStore->create(SIZE).block; + std::memcpy(block->data(), dataFixture.data(), SIZE); + auto block2 = copyToNewBlock(blockStore.get(), *block).block; + + EXPECT_EQ(SIZE, block->size()); + EXPECT_EQ(0, std::memcmp(dataFixture.data(), block->data(), SIZE)); +}