Implemented copying of blocks
This commit is contained in:
parent
3e9e46f706
commit
f4398dfeec
18
src/blockstore/utils/BlockStoreUtils.cpp
Normal file
18
src/blockstore/utils/BlockStoreUtils.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include <blockstore/utils/BlockStoreUtils.h>
|
||||
#include "blockstore/interface/BlockStore.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
18
src/blockstore/utils/BlockStoreUtils.h
Normal file
18
src/blockstore/utils/BlockStoreUtils.h
Normal file
@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
#ifndef BLOCKSTORE_UTILS_BLOCKSTOREUTILS_H_
|
||||
#define BLOCKSTORE_UTILS_BLOCKSTOREUTILS_H_
|
||||
|
||||
#include <memory>
|
||||
#include "BlockWithKey.h"
|
||||
|
||||
namespace blockstore {
|
||||
class BlockStore;
|
||||
class Block;
|
||||
namespace utils {
|
||||
|
||||
BlockWithKey copyToNewBlock(BlockStore *blockStore, const Block &block);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@ -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)
|
||||
|
67
src/test/blockstore/utils/BlockStoreUtilsTest.cpp
Normal file
67
src/test/blockstore/utils/BlockStoreUtilsTest.cpp
Normal file
@ -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 <memory>
|
||||
|
||||
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<FakeBlockStore>()) {
|
||||
ZEROES.FillWithZeroes();
|
||||
}
|
||||
|
||||
Data ZEROES;
|
||||
DataBlockFixture dataFixture;
|
||||
unique_ptr<BlockStore> 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));
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user