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"
10 #include "gtest/gtest.h"
12 using namespace librados
;
13 using namespace libradosstriper
;
16 TEST_F(StriperTest
, SimpleWrite
) {
18 memset(buf
, 0xcc, sizeof(buf
));
19 ASSERT_EQ(0, rados_striper_write(striper
, "SimpleWrite", buf
, sizeof(buf
), 0));
22 TEST_F(StriperTestPP
, SimpleWritePP
) {
24 memset(buf
, 0xcc, sizeof(buf
));
26 bl
.append(buf
, sizeof(buf
));
27 ASSERT_EQ(0, striper
.write("SimpleWritePP", bl
, sizeof(buf
), 0));
30 TEST_F(StriperTest
, SimpleWriteFull
) {
32 memset(buf
, 0xcc, sizeof(buf
));
33 ASSERT_EQ(0, rados_striper_write_full(striper
, "SimpleWrite", buf
, sizeof(buf
)));
36 TEST_F(StriperTestPP
, SimpleWriteFullPP
) {
38 memset(buf
, 0xcc, sizeof(buf
));
40 bl
.append(buf
, sizeof(buf
));
41 ASSERT_EQ(0, striper
.write_full("SimpleWritePP", bl
));
44 TEST_F(StriperTest
, Stat
) {
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
));
55 TEST_F(StriperTestPP
, StatPP
) {
57 memset(buf
, 0xcc, sizeof(buf
));
59 bl
.append(buf
, sizeof(buf
));
60 ASSERT_EQ(0, striper
.write("Statpp", bl
, sizeof(buf
), 0));
63 ASSERT_EQ(0, striper
.stat("Statpp", &psize
, &pmtime
));
64 ASSERT_EQ(psize
, sizeof(buf
));
65 ASSERT_EQ(-ENOENT
, striper
.stat("nonexistent", &psize
, &pmtime
));
68 TEST_F(StriperTest
, RoundTrip
) {
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
)));
78 TEST_F(StriperTestPP
, RoundTripPP
) {
80 memset(buf
, 0xcc, sizeof(buf
));
82 bl
.append(buf
, sizeof(buf
));
83 ASSERT_EQ(0, striper
.write("RoundTripPP", bl
, sizeof(buf
), 0));
85 ASSERT_EQ((int)sizeof(buf
), striper
.read("RoundTripPP", &cl
, sizeof(buf
), 0));
86 ASSERT_EQ(0, memcmp(buf
, cl
.c_str(), sizeof(buf
)));
89 TEST_F(StriperTest
, OverlappingWriteRoundTrip
) {
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
)));
103 TEST_F(StriperTestPP
, OverlappingWriteRoundTripPP
) {
105 memset(buf
, 0xcc, sizeof(buf
));
107 bl1
.append(buf
, sizeof(buf
));
108 ASSERT_EQ(0, striper
.write("OverlappingWriteRoundTripPP", bl1
, sizeof(buf
), 0));
110 memset(buf2
, 0xdd, sizeof(buf2
));
112 bl2
.append(buf2
, sizeof(buf2
));
113 ASSERT_EQ(0, striper
.write("OverlappingWriteRoundTripPP", bl2
, sizeof(buf2
), 0));
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
)));
120 TEST_F(StriperTest
, SparseWriteRoundTrip
) {
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
)));
136 TEST_F(StriperTestPP
, SparseWriteRoundTripPP
) {
138 memset(buf
, 0xcc, sizeof(buf
));
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));
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
)));
152 TEST_F(StriperTest
, WriteFullRoundTrip
) {
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
)));
165 TEST_F(StriperTestPP
, WriteFullRoundTripPP
) {
168 memset(buf
, 0xcc, sizeof(buf
));
170 bl1
.append(buf
, sizeof(buf
));
171 ASSERT_EQ(0, striper
.write("WriteFullRoundTripPP", bl1
, sizeof(buf
), 0));
172 memset(buf2
, 0xdd, sizeof(buf2
));
174 bl2
.append(buf2
, sizeof(buf2
));
175 ASSERT_EQ(0, striper
.write_full("WriteFullRoundTripPP", bl2
));
177 ASSERT_EQ((int)sizeof(buf2
), striper
.read("WriteFullRoundTripPP", &bl3
, sizeof(buf
), 0));
178 ASSERT_EQ(0, memcmp(bl3
.c_str(), buf2
, sizeof(buf2
)));
181 TEST_F(StriperTest
, AppendRoundTrip
) {
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
)));
195 TEST_F(StriperTestPP
, AppendRoundTripPP
) {
198 memset(buf
, 0xde, sizeof(buf
));
200 bl1
.append(buf
, sizeof(buf
));
201 ASSERT_EQ(0, striper
.append("AppendRoundTripPP", bl1
, sizeof(buf
)));
202 memset(buf2
, 0xad, sizeof(buf2
));
204 bl2
.append(buf2
, sizeof(buf2
));
205 ASSERT_EQ(0, striper
.append("AppendRoundTripPP", bl2
, sizeof(buf2
)));
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
)));
214 TEST_F(StriperTest
, TruncTest
) {
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));
225 TEST_F(StriperTestPP
, TruncTestPP
) {
227 memset(buf
, 0xaa, sizeof(buf
));
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));
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));
237 TEST_F(StriperTest
, TruncTestGrow
) {
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
)));
250 TEST_F(StriperTestPP
, TruncTestGrowPP
) {
252 memset(buf
, 0xaa, sizeof(buf
));
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));
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
)));
264 TEST_F(StriperTest
, RemoveTest
) {
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));
273 TEST_F(StriperTestPP
, RemoveTestPP
) {
275 memset(buf
, 0xaa, sizeof(buf
));
277 bl
.append(buf
, sizeof(buf
));
278 ASSERT_EQ(0, striper
.write("RemoveTestPP", bl
, sizeof(buf
), 0));
279 ASSERT_EQ(0, striper
.remove("RemoveTestPP"));
281 ASSERT_EQ(-ENOENT
, striper
.read("RemoveTestPP", &bl2
, sizeof(buf
), 0));
284 TEST_F(StriperTest
, XattrsRoundTrip
) {
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
)));
295 TEST_F(StriperTestPP
, XattrsRoundTripPP
) {
297 memset(buf
, 0xaa, sizeof(buf
));
299 bl1
.append(buf
, sizeof(buf
));
300 ASSERT_EQ(0, striper
.write("XattrsRoundTripPP", bl1
, sizeof(buf
), 0));
301 char attr1_buf
[] = "foo bar baz";
303 ASSERT_EQ(-ENODATA
, striper
.getxattr("XattrsRoundTripPP", "attr1", bl2
));
305 bl3
.append(attr1_buf
, sizeof(attr1_buf
));
306 ASSERT_EQ(0, striper
.setxattr("XattrsRoundTripPP", "attr1", bl3
));
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
)));
312 TEST_F(StriperTest
, RmXattr
) {
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
)));
322 TEST_F(StriperTestPP
, RmXattrPP
) {
324 memset(buf
, 0xaa, sizeof(buf
));
326 bl1
.append(buf
, sizeof(buf
));
327 ASSERT_EQ(0, striper
.write("RmXattrPP", bl1
, sizeof(buf
), 0));
328 char attr1_buf
[] = "foo bar baz";
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"));
334 ASSERT_EQ(-ENODATA
, striper
.getxattr("RmXattrPP", "attr1", bl3
));
337 TEST_F(StriperTest
, XattrIter
) {
339 char attr1_buf
[] = "foo bar baz";
341 for (size_t j
= 0; j
< sizeof(attr2_buf
); ++j
) {
342 attr2_buf
[j
] = j
% 0xff;
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
));
355 ASSERT_EQ(0, rados_striper_getxattrs_next(iter
, &name
, &val
, &len
));
359 ASSERT_LT(num_seen
, 2) << "Extra attribute : " << name
;
360 if ((strcmp(name
, "attr1") == 0) && (val
!= NULL
) && (memcmp(val
, attr1_buf
, len
) == 0)) {
364 else if ((strcmp(name
, "attr2") == 0) && (val
!= NULL
) && (memcmp(val
, attr2_buf
, len
) == 0)) {
369 ASSERT_EQ(0, 1) << "Unexpected attribute : " << name
;;
372 rados_striper_getxattrs_end(iter
);
375 TEST_F(StriperTestPP
, XattrListPP
) {
377 memset(buf
, 0xaa, sizeof(buf
));
379 bl1
.append(buf
, sizeof(buf
));
380 ASSERT_EQ(0, striper
.write("RmXattrPP", bl1
, sizeof(buf
), 0));
381 char attr1_buf
[] = "foo bar baz";
383 bl2
.append(attr1_buf
, sizeof(attr1_buf
));
384 ASSERT_EQ(0, striper
.setxattr("RmXattrPP", "attr1", bl2
));
386 for (size_t j
= 0; j
< sizeof(attr2_buf
); ++j
) {
387 attr2_buf
[j
] = j
% 0xff;
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
)));
399 else if (i
->first
== string("attr2")) {
400 ASSERT_EQ(0, memcmp(i
->second
.c_str(), attr2_buf
, sizeof(attr2_buf
)));
403 ASSERT_EQ(0, 1) << "Unexpected attribute : " << i
->first
;