]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/cls_version/test_cls_version.cc
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / test / cls_version / test_cls_version.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 "include/types.h"
5 #include "cls/version/cls_version_types.h"
6 #include "cls/version/cls_version_client.h"
7
8 #include "gtest/gtest.h"
9 #include "test/librados/test.h"
10
11 #include <errno.h>
12 #include <string>
13 #include <vector>
14
15 static librados::ObjectWriteOperation *new_op() {
16 return new librados::ObjectWriteOperation();
17 }
18
19 static librados::ObjectReadOperation *new_rop() {
20 return new librados::ObjectReadOperation();
21 }
22
23 TEST(cls_rgw, test_version_inc_read)
24 {
25 librados::Rados rados;
26 librados::IoCtx ioctx;
27 string pool_name = get_temp_pool_name();
28
29 /* create pool */
30 ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
31 ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
32
33 /* add chains */
34 string oid = "obj";
35
36
37 /* create object */
38
39 ASSERT_EQ(0, ioctx.create(oid, true));
40
41 obj_version ver;
42
43 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
44 ASSERT_EQ(0, (long long)ver.ver);
45 ASSERT_EQ(0, (int)ver.tag.size());
46
47
48 /* inc version */
49 librados::ObjectWriteOperation *op = new_op();
50 cls_version_inc(*op);
51 ASSERT_EQ(0, ioctx.operate(oid, op));
52
53 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
54 ASSERT_GT((long long)ver.ver, 0);
55 ASSERT_NE(0, (int)ver.tag.size());
56
57 /* inc version again! */
58 delete op;
59 op = new_op();
60 cls_version_inc(*op);
61 ASSERT_EQ(0, ioctx.operate(oid, op));
62
63 obj_version ver2;
64
65 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
66 ASSERT_GT((long long)ver2.ver, (long long)ver.ver);
67 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
68
69 delete op;
70
71 obj_version ver3;
72
73 librados::ObjectReadOperation *rop = new_rop();
74 cls_version_read(*rop, &ver3);
75 bufferlist outbl;
76 ASSERT_EQ(0, ioctx.operate(oid, rop, &outbl));
77 ASSERT_EQ(ver2.ver, ver3.ver);
78 ASSERT_EQ(1, (long long)ver2.compare(&ver3));
79
80 delete rop;
81 }
82
83
84 TEST(cls_rgw, test_version_set)
85 {
86 librados::Rados rados;
87 librados::IoCtx ioctx;
88 string pool_name = get_temp_pool_name();
89
90 /* create pool */
91 ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
92 ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
93
94 /* add chains */
95 string oid = "obj";
96
97
98 /* create object */
99
100 ASSERT_EQ(0, ioctx.create(oid, true));
101
102 obj_version ver;
103
104 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
105 ASSERT_EQ(0, (long long)ver.ver);
106 ASSERT_EQ(0, (int)ver.tag.size());
107
108
109 ver.ver = 123;
110 ver.tag = "foo";
111
112 /* set version */
113 librados::ObjectWriteOperation *op = new_op();
114 cls_version_set(*op, ver);
115 ASSERT_EQ(0, ioctx.operate(oid, op));
116
117 /* read version */
118 obj_version ver2;
119
120 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
121 ASSERT_EQ((long long)ver2.ver, (long long)ver.ver);
122 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
123
124 delete op;
125 }
126
127 TEST(cls_rgw, test_version_inc_cond)
128 {
129 librados::Rados rados;
130 librados::IoCtx ioctx;
131 string pool_name = get_temp_pool_name();
132
133 /* create pool */
134 ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
135 ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
136
137 /* add chains */
138 string oid = "obj";
139
140 /* create object */
141
142 ASSERT_EQ(0, ioctx.create(oid, true));
143
144 obj_version ver;
145
146 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
147 ASSERT_EQ(0, (long long)ver.ver);
148 ASSERT_EQ(0, (int)ver.tag.size());
149
150 /* inc version */
151 librados::ObjectWriteOperation *op = new_op();
152 cls_version_inc(*op);
153 ASSERT_EQ(0, ioctx.operate(oid, op));
154
155 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
156 ASSERT_GT((long long)ver.ver, 0);
157 ASSERT_NE(0, (int)ver.tag.size());
158
159 obj_version cond_ver = ver;
160
161
162 /* inc version again! */
163 delete op;
164 op = new_op();
165 cls_version_inc(*op);
166 ASSERT_EQ(0, ioctx.operate(oid, op));
167
168 obj_version ver2;
169
170 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
171 ASSERT_GT((long long)ver2.ver, (long long)ver.ver);
172 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
173
174
175 /* now check various condition tests */
176 cls_version_inc(*op, cond_ver, VER_COND_NONE);
177 ASSERT_EQ(0, ioctx.operate(oid, op));
178
179 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
180 ASSERT_GT((long long)ver2.ver, (long long)ver.ver);
181 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
182
183 /* a bunch of conditions that should fail */
184 delete op;
185 op = new_op();
186 cls_version_inc(*op, cond_ver, VER_COND_EQ);
187 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, op));
188
189 delete op;
190 op = new_op();
191 cls_version_inc(*op, cond_ver, VER_COND_LT);
192 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, op));
193
194 delete op;
195 op = new_op();
196 cls_version_inc(*op, cond_ver, VER_COND_LE);
197 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, op));
198
199 delete op;
200 op = new_op();
201 cls_version_inc(*op, cond_ver, VER_COND_TAG_NE);
202 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, op));
203
204 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
205 ASSERT_GT((long long)ver2.ver, (long long)ver.ver);
206 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
207
208 /* a bunch of conditions that should succeed */
209 delete op;
210 op = new_op();
211 cls_version_inc(*op, ver2, VER_COND_EQ);
212 ASSERT_EQ(0, ioctx.operate(oid, op));
213
214 delete op;
215 op = new_op();
216 cls_version_inc(*op, cond_ver, VER_COND_GT);
217 ASSERT_EQ(0, ioctx.operate(oid, op));
218
219 delete op;
220 op = new_op();
221 cls_version_inc(*op, cond_ver, VER_COND_GE);
222 ASSERT_EQ(0, ioctx.operate(oid, op));
223
224 delete op;
225 op = new_op();
226 cls_version_inc(*op, cond_ver, VER_COND_TAG_EQ);
227 ASSERT_EQ(0, ioctx.operate(oid, op));
228
229 delete op;
230 }
231
232 TEST(cls_rgw, test_version_inc_check)
233 {
234 librados::Rados rados;
235 librados::IoCtx ioctx;
236 string pool_name = get_temp_pool_name();
237
238 /* create pool */
239 ASSERT_EQ("", create_one_pool_pp(pool_name, rados));
240 ASSERT_EQ(0, rados.ioctx_create(pool_name.c_str(), ioctx));
241
242 /* add chains */
243 string oid = "obj";
244
245
246 /* create object */
247
248 ASSERT_EQ(0, ioctx.create(oid, true));
249
250 obj_version ver;
251
252 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
253 ASSERT_EQ(0, (long long)ver.ver);
254 ASSERT_EQ(0, (int)ver.tag.size());
255
256 /* inc version */
257 librados::ObjectWriteOperation *op = new_op();
258 cls_version_inc(*op);
259 ASSERT_EQ(0, ioctx.operate(oid, op));
260
261 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver));
262 ASSERT_GT((long long)ver.ver, 0);
263 ASSERT_NE(0, (int)ver.tag.size());
264
265 obj_version cond_ver = ver;
266
267 /* a bunch of conditions that should succeed */
268 librados::ObjectReadOperation *rop = new_rop();
269 cls_version_check(*rop, cond_ver, VER_COND_EQ);
270 bufferlist bl;
271 ASSERT_EQ(0, ioctx.operate(oid, rop, &bl));
272
273 delete rop;
274 rop = new_rop();
275 cls_version_check(*rop, cond_ver, VER_COND_GE);
276 ASSERT_EQ(0, ioctx.operate(oid, rop, &bl));
277
278 delete rop;
279 rop = new_rop();
280 cls_version_check(*rop, cond_ver, VER_COND_LE);
281 ASSERT_EQ(0, ioctx.operate(oid, rop, &bl));
282
283 delete rop;
284 rop = new_rop();
285 cls_version_check(*rop, cond_ver, VER_COND_TAG_EQ);
286 ASSERT_EQ(0, ioctx.operate(oid, rop, &bl));
287
288 obj_version ver2;
289
290 delete op;
291 op = new_op();
292 cls_version_inc(*op);
293 ASSERT_EQ(0, ioctx.operate(oid, op));
294
295 ASSERT_EQ(0, cls_version_read(ioctx, oid, &ver2));
296 ASSERT_GT((long long)ver2.ver, (long long)ver.ver);
297 ASSERT_EQ(0, (int)ver2.tag.compare(ver.tag));
298
299 delete op;
300
301 /* a bunch of conditions that should fail */
302 delete rop;
303 rop = new_rop();
304 cls_version_check(*rop, ver, VER_COND_LT);
305 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, rop, &bl));
306
307 delete rop;
308 rop = new_rop();
309 cls_version_check(*rop, cond_ver, VER_COND_LE);
310 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, rop, &bl));
311
312 delete rop;
313 rop = new_rop();
314 cls_version_check(*rop, cond_ver, VER_COND_TAG_NE);
315 ASSERT_EQ(-ECANCELED, ioctx.operate(oid, rop, &bl));
316
317 delete rop;
318 }