diff --git a/src/test/Makefile-client.am b/src/test/Makefile-client.am index 243c2b069d7ed..b5c5f0d755c92 100644 --- a/src/test/Makefile-client.am +++ b/src/test/Makefile-client.am @@ -317,6 +317,11 @@ noinst_HEADERS += \ test/librados_test_stub/TestIoCtxImpl.h noinst_LTLIBRARIES += librados_test_stub.la +libjournal_test_mock_la_SOURCES = \ + test/journal/mock/MockJournaler.cc +libjournal_test_mock_la_CXXFLAGS = $(UNITTEST_CXXFLAGS) +noinst_LTLIBRARIES += libjournal_test_mock.la + unittest_journal_SOURCES = \ test/journal/test_main.cc \ test/journal/test_Entry.cc \ @@ -401,7 +406,7 @@ unittest_librbd_SOURCES = \ test/librbd/operation/test_mock_SnapshotUnprotectRequest.cc unittest_librbd_CXXFLAGS = $(UNITTEST_CXXFLAGS) -DTEST_LIBRBD_INTERNALS unittest_librbd_LDADD = \ - librbd_test.la librbd_test_mock.la \ + librbd_test.la libjournal_test_mock.la librbd_test_mock.la \ librbd_api.la librbd_internal.la $(LIBRBD_TYPES) \ libcls_rbd_client.la libcls_lock_client.la \ libjournal.la libcls_journal_client.la \ @@ -457,8 +462,7 @@ librbd_mirror_test_la_SOURCES = \ noinst_HEADERS += \ test/rbd_mirror/test_fixture.h \ - test/rbd_mirror/test_mock_fixture.h \ - test/rbd_mirror/mock/MockJournaler.h + test/rbd_mirror/test_mock_fixture.h librbd_mirror_test_la_CXXFLAGS = $(UNITTEST_CXXFLAGS) noinst_LTLIBRARIES += librbd_mirror_test.la @@ -472,11 +476,11 @@ unittest_rbd_mirror_SOURCES = \ test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc \ test/rbd_mirror/image_sync/test_mock_SnapshotCopyRequest.cc \ test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc \ - test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc \ - test/rbd_mirror/mock/MockJournaler.cc + test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc unittest_rbd_mirror_CXXFLAGS = $(UNITTEST_CXXFLAGS) unittest_rbd_mirror_LDADD = \ librbd_mirror_test.la \ + libjournal_test_mock.la \ librbd_test_mock.la \ librados_test_stub.la \ librbd_mirror_internal.la \ diff --git a/src/test/rbd_mirror/mock/MockJournaler.cc b/src/test/journal/mock/MockJournaler.cc similarity index 88% rename from src/test/rbd_mirror/mock/MockJournaler.cc rename to src/test/journal/mock/MockJournaler.cc index 047dd2f410f2d..90649440dbe6a 100644 --- a/src/test/rbd_mirror/mock/MockJournaler.cc +++ b/src/test/journal/mock/MockJournaler.cc @@ -5,6 +5,7 @@ namespace journal { +MockFuture *MockFuture::s_instance = nullptr; MockReplayEntry *MockReplayEntry::s_instance = nullptr; MockJournaler *MockJournaler::s_instance = nullptr; diff --git a/src/test/journal/mock/MockJournaler.h b/src/test/journal/mock/MockJournaler.h new file mode 100644 index 0000000000000..eece17bb97b36 --- /dev/null +++ b/src/test/journal/mock/MockJournaler.h @@ -0,0 +1,262 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef TEST_RBD_MIRROR_MOCK_JOURNALER_H +#define TEST_RBD_MIRROR_MOCK_JOURNALER_H + +#include +#include "include/int_types.h" +#include "include/rados/librados.hpp" +#include "cls/journal/cls_journal_types.h" +#include "journal/Journaler.h" +#include +#include + +class Context; +class ContextWQ; +class Mutex; +class SafeTimer; + +namespace journal { + +struct ReplayHandler; + +struct MockFuture { + static MockFuture *s_instance; + static MockFuture &get_instance() { + assert(s_instance != nullptr); + return *s_instance; + } + + MockFuture() { + s_instance = this; + } + + MOCK_CONST_METHOD0(is_valid, bool()); + MOCK_METHOD1(flush, void(Context *)); + MOCK_METHOD1(wait, void(Context *)); +}; + +struct MockFutureProxy { + bool is_valid() const { + return MockFuture::get_instance().is_valid(); + } + + void flush(Context *on_safe) { + MockFuture::get_instance().flush(on_safe); + } + + void wait(Context *on_safe) { + MockFuture::get_instance().wait(on_safe); + } +}; + +struct MockReplayEntry { + static MockReplayEntry *s_instance; + static MockReplayEntry &get_instance() { + assert(s_instance != nullptr); + return *s_instance; + } + + MockReplayEntry() { + s_instance = this; + } + + MOCK_CONST_METHOD0(get_commit_tid, uint64_t()); + MOCK_METHOD0(get_data, bufferlist()); +}; + +struct MockReplayEntryProxy { + uint64_t get_commit_tid() const { + return MockReplayEntry::get_instance().get_commit_tid(); + } + + bufferlist get_data() { + return MockReplayEntry::get_instance().get_data(); + } +}; + +struct MockJournaler { + static MockJournaler *s_instance; + static MockJournaler &get_instance() { + assert(s_instance != nullptr); + return *s_instance; + } + + MockJournaler() { + s_instance = this; + } + + MOCK_METHOD0(construct, void()); + + MOCK_METHOD1(init, void(Context *)); + MOCK_METHOD0(shut_down, void()); + MOCK_CONST_METHOD0(is_initialized, bool()); + + MOCK_METHOD3(get_metadata, void(uint8_t *order, uint8_t *splay_width, + int64_t *pool_id)); + MOCK_METHOD4(get_mutable_metadata, void(uint64_t*, uint64_t*, + std::set *, + Context*)); + + MOCK_METHOD2(register_client, void(const bufferlist &, Context *)); + MOCK_METHOD3(get_client, void(const std::string &, cls::journal::Client *, + Context *)); + MOCK_METHOD2(get_cached_client, int(const std::string&, cls::journal::Client*)); + MOCK_METHOD2(update_client, void(const bufferlist &, Context *)); + + MOCK_METHOD3(get_tag, void(uint64_t, cls::journal::Tag *, Context *)); + MOCK_METHOD3(get_tags, void(uint64_t, journal::Journaler::Tags*, Context*)); + + MOCK_METHOD1(start_replay, void(::journal::ReplayHandler *replay_handler)); + MOCK_METHOD2(start_live_replay, void(ReplayHandler *, double)); + MOCK_METHOD1(try_pop_front, bool(MockReplayEntryProxy *)); + MOCK_METHOD2(try_pop_front, bool(MockReplayEntryProxy *, uint64_t *)); + MOCK_METHOD0(stop_replay, void()); + + MOCK_METHOD3(start_append, void(int flush_interval, uint64_t flush_bytes, + double flush_age)); + MOCK_METHOD2(append, MockFutureProxy(uint64_t tag_id, + const bufferlist &bl)); + MOCK_METHOD1(flush, void(Context *on_safe)); + MOCK_METHOD1(stop_append, void(Context *on_safe)); + + MOCK_METHOD1(committed, void(const MockReplayEntryProxy &)); + MOCK_METHOD1(committed, void(const MockFutureProxy &future)); + MOCK_METHOD1(flush_commit_position, void(Context*)); + +}; + +struct MockJournalerProxy { + template + MockJournalerProxy(IoCtxT &header_ioctx, const std::string &, + const std::string &, double) { + MockJournaler::get_instance().construct(); + } + + MockJournalerProxy(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock, + librados::IoCtx &header_ioctx, const std::string &journal_id, + const std::string &client_id, double commit_interval) { + MockJournaler::get_instance().construct(); + } + + int exists(bool *header_exists) const { + return -EINVAL; + } + int create(uint8_t order, uint8_t splay_width, int64_t pool_id) { + return -EINVAL; + } + int remove(bool force) { + return -EINVAL; + } + int register_client(const bufferlist &data) { + return -EINVAL; + } + void allocate_tag(uint64_t, const bufferlist &, + cls::journal::Tag*, Context *on_finish) { + on_finish->complete(-EINVAL); + } + + void init(Context *on_finish) { + MockJournaler::get_instance().init(on_finish); + } + void shut_down() { + MockJournaler::get_instance().shut_down(); + } + bool is_initialized() const { + return MockJournaler::get_instance().is_initialized(); + } + + void get_metadata(uint8_t *order, uint8_t *splay_width, int64_t *pool_id) { + MockJournaler::get_instance().get_metadata(order, splay_width, pool_id); + } + + void get_mutable_metadata(uint64_t *min, uint64_t *active, + std::set *clients, + Context *on_finish) { + MockJournaler::get_instance().get_mutable_metadata(min, active, clients, + on_finish); + } + + void register_client(const bufferlist &data, Context *on_finish) { + MockJournaler::get_instance().register_client(data, on_finish); + } + + void get_client(const std::string &client_id, cls::journal::Client *client, + Context *on_finish) { + MockJournaler::get_instance().get_client(client_id, client, on_finish); + } + + int get_cached_client(const std::string& client_id, + cls::journal::Client* client) { + return MockJournaler::get_instance().get_cached_client(client_id, client); + } + + void update_client(const bufferlist &client_data, Context *on_finish) { + MockJournaler::get_instance().update_client(client_data, on_finish); + } + + void get_tag(uint64_t tag_tid, cls::journal::Tag *tag, Context *on_finish) { + MockJournaler::get_instance().get_tag(tag_tid, tag, on_finish); + } + + void get_tags(uint64_t tag_class, journal::Journaler::Tags *tags, + Context *on_finish) { + MockJournaler::get_instance().get_tags(tag_class, tags, on_finish); + } + + void start_replay(::journal::ReplayHandler *replay_handler) { + MockJournaler::get_instance().start_replay(replay_handler); + } + + void start_live_replay(ReplayHandler *handler, double interval) { + MockJournaler::get_instance().start_live_replay(handler, interval); + } + + bool try_pop_front(MockReplayEntryProxy *replay_entry) { + return MockJournaler::get_instance().try_pop_front(replay_entry); + } + + bool try_pop_front(MockReplayEntryProxy *entry, uint64_t *tag_tid) { + return MockJournaler::get_instance().try_pop_front(entry, tag_tid); + } + + void stop_replay() { + MockJournaler::get_instance().stop_replay(); + } + + void start_append(int flush_interval, uint64_t flush_bytes, double flush_age) { + MockJournaler::get_instance().start_append(flush_interval, flush_bytes, + flush_age); + } + + MockFutureProxy append(uint64_t tag_id, const bufferlist &bl) { + return MockJournaler::get_instance().append(tag_id, bl); + } + + void flush(Context *on_safe) { + MockJournaler::get_instance().flush(on_safe); + } + + void stop_append(Context *on_safe) { + MockJournaler::get_instance().stop_append(on_safe); + } + + void committed(const MockReplayEntryProxy &entry) { + MockJournaler::get_instance().committed(entry); + } + + void committed(const MockFutureProxy &future) { + MockJournaler::get_instance().committed(future); + } + + void flush_commit_position(Context *on_finish) { + MockJournaler::get_instance().flush_commit_position(on_finish); + } +}; + +std::ostream &operator<<(std::ostream &os, const MockJournalerProxy &); + +} // namespace journal + +#endif // TEST_RBD_MIRROR_MOCK_JOURNALER_H diff --git a/src/test/librbd/test_mock_Journal.cc b/src/test/librbd/test_mock_Journal.cc index 9ebea8f3e7079..66698187c704e 100644 --- a/src/test/librbd/test_mock_Journal.cc +++ b/src/test/librbd/test_mock_Journal.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "test/librbd/test_mock_fixture.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librbd/test_support.h" #include "test/librbd/mock/MockImageCtx.h" #include "common/Cond.h" @@ -19,199 +20,6 @@ #include #include -namespace journal { - -struct MockFuture { - static MockFuture *s_instance; - static MockFuture &get_instance() { - assert(s_instance != nullptr); - return *s_instance; - } - - MockFuture() { - s_instance = this; - } - - MOCK_CONST_METHOD0(is_valid, bool()); - MOCK_METHOD1(flush, void(Context *)); - MOCK_METHOD1(wait, void(Context *)); -}; - -struct MockFutureProxy { - bool is_valid() const { - return MockFuture::get_instance().is_valid(); - } - - void flush(Context *on_safe) { - MockFuture::get_instance().flush(on_safe); - } - - void wait(Context *on_safe) { - MockFuture::get_instance().wait(on_safe); - } -}; - -struct MockReplayEntry { - static MockReplayEntry *s_instance; - static MockReplayEntry &get_instance() { - assert(s_instance != nullptr); - return *s_instance; - } - - MockReplayEntry() { - s_instance = this; - } - - MOCK_METHOD0(get_data, bufferlist()); -}; - -struct MockReplayEntryProxy { - bufferlist get_data() { - return MockReplayEntry::get_instance().get_data(); - } -}; - -struct MockJournaler { - static MockJournaler *s_instance; - static MockJournaler &get_instance() { - assert(s_instance != nullptr); - return *s_instance; - } - - MockJournaler() { - s_instance = this; - } - - MOCK_METHOD0(construct, void()); - - MOCK_METHOD3(get_metadata, void(uint8_t *order, uint8_t *splay_width, - int64_t *pool_id)); - MOCK_METHOD1(init, void(Context*)); - MOCK_METHOD0(shut_down, void()); - MOCK_METHOD1(flush_commit_position, void(Context*)); - - MOCK_METHOD2(get_cached_client, int(const std::string&, cls::journal::Client*)); - MOCK_METHOD2(update_client, void(const bufferlist &, Context *)); - MOCK_METHOD3(get_tags, void(uint64_t, journal::Journaler::Tags*, Context*)); - - MOCK_METHOD1(start_replay, void(::journal::ReplayHandler *replay_handler)); - MOCK_METHOD1(try_pop_front, bool(MockReplayEntryProxy *replay_entry)); - MOCK_METHOD0(stop_replay, void()); - - MOCK_METHOD3(start_append, void(int flush_interval, uint64_t flush_bytes, - double flush_age)); - MOCK_METHOD2(append, MockFutureProxy(uint64_t tag_id, - const bufferlist &bl)); - MOCK_METHOD1(flush, void(Context *on_safe)); - MOCK_METHOD1(stop_append, void(Context *on_safe)); - - MOCK_METHOD1(committed, void(const MockReplayEntryProxy &replay_entry)); - MOCK_METHOD1(committed, void(const MockFutureProxy &future)); -}; - -struct MockJournalerProxy { - template - MockJournalerProxy(IoCtxT &header_ioctx, const std::string &, - const std::string &, double) { - MockJournaler::get_instance().construct(); - } - - template - MockJournalerProxy(ContextWQ *work_queue, SafeTimer *safe_timer, - Mutex *timer_lock, IoCtxT &header_ioctx, - const std::string &, const std::string &, double) { - MockJournaler::get_instance().construct(); - } - - int exists(bool *header_exists) const { - return -EINVAL; - } - int create(uint8_t order, uint8_t splay_width, int64_t pool_id) { - return -EINVAL; - } - int remove(bool force) { - return -EINVAL; - } - int register_client(const bufferlist &data) { - return -EINVAL; - } - void allocate_tag(uint64_t, const bufferlist &, - cls::journal::Tag*, Context *on_finish) { - on_finish->complete(-EINVAL); - } - - void get_metadata(uint8_t *order, uint8_t *splay_width, int64_t *pool_id) { - MockJournaler::get_instance().get_metadata(order, splay_width, pool_id); - } - - void init(Context *on_finish) { - MockJournaler::get_instance().init(on_finish); - } - void shut_down() { - MockJournaler::get_instance().shut_down(); - } - - int get_cached_client(const std::string& client_id, - cls::journal::Client* client) { - return MockJournaler::get_instance().get_cached_client(client_id, client); - } - void update_client(const bufferlist &client_data, Context *on_finish) { - MockJournaler::get_instance().update_client(client_data, on_finish); - } - - void get_tags(uint64_t tag_class, journal::Journaler::Tags *tags, - Context *on_finish) { - MockJournaler::get_instance().get_tags(tag_class, tags, on_finish); - } - - void flush_commit_position(Context *on_finish) { - MockJournaler::get_instance().flush_commit_position(on_finish); - } - - void start_replay(::journal::ReplayHandler *replay_handler) { - MockJournaler::get_instance().start_replay(replay_handler); - } - - bool try_pop_front(MockReplayEntryProxy *replay_entry) { - return MockJournaler::get_instance().try_pop_front(replay_entry); - } - - void stop_replay() { - MockJournaler::get_instance().stop_replay(); - } - - void start_append(int flush_interval, uint64_t flush_bytes, double flush_age) { - MockJournaler::get_instance().start_append(flush_interval, flush_bytes, - flush_age); - } - - MockFutureProxy append(uint64_t tag_id, const bufferlist &bl) { - return MockJournaler::get_instance().append(tag_id, bl); - } - - void flush(Context *on_safe) { - MockJournaler::get_instance().flush(on_safe); - } - - void stop_append(Context *on_safe) { - MockJournaler::get_instance().stop_append(on_safe); - } - - void committed(const MockReplayEntryProxy &replay_entry) { - MockJournaler::get_instance().committed(replay_entry); - } - - void committed(const MockFutureProxy &future) { - MockJournaler::get_instance().committed(future); - } -}; - -MockFuture *MockFuture::s_instance = nullptr; -MockReplayEntry *MockReplayEntry::s_instance = nullptr; -MockJournaler *MockJournaler::s_instance = nullptr; - -} // namespace journal - namespace librbd { namespace { diff --git a/src/test/rbd_mirror/image_sync/test_mock_ImageCopyRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_ImageCopyRequest.cc index ff3584e071fd4..0b72167d03f5f 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_ImageCopyRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_ImageCopyRequest.cc @@ -6,14 +6,26 @@ #include "librbd/ImageCtx.h" #include "librbd/ImageState.h" #include "librbd/Operations.h" +#include "librbd/journal/TypeTraits.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librados_test_stub/MockTestMemIoCtxImpl.h" #include "test/librbd/mock/MockImageCtx.h" -#include "test/rbd_mirror/mock/MockJournaler.h" #include "tools/rbd_mirror/image_sync/ImageCopyRequest.h" #include "tools/rbd_mirror/image_sync/ObjectCopyRequest.h" #include "tools/rbd_mirror/Threads.h" #include +namespace librbd { +namespace journal { + +template <> +struct TypeTraits { + typedef ::journal::MockJournaler Journaler; +}; + +} // namespace journal +} // namespace librbd + namespace rbd { namespace mirror { namespace image_sync { diff --git a/src/test/rbd_mirror/image_sync/test_mock_SnapshotCopyRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_SnapshotCopyRequest.cc index 10c3ac36ebc5a..0e4817346c1d6 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_SnapshotCopyRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_SnapshotCopyRequest.cc @@ -6,12 +6,24 @@ #include "librbd/ImageCtx.h" #include "librbd/ImageState.h" #include "librbd/Operations.h" +#include "librbd/journal/TypeTraits.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librados_test_stub/MockTestMemIoCtxImpl.h" #include "test/librbd/mock/MockImageCtx.h" -#include "test/rbd_mirror/mock/MockJournaler.h" #include "tools/rbd_mirror/image_sync/SnapshotCopyRequest.h" #include "tools/rbd_mirror/Threads.h" +namespace librbd { +namespace journal { + +template <> +struct TypeTraits { + typedef ::journal::MockJournaler Journaler; +}; + +} // namespace journal +} // namespace librbd + // template definitions #include "tools/rbd_mirror/image_sync/SnapshotCopyRequest.cc" template class rbd::mirror::image_sync::SnapshotCopyRequest; diff --git a/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc index e9834021880ae..75c64797a79f5 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc @@ -4,11 +4,23 @@ #include "test/rbd_mirror/test_mock_fixture.h" #include "include/rbd/librbd.hpp" #include "librbd/journal/Types.h" +#include "librbd/journal/TypeTraits.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librados_test_stub/MockTestMemIoCtxImpl.h" #include "test/librbd/mock/MockImageCtx.h" -#include "test/rbd_mirror/mock/MockJournaler.h" #include "tools/rbd_mirror/image_sync/SyncPointCreateRequest.h" +namespace librbd { +namespace journal { + +template <> +struct TypeTraits { + typedef ::journal::MockJournaler Journaler; +}; + +} // namespace journal +} // namespace librbd + // template definitions #include "tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc" template class rbd::mirror::image_sync::SyncPointCreateRequest; diff --git a/src/test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc index e45bf78395844..7025457359809 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_SyncPointPruneRequest.cc @@ -4,11 +4,23 @@ #include "test/rbd_mirror/test_mock_fixture.h" #include "include/rbd/librbd.hpp" #include "librbd/journal/Types.h" +#include "librbd/journal/TypeTraits.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librados_test_stub/MockTestMemIoCtxImpl.h" #include "test/librbd/mock/MockImageCtx.h" -#include "test/rbd_mirror/mock/MockJournaler.h" #include "tools/rbd_mirror/image_sync/SyncPointPruneRequest.h" +namespace librbd { +namespace journal { + +template <> +struct TypeTraits { + typedef ::journal::MockJournaler Journaler; +}; + +} // namespace journal +} // namespace librbd + // template definitions #include "tools/rbd_mirror/image_sync/SyncPointPruneRequest.cc" template class rbd::mirror::image_sync::SyncPointPruneRequest; diff --git a/src/test/rbd_mirror/mock/MockJournaler.h b/src/test/rbd_mirror/mock/MockJournaler.h deleted file mode 100644 index 03bb6be41adf8..0000000000000 --- a/src/test/rbd_mirror/mock/MockJournaler.h +++ /dev/null @@ -1,157 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#ifndef TEST_RBD_MIRROR_MOCK_JOURNALER_H -#define TEST_RBD_MIRROR_MOCK_JOURNALER_H - -#include -#include "include/int_types.h" -#include "include/rados/librados.hpp" -#include "cls/journal/cls_journal_types.h" -#include "librbd/Journal.h" -#include "librbd/journal/TypeTraits.h" -#include -#include - -class Context; -class ContextWQ; -class Mutex; -class SafeTimer; - -namespace journal { - -struct ReplayHandler; - -struct MockReplayEntry { - static MockReplayEntry *s_instance; - static MockReplayEntry &get_instance() { - assert(s_instance != nullptr); - return *s_instance; - } - - MockReplayEntry() { - s_instance = this; - } - - MOCK_CONST_METHOD0(get_commit_tid, uint64_t()); - MOCK_METHOD0(get_data, bufferlist()); -}; - -struct MockReplayEntryProxy { - uint64_t get_commit_tid() const { - return MockReplayEntry::get_instance().get_commit_tid(); - } - - bufferlist get_data() { - return MockReplayEntry::get_instance().get_data(); - } -}; - -struct MockJournaler { - static MockJournaler *s_instance; - static MockJournaler &get_instance() { - assert(s_instance != nullptr); - return *s_instance; - } - - MockJournaler() { - s_instance = this; - } - - MOCK_METHOD1(init, void(Context *)); - MOCK_METHOD0(shut_down, void()); - MOCK_CONST_METHOD0(is_initialized, bool()); - - MOCK_METHOD4(get_mutable_metadata, void(uint64_t*, uint64_t*, - std::set *, - Context*)); - - MOCK_METHOD2(try_pop_front, bool(MockReplayEntryProxy *, uint64_t *)); - MOCK_METHOD2(start_live_replay, void(ReplayHandler *, double)); - MOCK_METHOD0(stop_replay, void()); - - MOCK_METHOD1(committed, void(const MockReplayEntryProxy &)); - MOCK_METHOD1(flush_commit_position, void(Context*)); - - MOCK_METHOD2(update_client, void(const bufferlist&, Context *on_safe)); - - MOCK_METHOD3(get_tag, void(uint64_t, cls::journal::Tag *, Context *)); - - MOCK_METHOD2(get_cached_client, int(const std::string &, - cls::journal::Client *)); -}; - -struct MockJournalerProxy { - MockJournalerProxy(ContextWQ *work_queue, SafeTimer *timer, Mutex *timer_lock, - librados::IoCtx &header_ioctx, const std::string &journal_id, - const std::string &client_id, double commit_interval) { - MockJournaler::get_instance(); - } - - void init(Context *on_finish) { - MockJournaler::get_instance().init(on_finish); - } - void shut_down() { - MockJournaler::get_instance().shut_down(); - } - bool is_initialized() const { - return MockJournaler::get_instance().is_initialized(); - } - - void get_mutable_metadata(uint64_t *min, uint64_t *active, - std::set *clients, - Context *on_finish) { - MockJournaler::get_instance().get_mutable_metadata(min, active, clients, - on_finish); - } - - bool try_pop_front(MockReplayEntryProxy *entry, uint64_t *tag_tid) { - return MockJournaler::get_instance().try_pop_front(entry, tag_tid); - } - void start_live_replay(ReplayHandler *handler, double interval) { - MockJournaler::get_instance().start_live_replay(handler, interval); - } - void stop_replay() { - MockJournaler::get_instance().stop_replay(); - } - - void committed(const MockReplayEntryProxy &entry) { - MockJournaler::get_instance().committed(entry); - } - void flush_commit_position(Context *on_finish) { - MockJournaler::get_instance().flush_commit_position(on_finish); - } - - void update_client(const bufferlist& data, Context *on_safe) { - MockJournaler::get_instance().update_client(data, on_safe); - } - - void get_tag(uint64_t tag_tid, cls::journal::Tag *tag, Context *on_finish) { - MockJournaler::get_instance().get_tag(tag_tid, tag, on_finish); - } - - int get_cached_client(const std::string &client_id, - cls::journal::Client *client) { - return MockJournaler::get_instance().get_cached_client(client_id, client); - } -}; - -std::ostream &operator<<(std::ostream &os, const MockJournalerProxy &); - -} // namespace journal - -namespace librbd { - -struct MockImageCtx; - -namespace journal { - -template <> -struct TypeTraits { - typedef ::journal::MockJournaler Journaler; -}; - -} // namespace journal -} // namespace librbd - -#endif // TEST_RBD_MIRROR_MOCK_JOURNALER_H diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc index 3233b48df723e..a2785f11c5545 100644 --- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc @@ -7,9 +7,9 @@ #include "tools/rbd_mirror/image_replayer/BootstrapRequest.h" #include "tools/rbd_mirror/image_replayer/CloseImageRequest.h" #include "tools/rbd_mirror/image_replayer/OpenLocalImageRequest.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librbd/mock/MockImageCtx.h" #include "test/librbd/mock/MockJournal.h" -#include "test/rbd_mirror/mock/MockJournaler.h" namespace librbd { diff --git a/src/test/rbd_mirror/test_mock_ImageSync.cc b/src/test/rbd_mirror/test_mock_ImageSync.cc index 8dd0870ad1370..f3c94bac2260e 100644 --- a/src/test/rbd_mirror/test_mock_ImageSync.cc +++ b/src/test/rbd_mirror/test_mock_ImageSync.cc @@ -4,10 +4,11 @@ #include "test/rbd_mirror/test_mock_fixture.h" #include "include/rbd/librbd.hpp" #include "librbd/journal/Types.h" +#include "librbd/journal/TypeTraits.h" +#include "test/journal/mock/MockJournaler.h" #include "test/librados_test_stub/MockTestMemIoCtxImpl.h" #include "test/librbd/mock/MockImageCtx.h" #include "test/librbd/mock/MockObjectMap.h" -#include "test/rbd_mirror/mock/MockJournaler.h" #include "tools/rbd_mirror/ImageSync.h" #include "tools/rbd_mirror/Threads.h" #include "tools/rbd_mirror/image_sync/ImageCopyRequest.h" @@ -15,6 +16,17 @@ #include "tools/rbd_mirror/image_sync/SyncPointCreateRequest.h" #include "tools/rbd_mirror/image_sync/SyncPointPruneRequest.h" +namespace librbd { +namespace journal { + +template <> +struct TypeTraits { + typedef ::journal::MockJournaler Journaler; +}; + +} // namespace journal +} // namespace librbd + // template definitions #include "tools/rbd_mirror/ImageSync.cc" template class rbd::mirror::ImageSync;