]>
git.proxmox.com Git - ceph.git/blob - 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
4 #include "include/rados/librados.hpp"
5 #include "include/types.h"
7 #include "cls/version/cls_version_types.h"
8 #include "cls/version/cls_version_client.h"
10 #include "gtest/gtest.h"
11 #include "test/librados/test_cxx.h"
19 static librados::ObjectWriteOperation
*new_op() {
20 return new librados::ObjectWriteOperation();
23 static librados::ObjectReadOperation
*new_rop() {
24 return new librados::ObjectReadOperation();
27 TEST(cls_rgw
, test_version_inc_read
)
29 librados::Rados rados
;
30 librados::IoCtx ioctx
;
31 string pool_name
= get_temp_pool_name();
34 ASSERT_EQ("", create_one_pool_pp(pool_name
, rados
));
35 ASSERT_EQ(0, rados
.ioctx_create(pool_name
.c_str(), ioctx
));
43 ASSERT_EQ(0, ioctx
.create(oid
, true));
47 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
48 ASSERT_EQ(0, (long long)ver
.ver
);
49 ASSERT_EQ(0, (int)ver
.tag
.size());
53 librados::ObjectWriteOperation
*op
= new_op();
55 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
57 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
58 ASSERT_GT((long long)ver
.ver
, 0);
59 ASSERT_NE(0, (int)ver
.tag
.size());
61 /* inc version again! */
65 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
69 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
70 ASSERT_GT((long long)ver2
.ver
, (long long)ver
.ver
);
71 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
77 librados::ObjectReadOperation
*rop
= new_rop();
78 cls_version_read(*rop
, &ver3
);
80 ASSERT_EQ(0, ioctx
.operate(oid
, rop
, &outbl
));
81 ASSERT_EQ(ver2
.ver
, ver3
.ver
);
82 ASSERT_EQ(1, (long long)ver2
.compare(&ver3
));
88 TEST(cls_rgw
, test_version_set
)
90 librados::Rados rados
;
91 librados::IoCtx ioctx
;
92 string pool_name
= get_temp_pool_name();
95 ASSERT_EQ("", create_one_pool_pp(pool_name
, rados
));
96 ASSERT_EQ(0, rados
.ioctx_create(pool_name
.c_str(), ioctx
));
104 ASSERT_EQ(0, ioctx
.create(oid
, true));
108 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
109 ASSERT_EQ(0, (long long)ver
.ver
);
110 ASSERT_EQ(0, (int)ver
.tag
.size());
117 librados::ObjectWriteOperation
*op
= new_op();
118 cls_version_set(*op
, ver
);
119 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
124 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
125 ASSERT_EQ((long long)ver2
.ver
, (long long)ver
.ver
);
126 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
131 TEST(cls_rgw
, test_version_inc_cond
)
133 librados::Rados rados
;
134 librados::IoCtx ioctx
;
135 string pool_name
= get_temp_pool_name();
138 ASSERT_EQ("", create_one_pool_pp(pool_name
, rados
));
139 ASSERT_EQ(0, rados
.ioctx_create(pool_name
.c_str(), ioctx
));
146 ASSERT_EQ(0, ioctx
.create(oid
, true));
150 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
151 ASSERT_EQ(0, (long long)ver
.ver
);
152 ASSERT_EQ(0, (int)ver
.tag
.size());
155 librados::ObjectWriteOperation
*op
= new_op();
156 cls_version_inc(*op
);
157 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
159 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
160 ASSERT_GT((long long)ver
.ver
, 0);
161 ASSERT_NE(0, (int)ver
.tag
.size());
163 obj_version cond_ver
= ver
;
166 /* inc version again! */
169 cls_version_inc(*op
);
170 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
174 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
175 ASSERT_GT((long long)ver2
.ver
, (long long)ver
.ver
);
176 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
179 /* now check various condition tests */
180 cls_version_inc(*op
, cond_ver
, VER_COND_NONE
);
181 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
183 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
184 ASSERT_GT((long long)ver2
.ver
, (long long)ver
.ver
);
185 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
187 /* a bunch of conditions that should fail */
190 cls_version_inc(*op
, cond_ver
, VER_COND_EQ
);
191 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, op
));
195 cls_version_inc(*op
, cond_ver
, VER_COND_LT
);
196 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, op
));
200 cls_version_inc(*op
, cond_ver
, VER_COND_LE
);
201 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, op
));
205 cls_version_inc(*op
, cond_ver
, VER_COND_TAG_NE
);
206 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, op
));
208 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
209 ASSERT_GT((long long)ver2
.ver
, (long long)ver
.ver
);
210 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
212 /* a bunch of conditions that should succeed */
215 cls_version_inc(*op
, ver2
, VER_COND_EQ
);
216 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
220 cls_version_inc(*op
, cond_ver
, VER_COND_GT
);
221 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
225 cls_version_inc(*op
, cond_ver
, VER_COND_GE
);
226 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
230 cls_version_inc(*op
, cond_ver
, VER_COND_TAG_EQ
);
231 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
236 TEST(cls_rgw
, test_version_inc_check
)
238 librados::Rados rados
;
239 librados::IoCtx ioctx
;
240 string pool_name
= get_temp_pool_name();
243 ASSERT_EQ("", create_one_pool_pp(pool_name
, rados
));
244 ASSERT_EQ(0, rados
.ioctx_create(pool_name
.c_str(), ioctx
));
252 ASSERT_EQ(0, ioctx
.create(oid
, true));
256 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
257 ASSERT_EQ(0, (long long)ver
.ver
);
258 ASSERT_EQ(0, (int)ver
.tag
.size());
261 librados::ObjectWriteOperation
*op
= new_op();
262 cls_version_inc(*op
);
263 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
265 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver
));
266 ASSERT_GT((long long)ver
.ver
, 0);
267 ASSERT_NE(0, (int)ver
.tag
.size());
269 obj_version cond_ver
= ver
;
271 /* a bunch of conditions that should succeed */
272 librados::ObjectReadOperation
*rop
= new_rop();
273 cls_version_check(*rop
, cond_ver
, VER_COND_EQ
);
275 ASSERT_EQ(0, ioctx
.operate(oid
, rop
, &bl
));
279 cls_version_check(*rop
, cond_ver
, VER_COND_GE
);
280 ASSERT_EQ(0, ioctx
.operate(oid
, rop
, &bl
));
284 cls_version_check(*rop
, cond_ver
, VER_COND_LE
);
285 ASSERT_EQ(0, ioctx
.operate(oid
, rop
, &bl
));
289 cls_version_check(*rop
, cond_ver
, VER_COND_TAG_EQ
);
290 ASSERT_EQ(0, ioctx
.operate(oid
, rop
, &bl
));
296 cls_version_inc(*op
);
297 ASSERT_EQ(0, ioctx
.operate(oid
, op
));
299 ASSERT_EQ(0, cls_version_read(ioctx
, oid
, &ver2
));
300 ASSERT_GT((long long)ver2
.ver
, (long long)ver
.ver
);
301 ASSERT_EQ(0, (int)ver2
.tag
.compare(ver
.tag
));
305 /* a bunch of conditions that should fail */
308 cls_version_check(*rop
, ver
, VER_COND_LT
);
309 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, rop
, &bl
));
313 cls_version_check(*rop
, cond_ver
, VER_COND_LE
);
314 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, rop
, &bl
));
318 cls_version_check(*rop
, cond_ver
, VER_COND_TAG_NE
);
319 ASSERT_EQ(-ECANCELED
, ioctx
.operate(oid
, rop
, &bl
));