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 "librbd/internal.h"
8 #include "librbd/object_map/InvalidateRequest.h"
9 #include "gmock/gmock.h"
10 #include "gtest/gtest.h"
13 namespace object_map
{
16 using ::testing::DoDefault
;
17 using ::testing::Return
;
18 using ::testing::StrEq
;
20 class TestMockObjectMapInvalidateRequest
: public TestMockFixture
{
24 TEST_F(TestMockObjectMapInvalidateRequest
, UpdatesInMemoryFlag
) {
25 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP
);
27 librbd::ImageCtx
*ictx
;
28 ASSERT_EQ(0, open_image(m_image_name
, &ictx
));
30 ASSERT_EQ(0, ictx
->test_flags(RBD_FLAG_OBJECT_MAP_INVALID
, &flags_set
));
31 ASSERT_FALSE(flags_set
);
34 AsyncRequest
<> *request
= new InvalidateRequest
<>(*ictx
, CEPH_NOSNAP
, false, &cond_ctx
);
36 EXPECT_CALL(get_mock_io_ctx(ictx
->md_ctx
),
37 exec(ictx
->header_oid
, _
, StrEq("rbd"), StrEq("set_flags"), _
, _
, _
))
41 RWLock::RLocker
owner_locker(ictx
->owner_lock
);
42 RWLock::WLocker
snap_locker(ictx
->snap_lock
);
45 ASSERT_EQ(0, cond_ctx
.wait());
47 ASSERT_EQ(0, ictx
->test_flags(RBD_FLAG_OBJECT_MAP_INVALID
, &flags_set
));
48 ASSERT_TRUE(flags_set
);
51 TEST_F(TestMockObjectMapInvalidateRequest
, UpdatesHeadOnDiskFlag
) {
52 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP
);
54 librbd::ImageCtx
*ictx
;
55 ASSERT_EQ(0, open_image(m_image_name
, &ictx
));
56 ASSERT_EQ(0, acquire_exclusive_lock(*ictx
));
59 AsyncRequest
<> *request
= new InvalidateRequest
<>(*ictx
, CEPH_NOSNAP
, false, &cond_ctx
);
61 EXPECT_CALL(get_mock_io_ctx(ictx
->md_ctx
),
62 exec(ictx
->header_oid
, _
, StrEq("rbd"), StrEq("set_flags"), _
, _
, _
))
63 .WillOnce(DoDefault());
66 RWLock::RLocker
owner_locker(ictx
->owner_lock
);
67 RWLock::WLocker
snap_locker(ictx
->snap_lock
);
70 ASSERT_EQ(0, cond_ctx
.wait());
72 expect_unlock_exclusive_lock(*ictx
);
75 TEST_F(TestMockObjectMapInvalidateRequest
, UpdatesSnapOnDiskFlag
) {
76 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP
);
78 librbd::ImageCtx
*ictx
;
79 ASSERT_EQ(0, open_image(m_image_name
, &ictx
));
81 ASSERT_EQ(0, snap_create(*ictx
, "snap1"));
82 ASSERT_EQ(0, librbd::snap_set(ictx
,
83 cls::rbd::UserSnapshotNamespace(),
87 AsyncRequest
<> *request
= new InvalidateRequest
<>(*ictx
, ictx
->snap_id
, false,
90 EXPECT_CALL(get_mock_io_ctx(ictx
->md_ctx
),
91 exec(ictx
->header_oid
, _
, StrEq("rbd"), StrEq("set_flags"), _
, _
, _
))
92 .WillOnce(DoDefault());
95 RWLock::RLocker
owner_locker(ictx
->owner_lock
);
96 RWLock::WLocker
snap_locker(ictx
->snap_lock
);
99 ASSERT_EQ(0, cond_ctx
.wait());
102 TEST_F(TestMockObjectMapInvalidateRequest
, SkipOnDiskUpdateWithoutLock
) {
103 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP
);
105 librbd::ImageCtx
*ictx
;
106 ASSERT_EQ(0, open_image(m_image_name
, &ictx
));
108 C_SaferCond cond_ctx
;
109 AsyncRequest
<> *request
= new InvalidateRequest
<>(*ictx
, CEPH_NOSNAP
, false, &cond_ctx
);
111 EXPECT_CALL(get_mock_io_ctx(ictx
->md_ctx
),
112 exec(ictx
->header_oid
, _
, StrEq("rbd"), StrEq("set_flags"), _
, _
, _
))
116 RWLock::RLocker
owner_locker(ictx
->owner_lock
);
117 RWLock::WLocker
snap_locker(ictx
->snap_lock
);
120 ASSERT_EQ(0, cond_ctx
.wait());
122 expect_unlock_exclusive_lock(*ictx
);
125 TEST_F(TestMockObjectMapInvalidateRequest
, IgnoresOnDiskUpdateFailure
) {
126 REQUIRE_FEATURE(RBD_FEATURE_OBJECT_MAP
);
128 librbd::ImageCtx
*ictx
;
129 ASSERT_EQ(0, open_image(m_image_name
, &ictx
));
130 ASSERT_EQ(0, acquire_exclusive_lock(*ictx
));
132 C_SaferCond cond_ctx
;
133 AsyncRequest
<> *request
= new InvalidateRequest
<>(*ictx
, CEPH_NOSNAP
, false, &cond_ctx
);
135 EXPECT_CALL(get_mock_io_ctx(ictx
->md_ctx
),
136 exec(ictx
->header_oid
, _
, StrEq("rbd"), StrEq("set_flags"), _
, _
, _
))
137 .WillOnce(Return(-EINVAL
));
140 RWLock::RLocker
owner_locker(ictx
->owner_lock
);
141 RWLock::WLocker
snap_locker(ictx
->snap_lock
);
144 ASSERT_EQ(0, cond_ctx
.wait());
146 expect_unlock_exclusive_lock(*ictx
);
149 } // namespace object_map
150 } // namespace librbd