1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/rbd_mirror/test_mock_fixture.h"
5 #include "librbd/journal/TypeTraits.h"
6 #include "tools/rbd_mirror/BaseRequest.h"
7 #include "tools/rbd_mirror/InstanceWatcher.h"
8 #include "tools/rbd_mirror/Threads.h"
9 #include "tools/rbd_mirror/image_replayer/BootstrapRequest.h"
10 #include "tools/rbd_mirror/image_replayer/OpenImageRequest.h"
11 #include "tools/rbd_mirror/image_replayer/OpenLocalImageRequest.h"
12 #include "tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.h"
13 #include "tools/rbd_mirror/image_replayer/PrepareRemoteImageRequest.h"
14 #include "tools/rbd_mirror/image_replayer/StateBuilder.h"
15 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
16 #include "test/librbd/mock/MockImageCtx.h"
17 #include "test/rbd_mirror/mock/image_sync/MockSyncPointHandler.h"
18 #include "test/rbd_mirror/mock/MockBaseRequest.h"
24 struct MockTestImageCtx
: public librbd::MockImageCtx
{
25 MockTestImageCtx(librbd::ImageCtx
&image_ctx
)
26 : librbd::MockImageCtx(image_ctx
) {
30 } // anonymous namespace
36 class ProgressContext
;
39 struct Threads
<librbd::MockTestImageCtx
> {
40 ceph::mutex
&timer_lock
;
42 librbd::asio::ContextWQ
*work_queue
;
44 Threads(Threads
<librbd::ImageCtx
> *threads
)
45 : timer_lock(threads
->timer_lock
), timer(threads
->timer
),
46 work_queue(threads
->work_queue
) {
51 struct ImageSync
<librbd::MockTestImageCtx
> {
52 static ImageSync
* s_instance
;
53 Context
*on_finish
= nullptr;
55 static ImageSync
* create(
56 Threads
<librbd::MockTestImageCtx
>* threads
,
57 librbd::MockTestImageCtx
*local_image_ctx
,
58 librbd::MockTestImageCtx
*remote_image_ctx
,
59 const std::string
&local_mirror_uuid
,
60 image_sync::SyncPointHandler
* sync_point_handler
,
61 InstanceWatcher
<librbd::MockTestImageCtx
> *instance_watcher
,
62 ProgressContext
*progress_ctx
, Context
*on_finish
) {
63 ceph_assert(s_instance
!= nullptr);
64 s_instance
->on_finish
= on_finish
;
69 ceph_assert(s_instance
== nullptr);
76 MOCK_METHOD0(get
, void());
77 MOCK_METHOD0(put
, void());
78 MOCK_METHOD0(send
, void());
79 MOCK_METHOD0(cancel
, void());
82 ImageSync
<librbd::MockTestImageCtx
>*
83 ImageSync
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
86 struct InstanceWatcher
<librbd::MockTestImageCtx
> {
89 namespace image_replayer
{
92 struct OpenImageRequest
<librbd::MockTestImageCtx
> {
93 static OpenImageRequest
* s_instance
;
94 librbd::MockTestImageCtx
**image_ctx
= nullptr;
95 Context
*on_finish
= nullptr;
97 static OpenImageRequest
* create(librados::IoCtx
&io_ctx
,
98 librbd::MockTestImageCtx
**image_ctx
,
99 const std::string
&image_id
,
100 bool read_only
, Context
*on_finish
) {
101 ceph_assert(s_instance
!= nullptr);
102 s_instance
->image_ctx
= image_ctx
;
103 s_instance
->on_finish
= on_finish
;
104 s_instance
->construct(io_ctx
, image_id
);
109 ceph_assert(s_instance
== nullptr);
112 ~OpenImageRequest() {
113 s_instance
= nullptr;
116 MOCK_METHOD2(construct
, void(librados::IoCtx
&io_ctx
,
117 const std::string
&image_id
));
118 MOCK_METHOD0(send
, void());
122 struct OpenLocalImageRequest
<librbd::MockTestImageCtx
> {
123 static OpenLocalImageRequest
* s_instance
;
124 librbd::MockTestImageCtx
**image_ctx
= nullptr;
125 Context
*on_finish
= nullptr;
127 static OpenLocalImageRequest
* create(librados::IoCtx
&local_io_ctx
,
128 librbd::MockTestImageCtx
**local_image_ctx
,
129 const std::string
&local_image_id
,
130 librbd::asio::ContextWQ
*work_queue
,
131 Context
*on_finish
) {
132 ceph_assert(s_instance
!= nullptr);
133 s_instance
->image_ctx
= local_image_ctx
;
134 s_instance
->on_finish
= on_finish
;
135 s_instance
->construct(local_io_ctx
, local_image_id
);
139 OpenLocalImageRequest() {
140 ceph_assert(s_instance
== nullptr);
143 ~OpenLocalImageRequest() {
144 s_instance
= nullptr;
147 MOCK_METHOD2(construct
, void(librados::IoCtx
&io_ctx
,
148 const std::string
&image_id
));
149 MOCK_METHOD0(send
, void());
153 struct PrepareLocalImageRequest
<librbd::MockTestImageCtx
> {
154 static PrepareLocalImageRequest
* s_instance
;
155 std::string
*local_image_name
= nullptr;
156 StateBuilder
<librbd::MockTestImageCtx
>** state_builder
= nullptr;
157 Context
*on_finish
= nullptr;
159 static PrepareLocalImageRequest
* create(librados::IoCtx
&,
160 const std::string
&global_image_id
,
161 std::string
*local_image_name
,
162 StateBuilder
<librbd::MockTestImageCtx
>** state_builder
,
163 librbd::asio::ContextWQ
*work_queue
,
164 Context
*on_finish
) {
165 ceph_assert(s_instance
!= nullptr);
166 s_instance
->local_image_name
= local_image_name
;
167 s_instance
->state_builder
= state_builder
;
168 s_instance
->on_finish
= on_finish
;
172 PrepareLocalImageRequest() {
176 MOCK_METHOD0(send
, void());
180 struct PrepareRemoteImageRequest
<librbd::MockTestImageCtx
> {
181 static PrepareRemoteImageRequest
* s_instance
;
182 StateBuilder
<librbd::MockTestImageCtx
>** state_builder
= nullptr;
183 Context
*on_finish
= nullptr;
185 static PrepareRemoteImageRequest
* create(Threads
<librbd::MockTestImageCtx
> *threads
,
188 const std::string
&global_image_id
,
189 const std::string
&local_mirror_uuid
,
190 const RemotePoolMeta
& remote_pool_meta
,
191 ::journal::CacheManagerHandler
*cache_manager_handler
,
192 StateBuilder
<librbd::MockTestImageCtx
>** state_builder
,
193 Context
*on_finish
) {
194 ceph_assert(s_instance
!= nullptr);
195 s_instance
->state_builder
= state_builder
;
196 s_instance
->on_finish
= on_finish
;
200 PrepareRemoteImageRequest() {
204 MOCK_METHOD0(send
, void());
208 struct StateBuilder
<librbd::MockTestImageCtx
> {
209 static StateBuilder
* s_instance
;
211 image_sync::MockSyncPointHandler mock_sync_point_handler
;
212 MockBaseRequest mock_base_request
;
214 librbd::MockTestImageCtx
* local_image_ctx
= nullptr;
215 librbd::MockTestImageCtx
* remote_image_ctx
= nullptr;
216 std::string local_image_id
;
217 std::string remote_mirror_uuid
;
218 std::string remote_image_id
;
220 static StateBuilder
* create(const std::string
&) {
221 ceph_assert(s_instance
!= nullptr);
225 image_sync::MockSyncPointHandler
* create_sync_point_handler() {
226 return &mock_sync_point_handler
;
233 MOCK_CONST_METHOD0(is_disconnected
, bool());
234 MOCK_CONST_METHOD0(is_local_primary
, bool());
235 MOCK_CONST_METHOD0(is_remote_primary
, bool());
236 MOCK_CONST_METHOD0(is_linked
, bool());
238 MOCK_CONST_METHOD0(replay_requires_remote_image
, bool());
239 MOCK_METHOD1(close_remote_image
, void(Context
*));
241 MOCK_METHOD6(create_local_image_request
,
242 BaseRequest
*(Threads
<librbd::MockTestImageCtx
>*,
248 MOCK_METHOD5(create_prepare_replay_request
,
249 BaseRequest
*(const std::string
&,
251 bool*, bool*, Context
*));
253 void destroy_sync_point_handler() {
259 OpenImageRequest
<librbd::MockTestImageCtx
>*
260 OpenImageRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
261 OpenLocalImageRequest
<librbd::MockTestImageCtx
>*
262 OpenLocalImageRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
263 PrepareLocalImageRequest
<librbd::MockTestImageCtx
>*
264 PrepareLocalImageRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
265 PrepareRemoteImageRequest
<librbd::MockTestImageCtx
>*
266 PrepareRemoteImageRequest
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
267 StateBuilder
<librbd::MockTestImageCtx
>*
268 StateBuilder
<librbd::MockTestImageCtx
>::s_instance
= nullptr;
270 } // namespace image_replayer
271 } // namespace mirror
274 // template definitions
275 #include "tools/rbd_mirror/image_replayer/BootstrapRequest.cc"
279 namespace image_replayer
{
282 using ::testing::DoAll
;
283 using ::testing::InSequence
;
284 using ::testing::Invoke
;
285 using ::testing::Return
;
286 using ::testing::SetArgPointee
;
287 using ::testing::StrEq
;
288 using ::testing::WithArg
;
289 using ::testing::WithArgs
;
291 MATCHER_P(IsSameIoCtx
, io_ctx
, "") {
292 return &get_mock_io_ctx(arg
) == &get_mock_io_ctx(*io_ctx
);
295 class TestMockImageReplayerBootstrapRequest
: public TestMockFixture
{
297 typedef Threads
<librbd::MockTestImageCtx
> MockThreads
;
298 typedef BootstrapRequest
<librbd::MockTestImageCtx
> MockBootstrapRequest
;
299 typedef ImageSync
<librbd::MockTestImageCtx
> MockImageSync
;
300 typedef InstanceWatcher
<librbd::MockTestImageCtx
> MockInstanceWatcher
;
301 typedef OpenImageRequest
<librbd::MockTestImageCtx
> MockOpenImageRequest
;
302 typedef OpenLocalImageRequest
<librbd::MockTestImageCtx
> MockOpenLocalImageRequest
;
303 typedef PrepareLocalImageRequest
<librbd::MockTestImageCtx
> MockPrepareLocalImageRequest
;
304 typedef PrepareRemoteImageRequest
<librbd::MockTestImageCtx
> MockPrepareRemoteImageRequest
;
305 typedef StateBuilder
<librbd::MockTestImageCtx
> MockStateBuilder
;
306 typedef std::list
<cls::journal::Tag
> Tags
;
308 void SetUp() override
{
309 TestMockFixture::SetUp();
312 ASSERT_EQ(0, create_image(rbd
, m_remote_io_ctx
, m_image_name
, m_image_size
));
313 ASSERT_EQ(0, open_image(m_remote_io_ctx
, m_image_name
, &m_remote_image_ctx
));
315 ASSERT_EQ(0, create_image(rbd
, m_local_io_ctx
, m_image_name
, m_image_size
));
316 ASSERT_EQ(0, open_image(m_local_io_ctx
, m_image_name
, &m_local_image_ctx
));
319 void expect_send(MockPrepareLocalImageRequest
&mock_request
,
320 MockStateBuilder
& mock_state_builder
,
321 const std::string
& local_image_id
,
322 const std::string
& local_image_name
, int r
) {
323 EXPECT_CALL(mock_request
, send())
324 .WillOnce(Invoke([&mock_request
, &mock_state_builder
, local_image_id
,
325 local_image_name
, r
]() {
327 *mock_request
.state_builder
= &mock_state_builder
;
328 mock_state_builder
.local_image_id
= local_image_id
;
329 *mock_request
.local_image_name
= local_image_name
;
331 mock_request
.on_finish
->complete(r
);
335 void expect_send(MockPrepareRemoteImageRequest
& mock_request
,
336 MockStateBuilder
& mock_state_builder
,
337 const std::string
& remote_mirror_uuid
,
338 const std::string
& remote_image_id
,
340 EXPECT_CALL(mock_request
, send())
341 .WillOnce(Invoke([&mock_request
, &mock_state_builder
, remote_mirror_uuid
,
342 remote_image_id
, r
]() {
344 *mock_request
.state_builder
= &mock_state_builder
;
345 mock_state_builder
.remote_image_id
= remote_image_id
;
348 mock_state_builder
.remote_mirror_uuid
= remote_mirror_uuid
;
349 mock_request
.on_finish
->complete(r
);
353 void expect_is_local_primary(MockStateBuilder
& mock_state_builder
,
355 EXPECT_CALL(mock_state_builder
, is_local_primary())
356 .WillOnce(Return(is_primary
));
359 void expect_is_remote_primary(MockStateBuilder
& mock_state_builder
,
361 EXPECT_CALL(mock_state_builder
, is_remote_primary())
362 .WillOnce(Return(is_primary
));
365 void expect_is_linked(MockStateBuilder
& mock_state_builder
, bool is_linked
) {
366 EXPECT_CALL(mock_state_builder
, is_linked())
367 .WillOnce(Return(is_linked
));
370 void expect_is_disconnected(MockStateBuilder
& mock_state_builder
,
371 bool is_disconnected
) {
372 EXPECT_CALL(mock_state_builder
, is_disconnected())
373 .WillOnce(Return(is_disconnected
));
376 void expect_replay_requires_remote_image(MockStateBuilder
& mock_state_builder
,
377 bool requires_image
) {
378 EXPECT_CALL(mock_state_builder
, replay_requires_remote_image())
379 .WillOnce(Return(requires_image
));
382 void expect_open_image(MockOpenImageRequest
&mock_open_image_request
,
383 librados::IoCtx
&io_ctx
, const std::string
&image_id
,
384 librbd::MockTestImageCtx
&mock_image_ctx
, int r
) {
385 EXPECT_CALL(mock_open_image_request
,
386 construct(IsSameIoCtx(&io_ctx
), image_id
));
387 EXPECT_CALL(mock_open_image_request
, send())
388 .WillOnce(Invoke([this, &mock_open_image_request
, &mock_image_ctx
, r
]() {
389 *mock_open_image_request
.image_ctx
= &mock_image_ctx
;
390 m_threads
->work_queue
->queue(mock_open_image_request
.on_finish
, r
);
394 void expect_open_local_image(MockOpenLocalImageRequest
&mock_open_local_image_request
,
395 librados::IoCtx
&io_ctx
, const std::string
&image_id
,
396 librbd::MockTestImageCtx
*mock_image_ctx
, int r
) {
397 EXPECT_CALL(mock_open_local_image_request
,
398 construct(IsSameIoCtx(&io_ctx
), image_id
));
399 EXPECT_CALL(mock_open_local_image_request
, send())
400 .WillOnce(Invoke([this, &mock_open_local_image_request
, mock_image_ctx
, r
]() {
402 *mock_open_local_image_request
.image_ctx
= mock_image_ctx
;
404 m_threads
->work_queue
->queue(mock_open_local_image_request
.on_finish
,
409 void expect_close_remote_image(
410 MockStateBuilder
& mock_state_builder
, int r
) {
411 EXPECT_CALL(mock_state_builder
, close_remote_image(_
))
412 .WillOnce(Invoke([&mock_state_builder
, r
]
413 (Context
* on_finish
) {
414 mock_state_builder
.remote_image_ctx
= nullptr;
415 on_finish
->complete(r
);
419 void expect_create_local_image(MockStateBuilder
& mock_state_builder
,
420 const std::string
& local_image_id
, int r
) {
421 EXPECT_CALL(mock_state_builder
,
422 create_local_image_request(_
, _
, _
, _
, _
, _
))
423 .WillOnce(WithArg
<5>(
424 Invoke([&mock_state_builder
, local_image_id
, r
](Context
* ctx
) {
426 mock_state_builder
.local_image_id
= local_image_id
;
428 mock_state_builder
.mock_base_request
.on_finish
= ctx
;
429 return &mock_state_builder
.mock_base_request
;
431 EXPECT_CALL(mock_state_builder
.mock_base_request
, send())
432 .WillOnce(Invoke([this, &mock_state_builder
, r
]() {
433 m_threads
->work_queue
->queue(
434 mock_state_builder
.mock_base_request
.on_finish
, r
);
438 void expect_prepare_replay(MockStateBuilder
& mock_state_builder
,
439 bool resync_requested
, bool syncing
, int r
) {
440 EXPECT_CALL(mock_state_builder
,
441 create_prepare_replay_request(_
, _
, _
, _
, _
))
442 .WillOnce(WithArgs
<2, 3, 4>(
443 Invoke([&mock_state_builder
, resync_requested
, syncing
, r
]
444 (bool* resync
, bool* sync
, Context
* ctx
) {
446 *resync
= resync_requested
;
449 mock_state_builder
.mock_base_request
.on_finish
= ctx
;
450 return &mock_state_builder
.mock_base_request
;
452 EXPECT_CALL(mock_state_builder
.mock_base_request
, send())
453 .WillOnce(Invoke([this, &mock_state_builder
, r
]() {
454 m_threads
->work_queue
->queue(
455 mock_state_builder
.mock_base_request
.on_finish
, r
);
459 void expect_image_sync(MockImageSync
&mock_image_sync
, int r
) {
460 EXPECT_CALL(mock_image_sync
, get());
461 EXPECT_CALL(mock_image_sync
, send())
462 .WillOnce(Invoke([this, &mock_image_sync
, r
]() {
463 m_threads
->work_queue
->queue(mock_image_sync
.on_finish
, r
);
465 EXPECT_CALL(mock_image_sync
, put());
468 MockBootstrapRequest
*create_request(MockThreads
* mock_threads
,
469 MockInstanceWatcher
*mock_instance_watcher
,
470 const std::string
&global_image_id
,
471 const std::string
&local_mirror_uuid
,
472 Context
*on_finish
) {
473 return new MockBootstrapRequest(mock_threads
,
476 mock_instance_watcher
,
479 {"remote mirror uuid",
480 "remote mirror peer uuid"},
481 nullptr, nullptr, nullptr,
482 &m_mock_state_builder
,
483 &m_do_resync
, on_finish
);
486 librbd::ImageCtx
*m_remote_image_ctx
;
487 librbd::ImageCtx
*m_local_image_ctx
= nullptr;
489 MockStateBuilder
* m_mock_state_builder
= nullptr;
490 bool m_do_resync
= false;
493 TEST_F(TestMockImageReplayerBootstrapRequest
, Success
) {
496 // prepare local image
497 MockStateBuilder mock_state_builder
;
498 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
499 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
500 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
502 // prepare remote image
503 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
504 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
505 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
506 expect_is_local_primary(mock_state_builder
, false);
507 expect_is_remote_primary(mock_state_builder
, true);
509 // open the remote image
510 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
511 MockOpenImageRequest mock_open_image_request
;
512 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
513 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
515 // open the local image
516 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
517 MockOpenLocalImageRequest mock_open_local_image_request
;
518 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
519 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
522 expect_prepare_replay(mock_state_builder
, false, false, 0);
523 expect_is_disconnected(mock_state_builder
, false);
525 // close remote image
526 expect_replay_requires_remote_image(mock_state_builder
, false);
527 expect_close_remote_image(mock_state_builder
, 0);
530 MockThreads
mock_threads(m_threads
);
531 MockInstanceWatcher mock_instance_watcher
;
532 MockBootstrapRequest
*request
= create_request(
533 &mock_threads
, &mock_instance_watcher
, "global image id",
534 "local mirror uuid", &ctx
);
536 ASSERT_EQ(0, ctx
.wait());
539 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareRemoteImageNotPrimaryLocalDNE
) {
542 // prepare local image
543 MockStateBuilder mock_state_builder
;
544 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
545 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
546 m_local_image_ctx
->id
, m_local_image_ctx
->name
, -ENOENT
);
548 // prepare remote image
549 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
550 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
551 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
552 expect_is_local_primary(mock_state_builder
, false);
553 expect_is_remote_primary(mock_state_builder
, false);
556 MockThreads
mock_threads(m_threads
);
557 MockInstanceWatcher mock_instance_watcher
;
558 MockBootstrapRequest
*request
= create_request(
559 &mock_threads
, &mock_instance_watcher
, "global image id",
560 "local mirror uuid", &ctx
);
562 ASSERT_EQ(-EREMOTEIO
, ctx
.wait());
565 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareRemoteImageNotPrimaryLocalUnlinked
) {
568 // prepare local image
569 MockStateBuilder mock_state_builder
;
570 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
571 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
572 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
574 // prepare remote image
575 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
576 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
577 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
578 expect_is_local_primary(mock_state_builder
, false);
579 expect_is_remote_primary(mock_state_builder
, false);
580 expect_is_linked(mock_state_builder
, false);
583 MockThreads
mock_threads(m_threads
);
584 MockInstanceWatcher mock_instance_watcher
;
585 MockBootstrapRequest
*request
= create_request(
586 &mock_threads
, &mock_instance_watcher
, "global image id",
587 "local mirror uuid", &ctx
);
589 ASSERT_EQ(-EREMOTEIO
, ctx
.wait());
592 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareRemoteImageNotPrimaryLocalLinked
) {
595 // prepare local image
596 MockStateBuilder mock_state_builder
;
597 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
598 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
599 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
601 // prepare remote image
602 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
603 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
604 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
605 expect_is_local_primary(mock_state_builder
, false);
606 expect_is_remote_primary(mock_state_builder
, false);
607 expect_is_linked(mock_state_builder
, true);
609 // open the remote image
610 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
611 MockOpenImageRequest mock_open_image_request
;
612 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
613 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
615 // open the local image
616 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
617 MockOpenLocalImageRequest mock_open_local_image_request
;
618 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
619 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
622 expect_prepare_replay(mock_state_builder
, false, false, 0);
623 expect_is_disconnected(mock_state_builder
, false);
625 // close remote image
626 expect_replay_requires_remote_image(mock_state_builder
, false);
627 expect_close_remote_image(mock_state_builder
, 0);
630 MockThreads
mock_threads(m_threads
);
631 MockInstanceWatcher mock_instance_watcher
;
632 MockBootstrapRequest
*request
= create_request(
633 &mock_threads
, &mock_instance_watcher
, "global image id",
634 "local mirror uuid", &ctx
);
636 ASSERT_EQ(0, ctx
.wait());
639 TEST_F(TestMockImageReplayerBootstrapRequest
, OpenLocalImageError
) {
642 // prepare local image
643 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
644 MockStateBuilder mock_state_builder
;
645 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
646 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
648 // prepare remote image
649 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
650 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
651 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
652 expect_is_local_primary(mock_state_builder
, false);
653 expect_is_remote_primary(mock_state_builder
, true);
655 // open the remote image
656 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
657 MockOpenImageRequest mock_open_image_request
;
658 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
659 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
661 // open the local image
662 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
663 MockOpenLocalImageRequest mock_open_local_image_request
;
664 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
665 mock_local_image_ctx
.id
, &mock_local_image_ctx
,
668 // close remote image
669 expect_replay_requires_remote_image(mock_state_builder
, false);
670 expect_close_remote_image(mock_state_builder
, 0);
673 MockThreads
mock_threads(m_threads
);
674 MockInstanceWatcher mock_instance_watcher
;
675 MockBootstrapRequest
*request
= create_request(
676 &mock_threads
, &mock_instance_watcher
, "global image id",
677 "local mirror uuid", &ctx
);
679 ASSERT_EQ(-EINVAL
, ctx
.wait());
682 TEST_F(TestMockImageReplayerBootstrapRequest
, OpenLocalImageDNE
) {
685 // prepare local image
686 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
687 MockStateBuilder mock_state_builder
;
688 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
689 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
691 // prepare remote image
692 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
693 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
694 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
695 expect_is_local_primary(mock_state_builder
, false);
696 expect_is_remote_primary(mock_state_builder
, true);
698 // open the remote image
699 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
700 MockOpenImageRequest mock_open_image_request
;
701 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
702 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
704 // open the local image
705 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
706 MockOpenLocalImageRequest mock_open_local_image_request
;
707 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
708 mock_local_image_ctx
.id
, &mock_local_image_ctx
,
711 // create local image
712 expect_create_local_image(mock_state_builder
, "local image id", 0);
714 // re-open the local image
715 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
716 "local image id", &mock_local_image_ctx
, 0);
719 expect_prepare_replay(mock_state_builder
, false, false, 0);
720 expect_is_disconnected(mock_state_builder
, false);
722 // close remote image
723 expect_replay_requires_remote_image(mock_state_builder
, false);
724 expect_close_remote_image(mock_state_builder
, 0);
727 MockThreads
mock_threads(m_threads
);
728 MockInstanceWatcher mock_instance_watcher
;
729 MockBootstrapRequest
*request
= create_request(
730 &mock_threads
, &mock_instance_watcher
, "global image id",
731 "local mirror uuid", &ctx
);
733 ASSERT_EQ(0, ctx
.wait());
736 TEST_F(TestMockImageReplayerBootstrapRequest
, OpenLocalImagePrimary
) {
739 // prepare local image
740 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
741 MockStateBuilder mock_state_builder
;
742 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
743 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
745 // prepare remote image
746 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
747 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
748 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
749 expect_is_local_primary(mock_state_builder
, false);
750 expect_is_remote_primary(mock_state_builder
, true);
752 // open the remote image
753 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
754 MockOpenImageRequest mock_open_image_request
;
755 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
756 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
758 // open the local image
759 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
760 MockOpenLocalImageRequest mock_open_local_image_request
;
761 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
762 mock_local_image_ctx
.id
, &mock_local_image_ctx
,
765 // close remote image
766 expect_replay_requires_remote_image(mock_state_builder
, false);
767 expect_close_remote_image(mock_state_builder
, 0);
770 MockThreads
mock_threads(m_threads
);
771 MockInstanceWatcher mock_instance_watcher
;
772 MockBootstrapRequest
*request
= create_request(
773 &mock_threads
, &mock_instance_watcher
, "global image id",
774 "local mirror uuid", &ctx
);
776 ASSERT_EQ(-EREMOTEIO
, ctx
.wait());
779 TEST_F(TestMockImageReplayerBootstrapRequest
, CreateLocalImageError
) {
782 // prepare local image
783 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
784 MockStateBuilder mock_state_builder
;
785 expect_send(mock_prepare_local_image_request
, mock_state_builder
, "", "",
788 // prepare remote image
789 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
790 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
791 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
792 expect_is_local_primary(mock_state_builder
, false);
793 expect_is_remote_primary(mock_state_builder
, true);
795 // open the remote image
796 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
797 MockOpenImageRequest mock_open_image_request
;
798 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
799 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
801 // create local image
802 expect_create_local_image(mock_state_builder
, "local image id", -EINVAL
);
804 // close remote image
805 expect_replay_requires_remote_image(mock_state_builder
, false);
806 expect_close_remote_image(mock_state_builder
, 0);
809 MockThreads
mock_threads(m_threads
);
810 MockInstanceWatcher mock_instance_watcher
;
811 MockBootstrapRequest
*request
= create_request(
812 &mock_threads
, &mock_instance_watcher
, "global image id",
813 "local mirror uuid", &ctx
);
815 ASSERT_EQ(-EINVAL
, ctx
.wait());
818 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareReplayError
) {
821 // prepare local image
822 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
823 MockStateBuilder mock_state_builder
;
824 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
825 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
827 // prepare remote image
828 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
829 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
830 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
831 expect_is_local_primary(mock_state_builder
, false);
832 expect_is_remote_primary(mock_state_builder
, true);
834 // open the remote image
835 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
836 MockOpenImageRequest mock_open_image_request
;
837 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
838 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
840 // open the local image
841 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
842 MockOpenLocalImageRequest mock_open_local_image_request
;
843 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
844 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
847 expect_prepare_replay(mock_state_builder
, false, false, -EINVAL
);
849 // close remote image
850 expect_replay_requires_remote_image(mock_state_builder
, false);
851 expect_close_remote_image(mock_state_builder
, 0);
854 MockThreads
mock_threads(m_threads
);
855 MockInstanceWatcher mock_instance_watcher
;
856 MockBootstrapRequest
*request
= create_request(
857 &mock_threads
, &mock_instance_watcher
, "global image id",
858 "local mirror uuid", &ctx
);
860 ASSERT_EQ(-EINVAL
, ctx
.wait());
863 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareReplayResyncRequested
) {
866 // prepare local image
867 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
868 MockStateBuilder mock_state_builder
;
869 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
870 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
872 // prepare remote image
873 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
874 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
875 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
876 expect_is_local_primary(mock_state_builder
, false);
877 expect_is_remote_primary(mock_state_builder
, true);
879 // open the remote image
880 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
881 MockOpenImageRequest mock_open_image_request
;
882 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
883 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
885 // open the local image
886 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
887 MockOpenLocalImageRequest mock_open_local_image_request
;
888 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
889 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
892 expect_prepare_replay(mock_state_builder
, true, false, 0);
894 // close remote image
895 expect_replay_requires_remote_image(mock_state_builder
, false);
896 expect_close_remote_image(mock_state_builder
, 0);
899 MockThreads
mock_threads(m_threads
);
900 MockInstanceWatcher mock_instance_watcher
;
901 MockBootstrapRequest
*request
= create_request(
902 &mock_threads
, &mock_instance_watcher
, "global image id",
903 "local mirror uuid", &ctx
);
905 ASSERT_EQ(0, ctx
.wait());
906 ASSERT_TRUE(m_do_resync
);
909 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareReplaySyncing
) {
912 // prepare local image
913 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
914 MockStateBuilder mock_state_builder
;
915 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
916 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
918 // prepare remote image
919 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
920 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
921 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
922 expect_is_local_primary(mock_state_builder
, false);
923 expect_is_remote_primary(mock_state_builder
, true);
925 // open the remote image
926 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
927 MockOpenImageRequest mock_open_image_request
;
928 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
929 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
931 // open the local image
932 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
933 MockOpenLocalImageRequest mock_open_local_image_request
;
934 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
935 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
938 expect_prepare_replay(mock_state_builder
, false, true, 0);
939 expect_is_disconnected(mock_state_builder
, false);
942 MockImageSync mock_image_sync
;
943 expect_image_sync(mock_image_sync
, 0);
945 // close remote image
946 expect_replay_requires_remote_image(mock_state_builder
, false);
947 expect_close_remote_image(mock_state_builder
, 0);
950 MockThreads
mock_threads(m_threads
);
951 MockInstanceWatcher mock_instance_watcher
;
952 MockBootstrapRequest
*request
= create_request(
953 &mock_threads
, &mock_instance_watcher
, "global image id",
954 "local mirror uuid", &ctx
);
956 ASSERT_EQ(0, ctx
.wait());
959 TEST_F(TestMockImageReplayerBootstrapRequest
, PrepareReplayDisconnected
) {
962 // prepare local image
963 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
964 MockStateBuilder mock_state_builder
;
965 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
966 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
968 // prepare remote image
969 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
970 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
971 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
972 expect_is_local_primary(mock_state_builder
, false);
973 expect_is_remote_primary(mock_state_builder
, true);
975 // open the remote image
976 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
977 MockOpenImageRequest mock_open_image_request
;
978 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
979 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
981 // open the local image
982 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
983 MockOpenLocalImageRequest mock_open_local_image_request
;
984 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
985 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
988 expect_prepare_replay(mock_state_builder
, false, false, 0);
989 expect_is_disconnected(mock_state_builder
, true);
991 // close remote image
992 expect_replay_requires_remote_image(mock_state_builder
, false);
993 expect_close_remote_image(mock_state_builder
, 0);
996 MockThreads
mock_threads(m_threads
);
997 MockInstanceWatcher mock_instance_watcher
;
998 MockBootstrapRequest
*request
= create_request(
999 &mock_threads
, &mock_instance_watcher
, "global image id",
1000 "local mirror uuid", &ctx
);
1002 ASSERT_EQ(0, ctx
.wait());
1005 TEST_F(TestMockImageReplayerBootstrapRequest
, ImageSyncError
) {
1008 // prepare local image
1009 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
1010 MockStateBuilder mock_state_builder
;
1011 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
1012 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
1014 // prepare remote image
1015 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
1016 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
1017 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
1018 expect_is_local_primary(mock_state_builder
, false);
1019 expect_is_remote_primary(mock_state_builder
, true);
1021 // open the remote image
1022 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
1023 MockOpenImageRequest mock_open_image_request
;
1024 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
1025 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
1027 // open the local image
1028 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
1029 MockOpenLocalImageRequest mock_open_local_image_request
;
1030 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
1031 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
1034 expect_prepare_replay(mock_state_builder
, false, true, 0);
1035 expect_is_disconnected(mock_state_builder
, false);
1038 MockImageSync mock_image_sync
;
1039 expect_image_sync(mock_image_sync
, -EINVAL
);
1041 // close remote image
1042 expect_replay_requires_remote_image(mock_state_builder
, false);
1043 expect_close_remote_image(mock_state_builder
, 0);
1046 MockThreads
mock_threads(m_threads
);
1047 MockInstanceWatcher mock_instance_watcher
;
1048 MockBootstrapRequest
*request
= create_request(
1049 &mock_threads
, &mock_instance_watcher
, "global image id",
1050 "local mirror uuid", &ctx
);
1052 ASSERT_EQ(-EINVAL
, ctx
.wait());
1055 TEST_F(TestMockImageReplayerBootstrapRequest
, ImageSyncCanceled
) {
1058 // prepare local image
1059 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
1060 MockStateBuilder mock_state_builder
;
1061 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
1062 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
1064 // prepare remote image
1065 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
1066 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
1067 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
1068 expect_is_local_primary(mock_state_builder
, false);
1069 expect_is_remote_primary(mock_state_builder
, true);
1071 // open the remote image
1072 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
1073 MockOpenImageRequest mock_open_image_request
;
1074 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
1075 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
1077 // open the local image
1078 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
1079 MockOpenLocalImageRequest mock_open_local_image_request
;
1080 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
1081 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
1084 expect_prepare_replay(mock_state_builder
, false, true, 0);
1085 expect_is_disconnected(mock_state_builder
, false);
1087 // close remote image
1088 expect_replay_requires_remote_image(mock_state_builder
, false);
1089 expect_close_remote_image(mock_state_builder
, 0);
1092 MockThreads
mock_threads(m_threads
);
1093 MockInstanceWatcher mock_instance_watcher
;
1094 MockBootstrapRequest
*request
= create_request(
1095 &mock_threads
, &mock_instance_watcher
, "global image id",
1096 "local mirror uuid", &ctx
);
1099 ASSERT_EQ(-ECANCELED
, ctx
.wait());
1102 TEST_F(TestMockImageReplayerBootstrapRequest
, CloseRemoteImageError
) {
1105 // prepare local image
1106 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
1107 MockStateBuilder mock_state_builder
;
1108 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
1109 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
1111 // prepare remote image
1112 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
1113 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
1114 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
1115 expect_is_local_primary(mock_state_builder
, false);
1116 expect_is_remote_primary(mock_state_builder
, true);
1118 // open the remote image
1119 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
1120 MockOpenImageRequest mock_open_image_request
;
1121 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
1122 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
1124 // open the local image
1125 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
1126 MockOpenLocalImageRequest mock_open_local_image_request
;
1127 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
1128 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
1131 expect_prepare_replay(mock_state_builder
, false, false, 0);
1132 expect_is_disconnected(mock_state_builder
, false);
1134 // attempt to close remote image
1135 expect_replay_requires_remote_image(mock_state_builder
, false);
1136 expect_close_remote_image(mock_state_builder
, -EINVAL
);
1139 MockThreads
mock_threads(m_threads
);
1140 MockInstanceWatcher mock_instance_watcher
;
1141 MockBootstrapRequest
*request
= create_request(
1142 &mock_threads
, &mock_instance_watcher
, "global image id",
1143 "local mirror uuid", &ctx
);
1145 ASSERT_EQ(0, ctx
.wait());
1148 TEST_F(TestMockImageReplayerBootstrapRequest
, ReplayRequiresRemoteImage
) {
1151 // prepare local image
1152 MockPrepareLocalImageRequest mock_prepare_local_image_request
;
1153 MockStateBuilder mock_state_builder
;
1154 expect_send(mock_prepare_local_image_request
, mock_state_builder
,
1155 m_local_image_ctx
->id
, m_local_image_ctx
->name
, 0);
1157 // prepare remote image
1158 MockPrepareRemoteImageRequest mock_prepare_remote_image_request
;
1159 expect_send(mock_prepare_remote_image_request
, mock_state_builder
,
1160 "remote mirror uuid", m_remote_image_ctx
->id
, 0);
1161 expect_is_local_primary(mock_state_builder
, false);
1162 expect_is_remote_primary(mock_state_builder
, true);
1164 // open the remote image
1165 librbd::MockTestImageCtx
mock_remote_image_ctx(*m_remote_image_ctx
);
1166 MockOpenImageRequest mock_open_image_request
;
1167 expect_open_image(mock_open_image_request
, m_remote_io_ctx
,
1168 mock_remote_image_ctx
.id
, mock_remote_image_ctx
, 0);
1170 // open the local image
1171 librbd::MockTestImageCtx
mock_local_image_ctx(*m_local_image_ctx
);
1172 MockOpenLocalImageRequest mock_open_local_image_request
;
1173 expect_open_local_image(mock_open_local_image_request
, m_local_io_ctx
,
1174 mock_local_image_ctx
.id
, &mock_local_image_ctx
, 0);
1177 expect_prepare_replay(mock_state_builder
, false, false, 0);
1178 expect_is_disconnected(mock_state_builder
, false);
1180 // remote image is left open
1181 expect_replay_requires_remote_image(mock_state_builder
, true);
1184 MockThreads
mock_threads(m_threads
);
1185 MockInstanceWatcher mock_instance_watcher
;
1186 MockBootstrapRequest
*request
= create_request(
1187 &mock_threads
, &mock_instance_watcher
, "global image id",
1188 "local mirror uuid", &ctx
);
1190 ASSERT_EQ(0, ctx
.wait());
1193 } // namespace image_replayer
1194 } // namespace mirror