Added Blob::flush() and test cases for it
This commit is contained in:
parent
a699350e19
commit
a34b5a316f
@ -29,6 +29,7 @@ OnDiskBlob::OnDiskBlob(const bf::path &filepath, Data &&data)
|
||||
}
|
||||
|
||||
OnDiskBlob::~OnDiskBlob() {
|
||||
_storeToDisk();
|
||||
}
|
||||
|
||||
void *OnDiskBlob::data() {
|
||||
@ -71,5 +72,9 @@ void OnDiskBlob::_storeToDisk() const {
|
||||
_data.StoreToFile(_filepath);
|
||||
}
|
||||
|
||||
void OnDiskBlob::flush() {
|
||||
_storeToDisk();
|
||||
}
|
||||
|
||||
} /* namespace ondisk */
|
||||
} /* namespace blobstore */
|
||||
|
@ -24,6 +24,8 @@ public:
|
||||
void *data() override;
|
||||
const void *data() const override;
|
||||
|
||||
void flush() override;
|
||||
|
||||
size_t size() const override;
|
||||
|
||||
private:
|
||||
|
@ -13,6 +13,8 @@ public:
|
||||
virtual void *data() = 0;
|
||||
virtual const void *data() const = 0;
|
||||
|
||||
virtual void flush() = 0;
|
||||
|
||||
virtual size_t size() const = 0;
|
||||
};
|
||||
|
||||
|
@ -53,3 +53,5 @@ TEST_P(OnDiskBlobCreateSizeTest, InMemorySizeIsCorrect) {
|
||||
EXPECT_EQ(GetParam(), blob->size());
|
||||
}
|
||||
|
||||
//TODO Test File is zeroed out
|
||||
//TODO Test in-memory is zeroed out
|
||||
|
103
src/test/blobstore/ondisk/OnDiskBlobFlushTest.cpp
Normal file
103
src/test/blobstore/ondisk/OnDiskBlobFlushTest.cpp
Normal file
@ -0,0 +1,103 @@
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "test/testutils/TempFile.h"
|
||||
#include "test/testutils/VirtualTestFile.h"
|
||||
|
||||
#include "blobstore/implementations/ondisk/OnDiskBlob.h"
|
||||
#include "blobstore/implementations/ondisk/FileAlreadyExistsException.h"
|
||||
|
||||
using ::testing::Test;
|
||||
using ::testing::WithParamInterface;
|
||||
using ::testing::Values;
|
||||
|
||||
using std::unique_ptr;
|
||||
|
||||
using namespace blobstore::ondisk;
|
||||
|
||||
namespace bf = boost::filesystem;
|
||||
|
||||
class OnDiskBlobFlushTest: public Test, public WithParamInterface<size_t> {
|
||||
public:
|
||||
OnDiskBlobFlushTest()
|
||||
// Don't create the temp file yet (therefore pass false to the TempFile constructor)
|
||||
: file(false), randomData(GetParam()) {
|
||||
}
|
||||
TempFile file;
|
||||
|
||||
VirtualTestFile randomData;
|
||||
|
||||
unique_ptr<OnDiskBlob> CreateBlobAndLoadItFromDisk() {
|
||||
{
|
||||
auto blob = OnDiskBlob::CreateOnDisk(file.path(), randomData.size());
|
||||
}
|
||||
return OnDiskBlob::LoadFromDisk(file.path());
|
||||
}
|
||||
|
||||
unique_ptr<OnDiskBlob> CreateBlob() {
|
||||
return OnDiskBlob::CreateOnDisk(file.path(), randomData.size());
|
||||
}
|
||||
|
||||
void WriteDataToBlob(const unique_ptr<OnDiskBlob> &blob) {
|
||||
std::memcpy(blob->data(), randomData.data(), randomData.size());
|
||||
}
|
||||
|
||||
void EXPECT_BLOB_DATA_CORRECT(const unique_ptr<OnDiskBlob> &blob) {
|
||||
EXPECT_EQ(randomData.size(), blob->size());
|
||||
EXPECT_EQ(0, std::memcmp(randomData.data(), blob->data(), randomData.size()));
|
||||
}
|
||||
|
||||
void EXPECT_STORED_FILE_DATA_CORRECT() {
|
||||
Data actual = Data::LoadFromFile(file.path());
|
||||
EXPECT_EQ(randomData.size(), actual.size());
|
||||
EXPECT_EQ(0, std::memcmp(randomData.data(), actual.data(), randomData.size()));
|
||||
}
|
||||
};
|
||||
INSTANTIATE_TEST_CASE_P(OnDiskBlobFlushTest, OnDiskBlobFlushTest, Values((size_t)0, (size_t)1, (size_t)1024, (size_t)4096, (size_t)10*1024*1024));
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterCreate_FlushingDoesntChangeBlob) {
|
||||
auto blob = CreateBlob();
|
||||
WriteDataToBlob(blob);
|
||||
blob->flush();
|
||||
|
||||
EXPECT_BLOB_DATA_CORRECT(blob);
|
||||
}
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterLoad_FlushingDoesntChangeBlob) {
|
||||
auto blob = CreateBlobAndLoadItFromDisk();
|
||||
WriteDataToBlob(blob);
|
||||
blob->flush();
|
||||
|
||||
EXPECT_BLOB_DATA_CORRECT(blob);
|
||||
}
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterCreate_FlushingWritesCorrectData) {
|
||||
auto blob = CreateBlob();
|
||||
WriteDataToBlob(blob);
|
||||
blob->flush();
|
||||
|
||||
EXPECT_STORED_FILE_DATA_CORRECT();
|
||||
}
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterLoad_FlushingWritesCorrectData) {
|
||||
auto blob = CreateBlobAndLoadItFromDisk();
|
||||
WriteDataToBlob(blob);
|
||||
blob->flush();
|
||||
|
||||
EXPECT_STORED_FILE_DATA_CORRECT();
|
||||
}
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterCreate_DestructorFlushes) {
|
||||
{
|
||||
auto blob = CreateBlob();
|
||||
WriteDataToBlob(blob);
|
||||
}
|
||||
EXPECT_STORED_FILE_DATA_CORRECT();
|
||||
}
|
||||
|
||||
TEST_P(OnDiskBlobFlushTest, AfterLoad_DestructorFlushes) {
|
||||
{
|
||||
auto blob = CreateBlobAndLoadItFromDisk();
|
||||
WriteDataToBlob(blob);
|
||||
}
|
||||
EXPECT_STORED_FILE_DATA_CORRECT();
|
||||
}
|
@ -39,3 +39,7 @@ TEST_P(OnDiskBlobLoadSizeTest, FileSizeIsCorrect) {
|
||||
|
||||
EXPECT_EQ(GetParam(), blob->size());
|
||||
}
|
||||
|
||||
//TODO Load and compare actual data
|
||||
//TODO Test file doesn't exist
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user