Added Blob::flush() and test cases for it

This commit is contained in:
Sebastian Messmer 2014-12-05 11:22:44 +01:00
parent a699350e19
commit a34b5a316f
6 changed files with 118 additions and 0 deletions

View File

@ -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 */

View File

@ -24,6 +24,8 @@ public:
void *data() override;
const void *data() const override;
void flush() override;
size_t size() const override;
private:

View File

@ -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;
};

View File

@ -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

View 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();
}

View File

@ -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