1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "test/librbd/test_mock_fixture.h"
5 #include "test/librbd/test_support.h"
6 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
7 #include "test/librados_test_stub/MockTestMemRadosClient.h"
8 #include "cls/lock/cls_lock_ops.h"
9 #include "librbd/managed_lock/ReacquireRequest.h"
10 #include "gmock/gmock.h"
11 #include "gtest/gtest.h"
12 #include <arpa/inet.h>
15 // template definitions
16 #include "librbd/managed_lock/ReacquireRequest.cc"
17 template class librbd::managed_lock::ReacquireRequest<librbd::MockImageCtx>;
21 MATCHER_P(IsLockType, exclusive, "") {
22 cls_lock_set_cookie_op op;
25 bufferlist::iterator iter = bl.begin();
27 return op.type == (exclusive ? LOCK_EXCLUSIVE : LOCK_SHARED);
30 } // anonymous namespace
33 namespace managed_lock {
36 using ::testing::InSequence;
37 using ::testing::Return;
38 using ::testing::StrEq;
41 class TestMockManagedLockReacquireRequest : public TestMockFixture {
43 typedef ReacquireRequest<MockImageCtx> MockReacquireRequest;
45 void expect_set_cookie(MockImageCtx &mock_image_ctx, int r,
46 bool exclusive = true) {
47 EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
48 exec(mock_image_ctx.header_oid, _, StrEq("lock"),
49 StrEq("set_cookie"), IsLockType(exclusive), _, _))
54 TEST_F(TestMockManagedLockReacquireRequest, SuccessExclusive) {
55 librbd::ImageCtx *ictx;
56 ASSERT_EQ(0, open_image(m_image_name, &ictx));
58 MockImageCtx mock_image_ctx(*ictx);
61 expect_set_cookie(mock_image_ctx, 0);
64 MockReacquireRequest *req = MockReacquireRequest::create(
65 mock_image_ctx.md_ctx, mock_image_ctx.header_oid, "old_cookie",
66 "new_cookie", true, &ctx);
68 ASSERT_EQ(0, ctx.wait());
71 TEST_F(TestMockManagedLockReacquireRequest, SuccessShared) {
72 librbd::ImageCtx *ictx;
73 ASSERT_EQ(0, open_image(m_image_name, &ictx));
75 MockImageCtx mock_image_ctx(*ictx);
78 expect_set_cookie(mock_image_ctx, 0, false);
81 MockReacquireRequest *req = MockReacquireRequest::create(
82 mock_image_ctx.md_ctx, mock_image_ctx.header_oid, "old_cookie",
83 "new_cookie", false, &ctx);
85 ASSERT_EQ(0, ctx.wait());
88 TEST_F(TestMockManagedLockReacquireRequest, NotSupported) {
89 librbd::ImageCtx *ictx;
90 ASSERT_EQ(0, open_image(m_image_name, &ictx));
92 MockImageCtx mock_image_ctx(*ictx);
95 expect_set_cookie(mock_image_ctx, -EOPNOTSUPP);
98 MockReacquireRequest *req = MockReacquireRequest::create(
99 mock_image_ctx.md_ctx, mock_image_ctx.header_oid, "old_cookie",
100 "new_cookie", true, &ctx);
102 ASSERT_EQ(-EOPNOTSUPP, ctx.wait());
105 TEST_F(TestMockManagedLockReacquireRequest, Error) {
106 librbd::ImageCtx *ictx;
107 ASSERT_EQ(0, open_image(m_image_name, &ictx));
109 MockImageCtx mock_image_ctx(*ictx);
112 expect_set_cookie(mock_image_ctx, -EBUSY);
115 MockReacquireRequest *req = MockReacquireRequest::create(
116 mock_image_ctx.md_ctx, mock_image_ctx.header_oid, "old_cookie",
117 "new_cookie", true, &ctx);
119 ASSERT_EQ(-EBUSY, ctx.wait());
122 } // namespace managed_lock
123 } // namespace librbd