Skip to content

Commit

Permalink
test: unit test cases for disabling librbd journal by policy
Browse files Browse the repository at this point in the history
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
  • Loading branch information
Jason Dillaman committed Aug 2, 2016
1 parent 2e5076e commit 4a256f5
Show file tree
Hide file tree
Showing 7 changed files with 508 additions and 39 deletions.
46 changes: 24 additions & 22 deletions src/test/librbd/CMakeLists.txt
Expand Up @@ -22,30 +22,32 @@ set_target_properties(rbd_test_mock PROPERTIES COMPILE_FLAGS
# unittest_librbd
# doesn't use add_ceph_test because it is called by run-rbd-unit-tests.sh
set(unittest_librbd_srcs
test_ConsistencyGroups.cc
test_ConsistencyGroups.cc
test_main.cc
test_mock_fixture.cc
test_mock_ExclusiveLock.cc
test_mock_Journal.cc
test_mock_ObjectWatcher.cc
exclusive_lock/test_mock_AcquireRequest.cc
exclusive_lock/test_mock_ReleaseRequest.cc
test_mock_fixture.cc
test_mock_AioImageRequest.cc
test_mock_ExclusiveLock.cc
test_mock_Journal.cc
test_mock_ObjectWatcher.cc
exclusive_lock/test_mock_AcquireRequest.cc
exclusive_lock/test_mock_ReleaseRequest.cc
image/test_mock_RefreshRequest.cc
journal/test_mock_Replay.cc
object_map/test_mock_InvalidateRequest.cc
object_map/test_mock_LockRequest.cc
object_map/test_mock_RefreshRequest.cc
object_map/test_mock_ResizeRequest.cc
object_map/test_mock_SnapshotCreateRequest.cc
object_map/test_mock_SnapshotRemoveRequest.cc
object_map/test_mock_SnapshotRollbackRequest.cc
object_map/test_mock_UnlockRequest.cc
object_map/test_mock_UpdateRequest.cc
operation/test_mock_ResizeRequest.cc
operation/test_mock_SnapshotCreateRequest.cc
operation/test_mock_SnapshotProtectRequest.cc
operation/test_mock_SnapshotRemoveRequest.cc
operation/test_mock_SnapshotRollbackRequest.cc
journal/test_mock_Replay.cc
object_map/test_mock_InvalidateRequest.cc
object_map/test_mock_LockRequest.cc
object_map/test_mock_RefreshRequest.cc
object_map/test_mock_ResizeRequest.cc
object_map/test_mock_SnapshotCreateRequest.cc
object_map/test_mock_SnapshotRemoveRequest.cc
object_map/test_mock_SnapshotRollbackRequest.cc
object_map/test_mock_UnlockRequest.cc
object_map/test_mock_UpdateRequest.cc
operation/test_mock_Request.cc
operation/test_mock_ResizeRequest.cc
operation/test_mock_SnapshotCreateRequest.cc
operation/test_mock_SnapshotProtectRequest.cc
operation/test_mock_SnapshotRemoveRequest.cc
operation/test_mock_SnapshotRollbackRequest.cc
operation/test_mock_SnapshotUnprotectRequest.cc
)
add_executable(unittest_librbd
Expand Down
28 changes: 14 additions & 14 deletions src/test/librbd/mock/MockImageCtx.h
Expand Up @@ -54,13 +54,13 @@ struct MockImageCtx {
lockers(image_ctx.lockers),
exclusive_locked(image_ctx.exclusive_locked),
lock_tag(image_ctx.lock_tag),
owner_lock("owner_lock"),
md_lock("md_lock"),
cache_lock("cache_lock"),
snap_lock("snap_lock"),
parent_lock("parent_lock"),
object_map_lock("object_map_lock"),
async_ops_lock("async_ops_lock"),
owner_lock(image_ctx.owner_lock),
md_lock(image_ctx.md_lock),
cache_lock(image_ctx.cache_lock),
snap_lock(image_ctx.snap_lock),
parent_lock(image_ctx.parent_lock),
object_map_lock(image_ctx.object_map_lock),
async_ops_lock(image_ctx.async_ops_lock),
order(image_ctx.order),
size(image_ctx.size),
features(image_ctx.features),
Expand Down Expand Up @@ -202,13 +202,13 @@ struct MockImageCtx {
librados::IoCtx md_ctx;
librados::IoCtx data_ctx;

RWLock owner_lock;
RWLock md_lock;
Mutex cache_lock;
RWLock snap_lock;
RWLock parent_lock;
RWLock object_map_lock;
Mutex async_ops_lock;
RWLock &owner_lock;
RWLock &md_lock;
Mutex &cache_lock;
RWLock &snap_lock;
RWLock &parent_lock;
RWLock &object_map_lock;
Mutex &async_ops_lock;

uint8_t order;
uint64_t size;
Expand Down
176 changes: 176 additions & 0 deletions src/test/librbd/operation/test_mock_Request.cc
@@ -0,0 +1,176 @@
// -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab

#include "test/librbd/test_mock_fixture.h"
#include "test/librbd/test_support.h"
#include "test/librbd/mock/MockImageCtx.h"
#include "test/librbd/mock/MockJournal.h"
#include "librbd/AsyncRequest.h"
#include "librbd/operation/Request.h"

namespace librbd {
namespace {

struct MockTestImageCtx : public MockImageCtx {
MockTestImageCtx(ImageCtx &image_ctx) : MockImageCtx(image_ctx) {
}
};

} // anonymous namespace

template <>
struct AsyncRequest<librbd::MockTestImageCtx> {
librbd::MockTestImageCtx &m_image_ctx;
Context *m_on_finish;

AsyncRequest(librbd::MockTestImageCtx &image_ctx, Context *on_finish)
: m_image_ctx(image_ctx), m_on_finish(on_finish) {
}
virtual ~AsyncRequest() {
}

virtual void finish(int r) {
m_on_finish->complete(r);
}
virtual void finish_and_destroy(int r) {
finish(r);
delete this;
}
};

} // namespace librbd

#include "librbd/operation/Request.cc"
template class librbd::operation::Request<librbd::MockTestImageCtx>;

namespace librbd {
namespace journal {

std::ostream& operator<<(std::ostream& os, const Event&) {
return os;
}

} // namespace journal

namespace operation {

using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::Return;

struct MockRequest : public Request<librbd::MockTestImageCtx> {
MockRequest(librbd::MockTestImageCtx &image_ctx, Context *on_finish,
uint64_t journal_op_tid)
: Request<librbd::MockTestImageCtx>(image_ctx, on_finish, journal_op_tid) {
}

void complete(int r) {
finish_and_destroy(r);
}

void send_op_impl(int r) {
bool appending = append_op_event<
MockRequest, &MockRequest::handle_send>(this);
if (!appending) {
complete(r);
}
}
MOCK_METHOD1(should_complete, bool(int));
MOCK_METHOD0(send_op, void());
MOCK_METHOD1(handle_send, Context*(int*));
MOCK_CONST_METHOD0(can_affect_io, bool());
MOCK_CONST_METHOD1(create_event, journal::Event(uint64_t));
};

struct TestMockOperationRequest : public TestMockFixture {
void expect_can_affect_io(MockRequest &mock_request, bool can_affect) {
EXPECT_CALL(mock_request, can_affect_io())
.WillOnce(Return(can_affect));
}

void expect_is_journal_replaying(MockJournal &mock_journal, bool replaying) {
EXPECT_CALL(mock_journal, is_journal_replaying())
.WillOnce(Return(replaying));
}

void expect_is_journal_appending(MockJournal &mock_journal, bool appending) {
EXPECT_CALL(mock_journal, is_journal_appending())
.WillOnce(Return(appending));
}

void expect_send_op(MockRequest &mock_request, int r) {
EXPECT_CALL(mock_request, send_op())
.WillOnce(Invoke([&mock_request, r]() {
mock_request.complete(r);
}));
}

void expect_send_op_affects_io(MockImageCtx &mock_image_ctx,
MockRequest &mock_request, int r) {
EXPECT_CALL(mock_request, send_op())
.WillOnce(Invoke([&mock_image_ctx, &mock_request, r]() {
mock_image_ctx.image_ctx->op_work_queue->queue(
new FunctionContext([&mock_request, r](int _) {
mock_request.send_op_impl(r);
}), 0);
}));
}

};

TEST_F(TestMockOperationRequest, SendJournalDisabled) {
REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);

librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));

MockTestImageCtx mock_image_ctx(*ictx);
MockJournal mock_journal;
mock_image_ctx.journal = &mock_journal;

C_SaferCond ctx;
MockRequest *mock_request = new MockRequest(mock_image_ctx, &ctx, 0);

InSequence seq;
expect_can_affect_io(*mock_request, false);
expect_is_journal_appending(mock_journal, false);
expect_send_op(*mock_request, 0);

{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
mock_request->send();
}

ASSERT_EQ(0, ctx.wait());
}

TEST_F(TestMockOperationRequest, SendAffectsIOJournalDisabled) {
REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);

librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));

MockTestImageCtx mock_image_ctx(*ictx);
MockJournal mock_journal;
mock_image_ctx.journal = &mock_journal;

C_SaferCond ctx;
MockRequest *mock_request = new MockRequest(mock_image_ctx, &ctx, 0);

InSequence seq;
expect_can_affect_io(*mock_request, true);
expect_send_op_affects_io(mock_image_ctx, *mock_request, 0);
expect_can_affect_io(*mock_request, true);
expect_is_journal_replaying(mock_journal, false);
expect_is_journal_appending(mock_journal, false);

{
RWLock::RLocker owner_locker(mock_image_ctx.owner_lock);
mock_request->send();
}

ASSERT_EQ(0, ctx.wait());
}

} // namespace operation
} // namespace librbd

0 comments on commit 4a256f5

Please sign in to comment.