};
TEST_F(TestMockImagePreRemoveRequest, Success) {
- MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
+ MockExclusiveLock mock_exclusive_lock;
if (m_test_imctx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) {
- m_mock_imctx->exclusive_lock = mock_exclusive_lock;
+ m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
}
expect_op_work_queue(*m_mock_imctx);
InSequence seq;
expect_set_journal_policy(*m_mock_imctx);
- expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, 0);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0);
+ expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, true);
MockListWatchersRequest mock_list_watchers_request;
expect_list_image_watchers(*m_mock_imctx, mock_list_watchers_request, 0);
expect_get_group(*m_mock_imctx, 0);
C_SaferCond ctx;
- auto req = MockPreRemoveRequest::create(m_mock_imctx, true, &ctx);
+ auto req = MockPreRemoveRequest::create(m_mock_imctx, false, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
ASSERT_EQ(-EROFS, ctx.wait());
}
-TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockShutDownFailed) {
+TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockTryAcquireFailed) {
REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
- MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
- if (m_test_imctx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) {
- m_mock_imctx->exclusive_lock = mock_exclusive_lock;
- }
+ MockExclusiveLock mock_exclusive_lock;
+ m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
expect_op_work_queue(*m_mock_imctx);
expect_test_features(*m_mock_imctx);
InSequence seq;
expect_set_journal_policy(*m_mock_imctx);
- expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, -EINVAL);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock,
+ -EINVAL);
C_SaferCond ctx;
- auto req = MockPreRemoveRequest::create(m_mock_imctx, true, &ctx);
+ auto req = MockPreRemoveRequest::create(m_mock_imctx, false, &ctx);
req->send();
- ASSERT_EQ(-EINVAL, ctx.wait());
+ ASSERT_EQ(-EBUSY, ctx.wait());
}
-TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockTryAcquireFailed) {
+TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockTryAcquireNotLockOwner) {
REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
MockExclusiveLock mock_exclusive_lock;
- if (m_test_imctx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) {
- m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
- }
+ m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
expect_op_work_queue(*m_mock_imctx);
expect_test_features(*m_mock_imctx);
InSequence seq;
expect_set_journal_policy(*m_mock_imctx);
- expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock,
- -EINVAL);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0);
+ expect_is_exclusive_lock_owner(*m_mock_imctx, mock_exclusive_lock, false);
C_SaferCond ctx;
auto req = MockPreRemoveRequest::create(m_mock_imctx, false, &ctx);
ASSERT_EQ(-EBUSY, ctx.wait());
}
+TEST_F(TestMockImagePreRemoveRequest, Force) {
+ REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
+
+ MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
+ m_mock_imctx->exclusive_lock = mock_exclusive_lock;
+
+ expect_op_work_queue(*m_mock_imctx);
+ expect_test_features(*m_mock_imctx);
+
+ InSequence seq;
+ expect_set_journal_policy(*m_mock_imctx);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock,
+ -EINVAL);
+ expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, 0);
+
+ MockListWatchersRequest mock_list_watchers_request;
+ expect_list_image_watchers(*m_mock_imctx, mock_list_watchers_request, 0);
+
+ expect_get_group(*m_mock_imctx, 0);
+
+ C_SaferCond ctx;
+ auto req = MockPreRemoveRequest::create(m_mock_imctx, true, &ctx);
+ req->send();
+
+ ASSERT_EQ(0, ctx.wait());
+}
+
+TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockShutDownFailed) {
+ REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
+
+ MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
+ m_mock_imctx->exclusive_lock = mock_exclusive_lock;
+
+ expect_op_work_queue(*m_mock_imctx);
+ expect_test_features(*m_mock_imctx);
+
+ InSequence seq;
+ expect_set_journal_policy(*m_mock_imctx);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, -EINVAL);
+ expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, -EINVAL);
+
+ C_SaferCond ctx;
+ auto req = MockPreRemoveRequest::create(m_mock_imctx, true, &ctx);
+ req->send();
+
+ ASSERT_EQ(-EINVAL, ctx.wait());
+}
+
TEST_F(TestMockImagePreRemoveRequest, Migration) {
m_mock_imctx->features |= RBD_FEATURE_MIGRATING;