+TEST_F(TestMockMirrorStatusUpdater, RemoveStatus) {
+ MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx,
+ m_mock_threads, "");
+ MockMirrorStatusWatcher* mock_mirror_status_watcher =
+ new MockMirrorStatusWatcher();
+
+ InSequence seq;
+
+ Context* timer_event = nullptr;
+ init_mirror_status_updater(mock_mirror_status_updater,
+ *mock_mirror_status_watcher, &timer_event);
+
+ C_SaferCond ctx;
+ mock_mirror_status_updater.set_mirror_image_status("1", {}, false);
+ expect_work_queue(false);
+ mock_mirror_status_updater.remove_mirror_image_status("1", false, &ctx);
+ ASSERT_EQ(0, ctx.wait());
+
+ Context* update_task = nullptr;
+ fire_timer_event(&timer_event, &update_task);
+
+ C_SaferCond remove_flush_ctx;
+ EXPECT_CALL(*m_mock_local_io_ctx, aio_operate(_, _, _, _, _))
+ .WillOnce(Invoke([this, &remove_flush_ctx](auto&&... args) {
+ int r = m_mock_local_io_ctx->do_aio_operate(decltype(args)(args)...);
+ m_mock_local_io_ctx->aio_flush();
+ remove_flush_ctx.complete(r);
+ return r;
+ }));
+ expect_mirror_status_remove("1", 0);
+ update_task->complete(0);
+ ASSERT_EQ(0, remove_flush_ctx.wait());
+
+ shut_down_mirror_status_updater(mock_mirror_status_updater,
+ *mock_mirror_status_watcher);
+}
+
+TEST_F(TestMockMirrorStatusUpdater, OverwriteRemoveStatus) {
+ MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx,
+ m_mock_threads, "");
+ MockMirrorStatusWatcher* mock_mirror_status_watcher =
+ new MockMirrorStatusWatcher();
+
+ InSequence seq;
+
+ Context* timer_event = nullptr;
+ init_mirror_status_updater(mock_mirror_status_updater,
+ *mock_mirror_status_watcher, &timer_event);
+
+ C_SaferCond ctx;
+ mock_mirror_status_updater.set_mirror_image_status("1", {}, false);
+ expect_work_queue(false);
+ mock_mirror_status_updater.remove_mirror_image_status("1", false, &ctx);
+ ASSERT_EQ(0, ctx.wait());
+ mock_mirror_status_updater.set_mirror_image_status(
+ "1", {"", cls::rbd::MIRROR_IMAGE_STATUS_STATE_REPLAYING, "description"},
+ false);
+
+
+ Context* update_task = nullptr;
+ fire_timer_event(&timer_event, &update_task);
+
+ expect_mirror_status_update(
+ {{"1", cls::rbd::MirrorImageSiteStatus{
+ "", cls::rbd::MIRROR_IMAGE_STATUS_STATE_REPLAYING, "description"}}},
+ "", 0);
+ update_task->complete(0);
+
+ shut_down_mirror_status_updater(mock_mirror_status_updater,
+ *mock_mirror_status_watcher);
+}
+