]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / test / librbd / deep_copy / test_mock_MetadataCopyRequest.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
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"
12 #include <map>
13
14 namespace librbd {
15 namespace {
16
17 struct MockTestImageCtx : public librbd::MockImageCtx {
18 MockTestImageCtx(librbd::ImageCtx &image_ctx)
19 : librbd::MockImageCtx(image_ctx) {
20 }
21 };
22
23 } // anonymous namespace
24 } // namespace librbd
25
26 // template definitions
27 #include "librbd/deep_copy/MetadataCopyRequest.cc"
28
29 namespace librbd {
30 namespace deep_copy {
31
32 using ::testing::_;
33 using ::testing::DoAll;
34 using ::testing::InSequence;
35 using ::testing::Return;
36 using ::testing::StrEq;
37 using ::testing::WithArg;
38
39 class TestMockDeepCopyMetadataCopyRequest : public TestMockFixture {
40 public:
41 typedef MetadataCopyRequest<librbd::MockTestImageCtx> MockMetadataCopyRequest;
42 typedef std::map<std::string, bufferlist> Metadata;
43
44 librbd::ImageCtx *m_src_image_ctx;
45 librbd::ImageCtx *m_dst_image_ctx;
46 ThreadPool *m_thread_pool;
47 ContextWQ *m_work_queue;
48
49 void SetUp() override {
50 TestMockFixture::SetUp();
51
52 ASSERT_EQ(0, open_image(m_image_name, &m_src_image_ctx));
53
54 librbd::RBD rbd;
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));
58
59 librbd::ImageCtx::get_thread_pool_instance(m_src_image_ctx->cct,
60 &m_thread_pool, &m_work_queue);
61 }
62
63 void expect_metadata_list(librbd::MockTestImageCtx &mock_image_ctx,
64 const Metadata& metadata, int r) {
65 bufferlist out_bl;
66 encode(metadata, out_bl);
67
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)),
72 Return(r)));
73 }
74
75 void expect_metadata_set(librbd::MockTestImageCtx &mock_image_ctx,
76 const Metadata& metadata, int r) {
77 bufferlist in_bl;
78 encode(metadata, in_bl);
79
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), _, _))
83 .WillOnce(Return(r));
84 }
85 };
86
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);
90
91 size_t idx = 1;
92 Metadata key_values_1;
93 for (; idx <= 128; ++idx) {
94 bufferlist bl;
95 bl.append("value" + stringify(idx));
96 key_values_1.emplace("key" + stringify(idx), bl);
97 }
98
99 Metadata key_values_2;
100 for (; idx <= 255; ++idx) {
101 bufferlist bl;
102 bl.append("value" + stringify(idx));
103 key_values_2.emplace("key" + stringify(idx), bl);
104 }
105
106 InSequence seq;
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);
111
112 C_SaferCond ctx;
113 auto request = MockMetadataCopyRequest::create(&mock_src_image_ctx,
114 &mock_dst_image_ctx,
115 &ctx);
116 request->send();
117
118 ASSERT_EQ(0, ctx.wait());
119 }
120
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);
124
125 Metadata key_values;
126
127 InSequence seq;
128 expect_metadata_list(mock_src_image_ctx, key_values, 0);
129
130 C_SaferCond ctx;
131 auto request = MockMetadataCopyRequest::create(&mock_src_image_ctx,
132 &mock_dst_image_ctx,
133 &ctx);
134 request->send();
135
136 ASSERT_EQ(0, ctx.wait());
137 }
138
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);
142
143 Metadata key_values;
144
145 InSequence seq;
146 expect_metadata_list(mock_src_image_ctx, key_values, -EINVAL);
147
148 C_SaferCond ctx;
149 auto request = MockMetadataCopyRequest::create(&mock_src_image_ctx,
150 &mock_dst_image_ctx,
151 &ctx);
152 request->send();
153
154 ASSERT_EQ(-EINVAL, ctx.wait());
155 }
156
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);
160
161 Metadata key_values;
162 bufferlist bl;
163 bl.append("value");
164 key_values.emplace("key", bl);
165
166 InSequence seq;
167 expect_metadata_list(mock_src_image_ctx, key_values, 0);
168 expect_metadata_set(mock_dst_image_ctx, key_values, -EINVAL);
169
170 C_SaferCond ctx;
171 auto request = MockMetadataCopyRequest::create(&mock_src_image_ctx,
172 &mock_dst_image_ctx,
173 &ctx);
174 request->send();
175
176 ASSERT_EQ(-EINVAL, ctx.wait());
177 }
178
179 } // namespace deep_sync
180 } // namespace librbd