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 "include/rbd/librbd.hpp"
6 #include "include/stringify.h"
7 #include "librbd/ImageCtx.h"
8 #include "librbd/deep_copy/MetadataCopyRequest.h"
9 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
10 #include "test/librbd/mock/MockImageCtx.h"
11 #include "test/librbd/test_support.h"
17 struct MockTestImageCtx
: public librbd::MockImageCtx
{
18 MockTestImageCtx(librbd::ImageCtx
&image_ctx
)
19 : librbd::MockImageCtx(image_ctx
) {
23 } // anonymous namespace
26 // template definitions
27 #include "librbd/deep_copy/MetadataCopyRequest.cc"
33 using ::testing::DoAll
;
34 using ::testing::InSequence
;
35 using ::testing::Return
;
36 using ::testing::StrEq
;
37 using ::testing::WithArg
;
39 class TestMockDeepCopyMetadataCopyRequest
: public TestMockFixture
{
41 typedef MetadataCopyRequest
<librbd::MockTestImageCtx
> MockMetadataCopyRequest
;
42 typedef std::map
<std::string
, bufferlist
> Metadata
;
44 librbd::ImageCtx
*m_src_image_ctx
;
45 librbd::ImageCtx
*m_dst_image_ctx
;
46 ThreadPool
*m_thread_pool
;
47 ContextWQ
*m_work_queue
;
49 void SetUp() override
{
50 TestMockFixture::SetUp();
52 ASSERT_EQ(0, open_image(m_image_name
, &m_src_image_ctx
));
55 std::string dst_image_name
= get_temp_image_name();
56 ASSERT_EQ(0, create_image_pp(rbd
, m_ioctx
, dst_image_name
, m_image_size
));
57 ASSERT_EQ(0, open_image(dst_image_name
, &m_dst_image_ctx
));
59 librbd::ImageCtx::get_thread_pool_instance(m_src_image_ctx
->cct
,
60 &m_thread_pool
, &m_work_queue
);
63 void expect_metadata_list(librbd::MockTestImageCtx
&mock_image_ctx
,
64 const Metadata
& metadata
, int r
) {
66 encode(metadata
, out_bl
);
68 EXPECT_CALL(get_mock_io_ctx(mock_image_ctx
.md_ctx
),
69 exec(mock_image_ctx
.header_oid
, _
, StrEq("rbd"),
70 StrEq("metadata_list"), _
, _
, _
))
71 .WillOnce(DoAll(WithArg
<5>(CopyInBufferlist(out_bl
)),
75 void expect_metadata_set(librbd::MockTestImageCtx
&mock_image_ctx
,
76 const Metadata
& metadata
, int r
) {
78 encode(metadata
, in_bl
);
80 EXPECT_CALL(get_mock_io_ctx(mock_image_ctx
.md_ctx
),
81 exec(mock_image_ctx
.header_oid
, _
, StrEq("rbd"),
82 StrEq("metadata_set"), ContentsEqual(in_bl
), _
, _
))
87 TEST_F(TestMockDeepCopyMetadataCopyRequest
, Success
) {
88 librbd::MockTestImageCtx
mock_src_image_ctx(*m_src_image_ctx
);
89 librbd::MockTestImageCtx
mock_dst_image_ctx(*m_dst_image_ctx
);
92 Metadata key_values_1
;
93 for (; idx
<= 128; ++idx
) {
95 bl
.append("value" + stringify(idx
));
96 key_values_1
.emplace("key" + stringify(idx
), bl
);
99 Metadata key_values_2
;
100 for (; idx
<= 255; ++idx
) {
102 bl
.append("value" + stringify(idx
));
103 key_values_2
.emplace("key" + stringify(idx
), bl
);
107 expect_metadata_list(mock_src_image_ctx
, key_values_1
, 0);
108 expect_metadata_set(mock_dst_image_ctx
, key_values_1
, 0);
109 expect_metadata_list(mock_src_image_ctx
, key_values_2
, 0);
110 expect_metadata_set(mock_dst_image_ctx
, key_values_2
, 0);
113 auto request
= MockMetadataCopyRequest::create(&mock_src_image_ctx
,
118 ASSERT_EQ(0, ctx
.wait());
121 TEST_F(TestMockDeepCopyMetadataCopyRequest
, Empty
) {
122 librbd::MockTestImageCtx
mock_src_image_ctx(*m_src_image_ctx
);
123 librbd::MockTestImageCtx
mock_dst_image_ctx(*m_dst_image_ctx
);
128 expect_metadata_list(mock_src_image_ctx
, key_values
, 0);
131 auto request
= MockMetadataCopyRequest::create(&mock_src_image_ctx
,
136 ASSERT_EQ(0, ctx
.wait());
139 TEST_F(TestMockDeepCopyMetadataCopyRequest
, MetadataListError
) {
140 librbd::MockTestImageCtx
mock_src_image_ctx(*m_src_image_ctx
);
141 librbd::MockTestImageCtx
mock_dst_image_ctx(*m_dst_image_ctx
);
146 expect_metadata_list(mock_src_image_ctx
, key_values
, -EINVAL
);
149 auto request
= MockMetadataCopyRequest::create(&mock_src_image_ctx
,
154 ASSERT_EQ(-EINVAL
, ctx
.wait());
157 TEST_F(TestMockDeepCopyMetadataCopyRequest
, MetadataSetError
) {
158 librbd::MockTestImageCtx
mock_src_image_ctx(*m_src_image_ctx
);
159 librbd::MockTestImageCtx
mock_dst_image_ctx(*m_dst_image_ctx
);
164 key_values
.emplace("key", bl
);
167 expect_metadata_list(mock_src_image_ctx
, key_values
, 0);
168 expect_metadata_set(mock_dst_image_ctx
, key_values
, -EINVAL
);
171 auto request
= MockMetadataCopyRequest::create(&mock_src_image_ctx
,
176 ASSERT_EQ(-EINVAL
, ctx
.wait());
179 } // namespace deep_sync
180 } // namespace librbd