Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / libradosstriper / io.cc
1 #include "include/rados/librados.h"
2 #include "include/rados/librados.hpp"
3 #include "include/radosstriper/libradosstriper.h"
4 #include "include/radosstriper/libradosstriper.hpp"
5 #include "test/librados/test.h"
6 #include "test/libradosstriper/TestCase.h"
7
8 #include <fcntl.h>
9 #include <errno.h>
10 #include "gtest/gtest.h"
11
12 using namespace librados;
13 using namespace libradosstriper;
14 using std::string;
15
16 TEST_F(StriperTest, SimpleWrite) {
17   char buf[128];
18   memset(buf, 0xcc, sizeof(buf));
19   ASSERT_EQ(0, rados_striper_write(striper, "SimpleWrite", buf, sizeof(buf), 0));
20 }
21
22 TEST_F(StriperTestPP, SimpleWritePP) {
23   char buf[128];
24   memset(buf, 0xcc, sizeof(buf));
25   bufferlist bl;
26   bl.append(buf, sizeof(buf));
27   ASSERT_EQ(0, striper.write("SimpleWritePP", bl, sizeof(buf), 0));
28 }
29
30 TEST_F(StriperTest, SimpleWriteFull) {
31   char buf[128];
32   memset(buf, 0xcc, sizeof(buf));
33   ASSERT_EQ(0, rados_striper_write_full(striper, "SimpleWrite", buf, sizeof(buf)));
34 }
35
36 TEST_F(StriperTestPP, SimpleWriteFullPP) {
37   char buf[128];
38   memset(buf, 0xcc, sizeof(buf));
39   bufferlist bl;
40   bl.append(buf, sizeof(buf));
41   ASSERT_EQ(0, striper.write_full("SimpleWritePP", bl));
42 }
43
44 TEST_F(StriperTest, Stat) {
45   uint64_t psize;
46   time_t pmtime;
47   char buf[128];
48   memset(buf, 0xcc, sizeof(buf));
49   ASSERT_EQ(0, rados_striper_write(striper, "Stat", buf, sizeof(buf), 0));
50   ASSERT_EQ(0, rados_striper_stat(striper, "Stat", &psize, &pmtime));
51   ASSERT_EQ(psize, sizeof(buf));
52   ASSERT_EQ(-ENOENT, rados_striper_stat(striper, "nonexistent", &psize, &pmtime));
53 }
54
55 TEST_F(StriperTestPP, StatPP) {
56   char buf[128];
57   memset(buf, 0xcc, sizeof(buf));
58   bufferlist bl;
59   bl.append(buf, sizeof(buf));
60   ASSERT_EQ(0, striper.write("Statpp", bl, sizeof(buf), 0));
61   uint64_t psize;
62   time_t pmtime;
63   ASSERT_EQ(0, striper.stat("Statpp", &psize, &pmtime));
64   ASSERT_EQ(psize, sizeof(buf));
65   ASSERT_EQ(-ENOENT, striper.stat("nonexistent", &psize, &pmtime));
66 }
67
68 TEST_F(StriperTest, RoundTrip) {
69   char buf[128];
70   char buf2[sizeof(buf)];
71   memset(buf, 0xcc, sizeof(buf));
72   ASSERT_EQ(0, rados_striper_write(striper, "RoundTrip", buf, sizeof(buf), 0));
73   memset(buf2, 0, sizeof(buf2));
74   ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "RoundTrip", buf2, sizeof(buf2), 0));
75   ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
76 }
77
78 TEST_F(StriperTestPP, RoundTripPP) {
79   char buf[128];
80   memset(buf, 0xcc, sizeof(buf));
81   bufferlist bl;
82   bl.append(buf, sizeof(buf));
83   ASSERT_EQ(0, striper.write("RoundTripPP", bl, sizeof(buf), 0));
84   bufferlist cl;
85   ASSERT_EQ((int)sizeof(buf), striper.read("RoundTripPP", &cl, sizeof(buf), 0));
86   ASSERT_EQ(0, memcmp(buf, cl.c_str(), sizeof(buf)));
87 }
88
89 TEST_F(StriperTest, OverlappingWriteRoundTrip) {
90   char buf[128];
91   char buf2[64];
92   char buf3[sizeof(buf)];
93   memset(buf, 0xcc, sizeof(buf));
94   ASSERT_EQ(0, rados_striper_write(striper, "OverlappingWriteRoundTrip", buf, sizeof(buf), 0));
95   memset(buf2, 0xdd, sizeof(buf2));
96   ASSERT_EQ(0, rados_striper_write(striper, "OverlappingWriteRoundTrip", buf2, sizeof(buf2), 0));
97   memset(buf3, 0, sizeof(buf3));
98   ASSERT_EQ((int)sizeof(buf3), rados_striper_read(striper, "OverlappingWriteRoundTrip", buf3, sizeof(buf3), 0));
99   ASSERT_EQ(0, memcmp(buf3, buf2, sizeof(buf2)));
100   ASSERT_EQ(0, memcmp(buf3 + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2)));
101 }
102
103 TEST_F(StriperTestPP, OverlappingWriteRoundTripPP) {
104   char buf[128];
105   memset(buf, 0xcc, sizeof(buf));
106   bufferlist bl1;
107   bl1.append(buf, sizeof(buf));
108   ASSERT_EQ(0, striper.write("OverlappingWriteRoundTripPP", bl1, sizeof(buf), 0));
109   char buf2[64];
110   memset(buf2, 0xdd, sizeof(buf2));
111   bufferlist bl2;
112   bl2.append(buf2, sizeof(buf2));
113   ASSERT_EQ(0, striper.write("OverlappingWriteRoundTripPP", bl2, sizeof(buf2), 0));
114   bufferlist bl3;
115   ASSERT_EQ((int)sizeof(buf), striper.read("OverlappingWriteRoundTripPP", &bl3, sizeof(buf), 0));
116   ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2)));
117   ASSERT_EQ(0, memcmp(bl3.c_str() + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2)));
118 }
119
120 TEST_F(StriperTest, SparseWriteRoundTrip) {
121   char buf[128];
122   char buf2[2*sizeof(buf)];
123   memset(buf, 0xcc, sizeof(buf));
124   ASSERT_EQ(0, rados_striper_write(striper, "SparseWriteRoundTrip", buf, sizeof(buf), 0));
125   ASSERT_EQ(0, rados_striper_write(striper, "SparseWriteRoundTrip", buf, sizeof(buf), 1000000000));
126   memset(buf2, 0xaa, sizeof(buf2));
127   ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "SparseWriteRoundTrip", buf2, sizeof(buf2), 0));
128   ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
129   memset(buf, 0, sizeof(buf));
130   ASSERT_EQ(0, memcmp(buf, buf2+sizeof(buf), sizeof(buf)));
131   memset(buf2, 0xaa, sizeof(buf2));
132   ASSERT_EQ((int)sizeof(buf), rados_striper_read(striper, "SparseWriteRoundTrip", buf2, sizeof(buf), 500000000));
133   ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
134 }
135
136 TEST_F(StriperTestPP, SparseWriteRoundTripPP) {
137   char buf[128];
138   memset(buf, 0xcc, sizeof(buf));
139   bufferlist bl1;
140   bl1.append(buf, sizeof(buf));
141   ASSERT_EQ(0, striper.write("SparseWriteRoundTripPP", bl1, sizeof(buf), 0));
142   ASSERT_EQ(0, striper.write("SparseWriteRoundTripPP", bl1, sizeof(buf), 1000000000));
143   bufferlist bl2;
144   ASSERT_EQ((int)(2*sizeof(buf)), striper.read("SparseWriteRoundTripPP", &bl2, 2*sizeof(buf), 0));
145   ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
146   memset(buf, 0, sizeof(buf));
147   ASSERT_EQ(0, memcmp(bl2.c_str()+sizeof(buf), buf, sizeof(buf)));
148   ASSERT_EQ((int)sizeof(buf), striper.read("SparseWriteRoundTripPP", &bl2, sizeof(buf), 500000000));
149   ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
150 }
151
152 TEST_F(StriperTest, WriteFullRoundTrip) {
153   char buf[128];
154   char buf2[64];
155   char buf3[128];
156   memset(buf, 0xcc, sizeof(buf));
157   ASSERT_EQ(0, rados_striper_write(striper, "WriteFullRoundTrip", buf, sizeof(buf), 0));
158   memset(buf2, 0xdd, sizeof(buf2));
159   ASSERT_EQ(0, rados_striper_write_full(striper, "WriteFullRoundTrip", buf2, sizeof(buf2)));
160   memset(buf3, 0x00, sizeof(buf3));
161   ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "WriteFullRoundTrip", buf3, sizeof(buf3), 0));
162   ASSERT_EQ(0, memcmp(buf2, buf3, sizeof(buf2)));
163 }
164
165 TEST_F(StriperTestPP, WriteFullRoundTripPP) {
166   char buf[128];
167   char buf2[64];
168   memset(buf, 0xcc, sizeof(buf));
169   bufferlist bl1;
170   bl1.append(buf, sizeof(buf));
171   ASSERT_EQ(0, striper.write("WriteFullRoundTripPP", bl1, sizeof(buf), 0));
172   memset(buf2, 0xdd, sizeof(buf2));
173   bufferlist bl2;
174   bl2.append(buf2, sizeof(buf2));
175   ASSERT_EQ(0, striper.write_full("WriteFullRoundTripPP", bl2));
176   bufferlist bl3;
177   ASSERT_EQ((int)sizeof(buf2), striper.read("WriteFullRoundTripPP", &bl3, sizeof(buf), 0));
178   ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2)));
179 }
180
181 TEST_F(StriperTest, AppendRoundTrip) {
182   char buf[64];
183   char buf2[64];
184   char buf3[sizeof(buf) + sizeof(buf2)];
185   memset(buf, 0xde, sizeof(buf));
186   ASSERT_EQ(0, rados_striper_append(striper, "AppendRoundTrip", buf, sizeof(buf)));
187   memset(buf2, 0xad, sizeof(buf2));
188   ASSERT_EQ(0, rados_striper_append(striper, "AppendRoundTrip", buf2, sizeof(buf2)));
189   memset(buf3, 0, sizeof(buf3));
190   ASSERT_EQ((int)sizeof(buf3), rados_striper_read(striper, "AppendRoundTrip", buf3, sizeof(buf3), 0));
191   ASSERT_EQ(0, memcmp(buf3, buf, sizeof(buf)));
192   ASSERT_EQ(0, memcmp(buf3 + sizeof(buf), buf2, sizeof(buf2)));
193 }
194
195 TEST_F(StriperTestPP, AppendRoundTripPP) {
196   char buf[64];
197   char buf2[64];
198   memset(buf, 0xde, sizeof(buf));
199   bufferlist bl1;
200   bl1.append(buf, sizeof(buf));
201   ASSERT_EQ(0, striper.append("AppendRoundTripPP", bl1, sizeof(buf)));
202   memset(buf2, 0xad, sizeof(buf2));
203   bufferlist bl2;
204   bl2.append(buf2, sizeof(buf2));
205   ASSERT_EQ(0, striper.append("AppendRoundTripPP", bl2, sizeof(buf2)));
206   bufferlist bl3;
207   ASSERT_EQ((int)(sizeof(buf) + sizeof(buf2)),
208             striper.read("AppendRoundTripPP", &bl3, (sizeof(buf) + sizeof(buf2)), 0));
209   const char *bl3_str = bl3.c_str();
210   ASSERT_EQ(0, memcmp(bl3_str, buf, sizeof(buf)));
211   ASSERT_EQ(0, memcmp(bl3_str + sizeof(buf), buf2, sizeof(buf2)));
212 }
213
214 TEST_F(StriperTest, TruncTest) {
215   char buf[128];
216   char buf2[sizeof(buf)];
217   memset(buf, 0xaa, sizeof(buf));
218   ASSERT_EQ(0, rados_striper_append(striper, "TruncTest", buf, sizeof(buf)));
219   ASSERT_EQ(0, rados_striper_trunc(striper, "TruncTest", sizeof(buf) / 2));
220   memset(buf2, 0, sizeof(buf2));
221   ASSERT_EQ((int)(sizeof(buf)/2), rados_striper_read(striper, "TruncTest", buf2, sizeof(buf2), 0));
222   ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)/2));
223 }
224
225 TEST_F(StriperTestPP, TruncTestPP) {
226   char buf[128];
227   memset(buf, 0xaa, sizeof(buf));
228   bufferlist bl;
229   bl.append(buf, sizeof(buf));
230   ASSERT_EQ(0, striper.append("TruncTestPP", bl, sizeof(buf)));
231   ASSERT_EQ(0, striper.trunc("TruncTestPP", sizeof(buf) / 2));
232   bufferlist bl2;
233   ASSERT_EQ((int)(sizeof(buf)/2), striper.read("TruncTestPP", &bl2, sizeof(buf), 0));
234   ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)/2));
235 }
236
237 TEST_F(StriperTest, TruncTestGrow) {
238   char buf[128];
239   char buf2[sizeof(buf)*2];
240   memset(buf, 0xaa, sizeof(buf));
241   ASSERT_EQ(0, rados_striper_append(striper, "TruncTestGrow", buf, sizeof(buf)));
242   ASSERT_EQ(0, rados_striper_trunc(striper, "TruncTestGrow", sizeof(buf2)));
243   memset(buf2, 0xbb, sizeof(buf2));
244   ASSERT_EQ((int)sizeof(buf2), rados_striper_read(striper, "TruncTestGrow", buf2, sizeof(buf2), 0));
245   ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
246   memset(buf, 0x00, sizeof(buf));
247   ASSERT_EQ(0, memcmp(buf, buf2+sizeof(buf), sizeof(buf)));
248 }
249
250 TEST_F(StriperTestPP, TruncTestGrowPP) {
251   char buf[128];
252   memset(buf, 0xaa, sizeof(buf));
253   bufferlist bl;
254   bl.append(buf, sizeof(buf));
255   ASSERT_EQ(0, striper.append("TruncTestGrowPP", bl, sizeof(buf)));
256   ASSERT_EQ(0, striper.trunc("TruncTestGrowPP", sizeof(buf) * 2));
257   bufferlist bl2;
258   ASSERT_EQ(sizeof(buf)*2, (unsigned)striper.read("TruncTestGrowPP", &bl2, sizeof(buf)*2, 0));
259   ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)));
260   memset(buf, 0x00, sizeof(buf));
261   ASSERT_EQ(0, memcmp(bl2.c_str()+sizeof(buf), buf, sizeof(buf)));
262 }
263
264 TEST_F(StriperTest, RemoveTest) {
265   char buf[128];
266   char buf2[sizeof(buf)];
267   memset(buf, 0xaa, sizeof(buf));
268   ASSERT_EQ(0, rados_striper_write(striper, "RemoveTest", buf, sizeof(buf), 0));
269   ASSERT_EQ(0, rados_striper_remove(striper, "RemoveTest"));
270   ASSERT_EQ(-ENOENT, rados_striper_read(striper, "RemoveTest", buf2, sizeof(buf2), 0));
271 }
272
273 TEST_F(StriperTestPP, RemoveTestPP) {
274   char buf[128];
275   memset(buf, 0xaa, sizeof(buf));
276   bufferlist bl;
277   bl.append(buf, sizeof(buf));
278   ASSERT_EQ(0, striper.write("RemoveTestPP", bl, sizeof(buf), 0));
279   ASSERT_EQ(0, striper.remove("RemoveTestPP"));
280   bufferlist bl2;
281   ASSERT_EQ(-ENOENT, striper.read("RemoveTestPP", &bl2, sizeof(buf), 0));
282 }
283
284 TEST_F(StriperTest, XattrsRoundTrip) {
285   char buf[128];
286   char attr1_buf[] = "foo bar baz";
287   memset(buf, 0xaa, sizeof(buf));
288   ASSERT_EQ(0, rados_striper_write(striper, "XattrsRoundTrip", buf, sizeof(buf), 0));
289   ASSERT_EQ(-ENODATA, rados_striper_getxattr(striper, "XattrsRoundTrip", "attr1", buf, sizeof(buf)));
290   ASSERT_EQ(0, rados_striper_setxattr(striper, "XattrsRoundTrip", "attr1", attr1_buf, sizeof(attr1_buf)));
291   ASSERT_EQ((int)sizeof(attr1_buf), rados_striper_getxattr(striper, "XattrsRoundTrip", "attr1", buf, sizeof(buf)));
292   ASSERT_EQ(0, memcmp(attr1_buf, buf, sizeof(attr1_buf)));
293 }
294
295 TEST_F(StriperTestPP, XattrsRoundTripPP) {
296   char buf[128];
297   memset(buf, 0xaa, sizeof(buf));
298   bufferlist bl1;
299   bl1.append(buf, sizeof(buf));
300   ASSERT_EQ(0, striper.write("XattrsRoundTripPP", bl1, sizeof(buf), 0));
301   char attr1_buf[] = "foo bar baz";
302   bufferlist bl2;
303   ASSERT_EQ(-ENODATA, striper.getxattr("XattrsRoundTripPP", "attr1", bl2));
304   bufferlist bl3;
305   bl3.append(attr1_buf, sizeof(attr1_buf));
306   ASSERT_EQ(0, striper.setxattr("XattrsRoundTripPP", "attr1", bl3));
307   bufferlist bl4;
308   ASSERT_EQ((int)sizeof(attr1_buf), striper.getxattr("XattrsRoundTripPP", "attr1", bl4));
309   ASSERT_EQ(0, memcmp(bl4.c_str(), attr1_buf, sizeof(attr1_buf)));
310 }
311
312 TEST_F(StriperTest, RmXattr) {
313   char buf[128];
314   char attr1_buf[] = "foo bar baz";
315   memset(buf, 0xaa, sizeof(buf));
316   ASSERT_EQ(0, rados_striper_write(striper, "RmXattr", buf, sizeof(buf), 0));
317   ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr1", attr1_buf, sizeof(attr1_buf)));
318   ASSERT_EQ(0, rados_striper_rmxattr(striper, "RmXattr", "attr1"));
319   ASSERT_EQ(-ENODATA, rados_striper_getxattr(striper, "RmXattr", "attr1", buf, sizeof(buf)));
320 }
321
322 TEST_F(StriperTestPP, RmXattrPP) {
323   char buf[128];
324   memset(buf, 0xaa, sizeof(buf));
325   bufferlist bl1;
326   bl1.append(buf, sizeof(buf));
327   ASSERT_EQ(0, striper.write("RmXattrPP", bl1, sizeof(buf), 0));
328   char attr1_buf[] = "foo bar baz";
329   bufferlist bl2;
330   bl2.append(attr1_buf, sizeof(attr1_buf));
331   ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr1", bl2));
332   ASSERT_EQ(0, striper.rmxattr("RmXattrPP", "attr1"));
333   bufferlist bl3;
334   ASSERT_EQ(-ENODATA, striper.getxattr("RmXattrPP", "attr1", bl3));
335 }
336
337 TEST_F(StriperTest, XattrIter) {
338   char buf[128];
339   char attr1_buf[] = "foo bar baz";
340   char attr2_buf[256];
341   for (size_t j = 0; j < sizeof(attr2_buf); ++j) {
342     attr2_buf[j] = j % 0xff;
343   }
344   memset(buf, 0xaa, sizeof(buf));
345   ASSERT_EQ(0, rados_striper_write(striper, "RmXattr", buf, sizeof(buf), 0));
346   ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr1", attr1_buf, sizeof(attr1_buf)));
347   ASSERT_EQ(0, rados_striper_setxattr(striper, "RmXattr", "attr2", attr2_buf, sizeof(attr2_buf)));
348   rados_xattrs_iter_t iter;
349   ASSERT_EQ(0, rados_striper_getxattrs(striper, "RmXattr", &iter));
350   int num_seen = 0;
351   while (true) {
352     const char *name;
353     const char *val;
354     size_t len;
355     ASSERT_EQ(0, rados_striper_getxattrs_next(iter, &name, &val, &len));
356     if (name == NULL) {
357       break;
358     }
359     ASSERT_LT(num_seen, 2) << "Extra attribute : " << name;
360     if ((strcmp(name, "attr1") == 0) && (val != NULL) && (memcmp(val, attr1_buf, len) == 0)) {
361       num_seen++;
362       continue;
363     }
364     else if ((strcmp(name, "attr2") == 0) && (val != NULL) && (memcmp(val, attr2_buf, len) == 0)) {
365       num_seen++;
366       continue;
367     }
368     else {
369       ASSERT_EQ(0, 1) << "Unexpected attribute : " << name;;
370     }
371   }
372   rados_striper_getxattrs_end(iter);
373 }
374
375 TEST_F(StriperTestPP, XattrListPP) {
376   char buf[128];
377   memset(buf, 0xaa, sizeof(buf));
378   bufferlist bl1;
379   bl1.append(buf, sizeof(buf));
380   ASSERT_EQ(0, striper.write("RmXattrPP", bl1, sizeof(buf), 0));
381   char attr1_buf[] = "foo bar baz";
382   bufferlist bl2;
383   bl2.append(attr1_buf, sizeof(attr1_buf));
384   ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr1", bl2));
385   char attr2_buf[256];
386   for (size_t j = 0; j < sizeof(attr2_buf); ++j) {
387     attr2_buf[j] = j % 0xff;
388   }
389   bufferlist bl3;
390   bl3.append(attr2_buf, sizeof(attr2_buf));
391   ASSERT_EQ(0, striper.setxattr("RmXattrPP", "attr2", bl3));
392   std::map<std::string, bufferlist> attrset;
393   ASSERT_EQ(0, striper.getxattrs("RmXattrPP", attrset));
394   for (std::map<std::string, bufferlist>::iterator i = attrset.begin();
395        i != attrset.end(); ++i) {
396     if (i->first == string("attr1")) {
397       ASSERT_EQ(0, memcmp(i->second.c_str(), attr1_buf, sizeof(attr1_buf)));
398     }
399     else if (i->first == string("attr2")) {
400       ASSERT_EQ(0, memcmp(i->second.c_str(), attr2_buf, sizeof(attr2_buf)));
401     }
402     else {
403       ASSERT_EQ(0, 1) << "Unexpected attribute : " << i->first;
404     }
405   }
406 }