#include "test/rbd_mirror/test_mock_fixture.h"
#include "cls/rbd/cls_rbd_types.h"
#include "librbd/journal/TypeTraits.h"
+#include "tools/rbd_mirror/image_replayer/GetMirrorImageIdRequest.h"
#include "tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.h"
#include "test/journal/mock/MockJournaler.h"
#include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
} // anonymous namespace
} // namespace librbd
+namespace rbd {
+namespace mirror {
+namespace image_replayer {
+
+template <>
+struct GetMirrorImageIdRequest<librbd::MockTestImageCtx> {
+ static GetMirrorImageIdRequest* s_instance;
+ std::string* image_id = nullptr;
+ Context* on_finish = nullptr;
+
+ static GetMirrorImageIdRequest* create(librados::IoCtx& io_ctx,
+ const std::string& global_image_id,
+ std::string* image_id,
+ Context* on_finish) {
+ assert(s_instance != nullptr);
+ s_instance->image_id = image_id;
+ s_instance->on_finish = on_finish;
+ return s_instance;
+ }
+
+ GetMirrorImageIdRequest() {
+ s_instance = this;
+ }
+
+ MOCK_METHOD0(send, void());
+};
+
+GetMirrorImageIdRequest<librbd::MockTestImageCtx>* GetMirrorImageIdRequest<librbd::MockTestImageCtx>::s_instance = nullptr;
+
+} // namespace image_replayer
+} // namespace mirror
+} // namespace rbd
+
// template definitions
#include "tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc"
class TestMockImageReplayerPrepareLocalImageRequest : public TestMockFixture {
public:
typedef PrepareLocalImageRequest<librbd::MockTestImageCtx> MockPrepareLocalImageRequest;
+ typedef GetMirrorImageIdRequest<librbd::MockTestImageCtx> MockGetMirrorImageIdRequest;
+
+ void expect_get_mirror_image_id(MockGetMirrorImageIdRequest& mock_get_mirror_image_id_request,
+ const std::string& image_id, int r) {
+ EXPECT_CALL(mock_get_mirror_image_id_request, send())
+ .WillOnce(Invoke([&mock_get_mirror_image_id_request, image_id, r]() {
+ *mock_get_mirror_image_id_request.image_id = image_id;
+ mock_get_mirror_image_id_request.on_finish->complete(r);
+ }));
+ }
- void expect_mirror_image_get_image_id(librados::IoCtx &io_ctx,
- const std::string &image_id, int r) {
+ void expect_dir_get_name(librados::IoCtx &io_ctx,
+ const std::string &image_name, int r) {
bufferlist bl;
- ::encode(image_id, bl);
+ encode(image_name, bl);
EXPECT_CALL(get_mock_io_ctx(io_ctx),
- exec(RBD_MIRRORING, _, StrEq("rbd"), StrEq("mirror_image_get_image_id"), _, _, _))
+ exec(RBD_DIRECTORY, _, StrEq("rbd"), StrEq("dir_get_name"), _, _, _))
.WillOnce(DoAll(WithArg<5>(Invoke([bl](bufferlist *out_bl) {
*out_bl = bl;
})),
TEST_F(TestMockImageReplayerPrepareLocalImageRequest, Success) {
InSequence seq;
- expect_mirror_image_get_image_id(m_local_io_ctx, "local image id", 0);
+ MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+ expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
+ 0);
+ expect_dir_get_name(m_local_io_ctx, "local image name", 0);
expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
expect_get_tag_owner(mock_journal, "local image id", "remote mirror uuid", 0);
std::string local_image_id;
+ std::string local_image_name;
std::string tag_owner;
C_SaferCond ctx;
auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
"global image id",
&local_image_id,
+ &local_image_name,
&tag_owner,
m_threads->work_queue,
&ctx);
ASSERT_EQ(0, ctx.wait());
ASSERT_EQ(std::string("local image id"), local_image_id);
+ ASSERT_EQ(std::string("local image name"), local_image_name);
ASSERT_EQ(std::string("remote mirror uuid"), tag_owner);
}
-TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdDNE) {
+TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdError) {
InSequence seq;
- expect_mirror_image_get_image_id(m_local_io_ctx, "", -ENOENT);
+ MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+ expect_get_mirror_image_id(mock_get_mirror_image_id_request, "", -EINVAL);
std::string local_image_id;
+ std::string local_image_name;
std::string tag_owner;
C_SaferCond ctx;
auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
"global image id",
&local_image_id,
+ &local_image_name,
&tag_owner,
m_threads->work_queue,
&ctx);
req->send();
- ASSERT_EQ(-ENOENT, ctx.wait());
+ ASSERT_EQ(-EINVAL, ctx.wait());
}
-TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdError) {
+TEST_F(TestMockImageReplayerPrepareLocalImageRequest, DirGetNameError) {
InSequence seq;
- expect_mirror_image_get_image_id(m_local_io_ctx, "", -EINVAL);
+ MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+ expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
+ 0);
+ expect_dir_get_name(m_local_io_ctx, "", -ENOENT);
std::string local_image_id;
+ std::string local_image_name;
std::string tag_owner;
C_SaferCond ctx;
auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
"global image id",
&local_image_id,
+ &local_image_name,
&tag_owner,
m_threads->work_queue,
&ctx);
req->send();
- ASSERT_EQ(-EINVAL, ctx.wait());
+ ASSERT_EQ(-ENOENT, ctx.wait());
}
TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageError) {
InSequence seq;
- expect_mirror_image_get_image_id(m_local_io_ctx, "local image id", 0);
+ MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+ expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
+ 0);
+ expect_dir_get_name(m_local_io_ctx, "local image name", 0);
expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_DISABLED,
"", -EINVAL);
std::string local_image_id;
+ std::string local_image_name;
std::string tag_owner;
C_SaferCond ctx;
auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
"global image id",
&local_image_id,
+ &local_image_name,
&tag_owner,
m_threads->work_queue,
&ctx);
TEST_F(TestMockImageReplayerPrepareLocalImageRequest, TagOwnerError) {
InSequence seq;
- expect_mirror_image_get_image_id(m_local_io_ctx, "local image id", 0);
+ MockGetMirrorImageIdRequest mock_get_mirror_image_id_request;
+ expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
+ 0);
+ expect_dir_get_name(m_local_io_ctx, "local image name", 0);
expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
-ENOENT);
std::string local_image_id;
+ std::string local_image_name;
std::string tag_owner;
C_SaferCond ctx;
auto req = MockPrepareLocalImageRequest::create(m_local_io_ctx,
"global image id",
&local_image_id,
+ &local_image_name,
&tag_owner,
m_threads->work_queue,
&ctx);