Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / 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 }