X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftest%2Flibrados%2Fio.cc;fp=src%2Fceph%2Fsrc%2Ftest%2Flibrados%2Fio.cc;h=0000000000000000000000000000000000000000;hb=7da45d65be36d36b880cc55c5036e96c24b53f00;hp=5094f756987af0c29a89650802b14e3881eb57a8;hpb=691462d09d0987b47e112d6ee8740375df3c51b2;p=stor4nfv.git diff --git a/src/ceph/src/test/librados/io.cc b/src/ceph/src/test/librados/io.cc deleted file mode 100644 index 5094f75..0000000 --- a/src/ceph/src/test/librados/io.cc +++ /dev/null @@ -1,1325 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -* -// vim: ts=8 sw=2 smarttab - -#include - -#include "include/rados/librados.h" -#include "include/rados/librados.hpp" -#include "include/encoding.h" -#include "include/err.h" -#include "include/scope_guard.h" -#include "test/librados/test.h" -#include "test/librados/TestCase.h" - -#include -#include "gtest/gtest.h" - -using namespace librados; -using std::string; - -typedef RadosTest LibRadosIo; -typedef RadosTestEC LibRadosIoEC; -typedef RadosTestPP LibRadosIoPP; -typedef RadosTestECPP LibRadosIoECPP; - -TEST_F(LibRadosIo, SimpleWrite) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - rados_ioctx_set_namespace(ioctx, "nspace"); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); -} - -TEST_F(LibRadosIo, TooBig) { - char buf[1]; - ASSERT_EQ(-E2BIG, rados_write(ioctx, "A", buf, UINT_MAX, 0)); - ASSERT_EQ(-E2BIG, rados_append(ioctx, "A", buf, UINT_MAX)); - ASSERT_EQ(-E2BIG, rados_write_full(ioctx, "A", buf, UINT_MAX)); - ASSERT_EQ(-E2BIG, rados_writesame(ioctx, "A", buf, sizeof(buf), UINT_MAX, 0)); - IoCtx ioctx; - bufferlist bl; - ASSERT_EQ(-E2BIG, ioctx.write("foo", bl, UINT_MAX, 0)); - ASSERT_EQ(-E2BIG, ioctx.append("foo", bl, UINT_MAX)); - // ioctx.write_full no way to overflow bl.length() - ASSERT_EQ(-E2BIG, ioctx.writesame("foo", bl, UINT_MAX, 0)); -} - -TEST_F(LibRadosIo, ReadTimeout) { - char buf[128]; - memset(buf, 'a', sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - - { - // set up a second client - rados_t cluster; - rados_ioctx_t ioctx; - ASSERT_EQ(0, rados_create(&cluster, "admin")); - ASSERT_EQ(0, rados_conf_read_file(cluster, NULL)); - ASSERT_EQ(0, rados_conf_parse_env(cluster, NULL)); - ASSERT_EQ(0, rados_conf_set(cluster, "rados_osd_op_timeout", "0.00001")); // use any small value that will result in a timeout - ASSERT_EQ(0, rados_connect(cluster)); - ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx)); - rados_ioctx_set_namespace(ioctx, nspace.c_str()); - - // then we show that the buffer is changed after rados_read returned - // with a timeout - for (int i=0; i<5; i++) { - char buf2[sizeof(buf)]; - memset(buf2, 0, sizeof(buf2)); - int err = rados_read(ioctx, "foo", buf2, sizeof(buf2), 0); - if (err == -110) { - int startIndex = 0; - // find the index until which librados already read the object before the timeout occurred - for (unsigned b=0; b extents; - bufferlist read_bl; - int rval = -1; - ObjectReadOperation op; - op.sparse_read(0, sizeof(buf), &extents, &read_bl, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, nullptr)); - ASSERT_EQ(0, rval); - assert_eq_sparse(bl, extents, read_bl); - } -} - -TEST_F(LibRadosIo, RoundTrip) { - char buf[128]; - char buf2[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ((int)sizeof(buf2), rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); - ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf))); - - uint64_t off = 19; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "bar", buf, sizeof(buf), off)); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ((int)sizeof(buf2), rados_read(ioctx, "bar", buf2, sizeof(buf2), off)); - ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf))); -} - -TEST_F(LibRadosIoPP, RoundTripPP) { - char buf[128]; - Rados cluster; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - bufferlist cl; - ASSERT_EQ((int)sizeof(buf), ioctx.read("foo", cl, sizeof(buf), 0)); - ASSERT_EQ(0, memcmp(buf, cl.c_str(), sizeof(buf))); -} - -TEST_F(LibRadosIoPP, RoundTripPP2) -{ - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write; - write.write(0, bl); - write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOCACHE|LIBRADOS_OP_FLAG_FADVISE_RANDOM); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -} - -TEST_F(LibRadosIo, Checksum) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - - uint32_t expected_crc = ceph_crc32c(-1, reinterpret_cast(buf), - sizeof(buf)); - uint32_t init_value = -1; - uint32_t crc[2]; - ASSERT_EQ(0, rados_checksum(ioctx, "foo", LIBRADOS_CHECKSUM_TYPE_CRC32C, - reinterpret_cast(&init_value), - sizeof(init_value), sizeof(buf), 0, 0, - reinterpret_cast(&crc), sizeof(crc))); - ASSERT_EQ(1U, crc[0]); - ASSERT_EQ(expected_crc, crc[1]); -} - -TEST_F(LibRadosIoPP, Checksum) { - char buf[128]; - Rados cluster; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - bufferlist init_value_bl; - ::encode(static_cast(-1), init_value_bl); - bufferlist csum_bl; - ASSERT_EQ(0, ioctx.checksum("foo", LIBRADOS_CHECKSUM_TYPE_CRC32C, - init_value_bl, sizeof(buf), 0, 0, &csum_bl)); - auto csum_bl_it = csum_bl.begin(); - uint32_t csum_count; - ::decode(csum_count, csum_bl_it); - ASSERT_EQ(1U, csum_count); - uint32_t csum; - ::decode(csum, csum_bl_it); - ASSERT_EQ(bl.crc32c(-1), csum); -} - -TEST_F(LibRadosIo, OverlappingWriteRoundTrip) { - char buf[128]; - char buf2[64]; - char buf3[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf2, sizeof(buf2), 0)); - memset(buf3, 0xdd, sizeof(buf3)); - ASSERT_EQ((int)sizeof(buf3), rados_read(ioctx, "foo", buf3, sizeof(buf3), 0)); - ASSERT_EQ(0, memcmp(buf3, buf2, sizeof(buf2))); - ASSERT_EQ(0, memcmp(buf3 + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2))); -} - -TEST_F(LibRadosIoPP, OverlappingWriteRoundTripPP) { - char buf[128]; - char buf2[64]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl1, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - bufferlist bl2; - bl2.append(buf2, sizeof(buf2)); - ASSERT_EQ(0, ioctx.write("foo", bl2, sizeof(buf2), 0)); - bufferlist bl3; - ASSERT_EQ((int)sizeof(buf), ioctx.read("foo", bl3, sizeof(buf), 0)); - ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2))); - ASSERT_EQ(0, memcmp(bl3.c_str() + sizeof(buf2), buf, sizeof(buf) - sizeof(buf2))); -} - -TEST_F(LibRadosIo, WriteFullRoundTrip) { - char buf[128]; - char buf2[64]; - char buf3[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - ASSERT_EQ(0, rados_write_full(ioctx, "foo", buf2, sizeof(buf2))); - memset(buf3, 0x00, sizeof(buf3)); - ASSERT_EQ((int)sizeof(buf2), rados_read(ioctx, "foo", buf3, sizeof(buf3), 0)); - ASSERT_EQ(0, memcmp(buf2, buf3, sizeof(buf2))); -} - -TEST_F(LibRadosIoPP, WriteFullRoundTripPP) { - char buf[128]; - char buf2[64]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl1, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - bufferlist bl2; - bl2.append(buf2, sizeof(buf2)); - ASSERT_EQ(0, ioctx.write_full("foo", bl2)); - bufferlist bl3; - ASSERT_EQ((int)sizeof(buf2), ioctx.read("foo", bl3, sizeof(buf), 0)); - ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2))); -} - -TEST_F(LibRadosIoPP, WriteFullRoundTripPP2) -{ - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write; - write.write_full(bl); - write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_NOCACHE); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED|LIBRADOS_OP_FLAG_FADVISE_RANDOM); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -} - -TEST_F(LibRadosIo, AppendRoundTrip) { - char buf[64]; - char buf2[64]; - char buf3[sizeof(buf) + sizeof(buf2)]; - memset(buf, 0xde, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - memset(buf2, 0xad, sizeof(buf2)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf2, sizeof(buf2))); - memset(buf3, 0, sizeof(buf3)); - ASSERT_EQ((int)sizeof(buf3), rados_read(ioctx, "foo", buf3, sizeof(buf3), 0)); - ASSERT_EQ(0, memcmp(buf3, buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(buf3 + sizeof(buf), buf2, sizeof(buf2))); -} - -TEST_F(LibRadosIoPP, AppendRoundTripPP) { - char buf[64]; - char buf2[64]; - memset(buf, 0xde, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - memset(buf2, 0xad, sizeof(buf2)); - bufferlist bl2; - bl2.append(buf2, sizeof(buf2)); - ASSERT_EQ(0, ioctx.append("foo", bl2, sizeof(buf2))); - bufferlist bl3; - ASSERT_EQ((int)(sizeof(buf) + sizeof(buf2)), - ioctx.read("foo", bl3, (sizeof(buf) + sizeof(buf2)), 0)); - const char *bl3_str = bl3.c_str(); - ASSERT_EQ(0, memcmp(bl3_str, buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(bl3_str + sizeof(buf), buf2, sizeof(buf2))); -} - -TEST_F(LibRadosIo, TruncTest) { - char buf[128]; - char buf2[sizeof(buf)]; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, rados_trunc(ioctx, "foo", sizeof(buf) / 2)); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ((int)(sizeof(buf)/2), rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); - ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)/2)); -} - -TEST_F(LibRadosIoPP, TruncTestPP) { - char buf[128]; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl, sizeof(buf))); - ASSERT_EQ(0, ioctx.trunc("foo", sizeof(buf) / 2)); - bufferlist bl2; - ASSERT_EQ((int)(sizeof(buf)/2), ioctx.read("foo", bl2, sizeof(buf), 0)); - ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf)/2)); -} - -TEST_F(LibRadosIo, RemoveTest) { - char buf[128]; - char buf2[sizeof(buf)]; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, rados_remove(ioctx, "foo")); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ(-ENOENT, rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); -} - -TEST_F(LibRadosIoPP, RemoveTestPP) { - char buf[128]; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - ASSERT_EQ(0, ioctx.remove("foo")); - bufferlist bl2; - ASSERT_EQ(-ENOENT, ioctx.read("foo", bl2, sizeof(buf), 0)); -} - -TEST_F(LibRadosIo, XattrsRoundTrip) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(-ENODATA, rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ((int)sizeof(attr1_buf), - rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(attr1_buf, buf, sizeof(attr1_buf))); -} - -TEST_F(LibRadosIoPP, XattrsRoundTripPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - ASSERT_EQ(-ENODATA, ioctx.getxattr("foo", attr1, bl2)); - bufferlist bl3; - bl3.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl3)); - bufferlist bl4; - ASSERT_EQ((int)sizeof(attr1_buf), - ioctx.getxattr("foo", attr1, bl4)); - ASSERT_EQ(0, memcmp(bl4.c_str(), attr1_buf, sizeof(attr1_buf))); -} - -TEST_F(LibRadosIo, RmXattr) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, - rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ(0, rados_rmxattr(ioctx, "foo", attr1)); - ASSERT_EQ(-ENODATA, rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - - // Test rmxattr on a removed object - char buf2[128]; - char attr2[] = "attr2"; - char attr2_buf[] = "foo bar baz"; - memset(buf2, 0xbb, sizeof(buf2)); - ASSERT_EQ(0, rados_write(ioctx, "foo_rmxattr", buf2, sizeof(buf2), 0)); - ASSERT_EQ(0, - rados_setxattr(ioctx, "foo_rmxattr", attr2, attr2_buf, sizeof(attr2_buf))); - ASSERT_EQ(0, rados_remove(ioctx, "foo_rmxattr")); - ASSERT_EQ(-ENOENT, rados_rmxattr(ioctx, "foo_rmxattr", attr2)); -} - -TEST_F(LibRadosIoPP, RmXattrPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - bl2.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl2)); - ASSERT_EQ(0, ioctx.rmxattr("foo", attr1)); - bufferlist bl3; - ASSERT_EQ(-ENODATA, ioctx.getxattr("foo", attr1, bl3)); - - // Test rmxattr on a removed object - char buf2[128]; - char attr2[] = "attr2"; - char attr2_buf[] = "foo bar baz"; - memset(buf2, 0xbb, sizeof(buf2)); - bufferlist bl21; - bl21.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo_rmxattr", bl21, sizeof(buf2), 0)); - bufferlist bl22; - bl22.append(attr2_buf, sizeof(attr2_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo_rmxattr", attr2, bl22)); - ASSERT_EQ(0, ioctx.remove("foo_rmxattr")); - ASSERT_EQ(-ENOENT, ioctx.rmxattr("foo_rmxattr", attr2)); -} - -TEST_F(LibRadosIo, XattrIter) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - char attr2[] = "attr2"; - char attr2_buf[256]; - for (size_t j = 0; j < sizeof(attr2_buf); ++j) { - attr2_buf[j] = j % 0xff; - } - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr2, attr2_buf, sizeof(attr2_buf))); - rados_xattrs_iter_t iter; - ASSERT_EQ(0, rados_getxattrs(ioctx, "foo", &iter)); - int num_seen = 0; - while (true) { - const char *name; - const char *val; - size_t len; - ASSERT_EQ(0, rados_getxattrs_next(iter, &name, &val, &len)); - if (name == NULL) { - break; - } - ASSERT_LT(num_seen, 2); - if ((strcmp(name, attr1) == 0) && (val != NULL) && (memcmp(val, attr1_buf, len) == 0)) { - num_seen++; - continue; - } - else if ((strcmp(name, attr2) == 0) && (val != NULL) && (memcmp(val, attr2_buf, len) == 0)) { - num_seen++; - continue; - } - else { - ASSERT_EQ(0, 1); - } - } - rados_getxattrs_end(iter); -} - -TEST_F(LibRadosIoPP, XattrListPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - char attr2[] = "attr2"; - char attr2_buf[256]; - for (size_t j = 0; j < sizeof(attr2_buf); ++j) { - attr2_buf[j] = j % 0xff; - } - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - bl2.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl2)); - bufferlist bl3; - bl3.append(attr2_buf, sizeof(attr2_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr2, bl3)); - std::map attrset; - ASSERT_EQ(0, ioctx.getxattrs("foo", attrset)); - for (std::map::iterator i = attrset.begin(); - i != attrset.end(); ++i) { - if (i->first == string(attr1)) { - ASSERT_EQ(0, memcmp(i->second.c_str(), attr1_buf, sizeof(attr1_buf))); - } - else if (i->first == string(attr2)) { - ASSERT_EQ(0, memcmp(i->second.c_str(), attr2_buf, sizeof(attr2_buf))); - } - else { - ASSERT_EQ(0, 1); - } - } -} - -TEST_F(LibRadosIoEC, SimpleWrite) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - rados_ioctx_set_namespace(ioctx, "nspace"); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); -} - -TEST_F(LibRadosIoECPP, SimpleWritePP) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - ioctx.set_namespace("nspace"); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); -} - -TEST_F(LibRadosIoECPP, ReadOpPP) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - - { - bufferlist op_bl; - ObjectReadOperation op; - op.read(0, sizeof(buf), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist op_bl; - ObjectReadOperation op; - op.read(0, 0, NULL, NULL); //len=0 mean read the whole object data - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist read_bl, op_bl; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), read_bl.length()); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(read_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist op_bl; - int rval = 1000; - ObjectReadOperation op; - op.read(0, sizeof(buf), NULL, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, rval); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist read_bl, op_bl; - int rval = 1000; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), read_bl.length()); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, rval); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(read_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist read_bl1, read_bl2, op_bl; - int rval1 = 1000, rval2 = 1002; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl1, &rval1); - op.read(0, sizeof(buf), &read_bl2, &rval2); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), read_bl1.length()); - ASSERT_EQ(sizeof(buf), read_bl2.length()); - ASSERT_EQ(sizeof(buf) * 2, op_bl.length()); - ASSERT_EQ(0, rval1); - ASSERT_EQ(0, rval2); - ASSERT_EQ(0, memcmp(read_bl1.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(read_bl2.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(op_bl.c_str() + sizeof(buf), buf, sizeof(buf))); - } - - { - bufferlist op_bl; - ObjectReadOperation op; - op.read(0, sizeof(buf), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &op, &op_bl)); - ASSERT_EQ(sizeof(buf), op_bl.length()); - ASSERT_EQ(0, memcmp(op_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist read_bl; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &op, NULL)); - ASSERT_EQ(sizeof(buf), read_bl.length()); - ASSERT_EQ(0, memcmp(read_bl.c_str(), buf, sizeof(buf))); - } - - { - int rval = 1000; - ObjectReadOperation op; - op.read(0, sizeof(buf), NULL, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, NULL)); - ASSERT_EQ(0, rval); - } - - { - bufferlist read_bl; - int rval = 1000; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, NULL)); - ASSERT_EQ(sizeof(buf), read_bl.length()); - ASSERT_EQ(0, rval); - ASSERT_EQ(0, memcmp(read_bl.c_str(), buf, sizeof(buf))); - } - - { - bufferlist read_bl1, read_bl2; - int rval1 = 1000, rval2 = 1002; - ObjectReadOperation op; - op.read(0, sizeof(buf), &read_bl1, &rval1); - op.read(0, sizeof(buf), &read_bl2, &rval2); - ASSERT_EQ(0, ioctx.operate("foo", &op, NULL)); - ASSERT_EQ(sizeof(buf), read_bl1.length()); - ASSERT_EQ(sizeof(buf), read_bl2.length()); - ASSERT_EQ(0, rval1); - ASSERT_EQ(0, rval2); - ASSERT_EQ(0, memcmp(read_bl1.c_str(), buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(read_bl2.c_str(), buf, sizeof(buf))); - } -} - -TEST_F(LibRadosIoECPP, SparseReadOpPP) { - char buf[128]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - - { - std::map extents; - bufferlist read_bl; - int rval = -1; - ObjectReadOperation op; - op.sparse_read(0, sizeof(buf), &extents, &read_bl, &rval); - ASSERT_EQ(0, ioctx.operate("foo", &op, nullptr)); - ASSERT_EQ(0, rval); - assert_eq_sparse(bl, extents, read_bl); - } -} - -TEST_F(LibRadosIoEC, RoundTrip) { - char buf[128]; - char buf2[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ((int)sizeof(buf2), rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); - ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf))); - - uint64_t off = 19; - ASSERT_EQ(-EOPNOTSUPP, rados_write(ioctx, "bar", buf, sizeof(buf), off)); -} - -TEST_F(LibRadosIoECPP, RoundTripPP) { - char buf[128]; - Rados cluster; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0)); - bufferlist cl; - ASSERT_EQ((int)sizeof(buf), ioctx.read("foo", cl, sizeof(buf) * 3, 0)); - ASSERT_EQ(0, memcmp(buf, cl.c_str(), sizeof(buf))); -} - -TEST_F(LibRadosIoECPP, RoundTripPP2) -{ - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write; - write.write(0, bl); - write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED|LIBRADOS_OP_FLAG_FADVISE_RANDOM); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -} - -TEST_F(LibRadosIoEC, OverlappingWriteRoundTrip) { - int bsize = alignment; - int dbsize = bsize * 2; - char *buf = (char *)new char[dbsize]; - char *buf2 = (char *)new char[bsize]; - char *buf3 = (char *)new char[dbsize]; - auto cleanup = [&] { - delete[] buf; - delete[] buf2; - delete[] buf3; - }; - scope_guard sg(std::move(cleanup)); - memset(buf, 0xcc, dbsize); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, dbsize, 0)); - memset(buf2, 0xdd, bsize); - ASSERT_EQ(-EOPNOTSUPP, rados_write(ioctx, "foo", buf2, bsize, 0)); - memset(buf3, 0xdd, dbsize); - ASSERT_EQ(dbsize, rados_read(ioctx, "foo", buf3, dbsize, 0)); - // Read the same as first write - ASSERT_EQ(0, memcmp(buf3, buf, dbsize)); -} - -TEST_F(LibRadosIoECPP, OverlappingWriteRoundTripPP) { - int bsize = alignment; - int dbsize = bsize * 2; - char *buf = (char *)new char[dbsize]; - char *buf2 = (char *)new char[bsize]; - auto cleanup = [&] { - delete[] buf; - delete[] buf2; - }; - scope_guard sg(std::move(cleanup)); - memset(buf, 0xcc, dbsize); - bufferlist bl1; - bl1.append(buf, dbsize); - ASSERT_EQ(0, ioctx.write("foo", bl1, dbsize, 0)); - memset(buf2, 0xdd, bsize); - bufferlist bl2; - bl2.append(buf2, bsize); - ASSERT_EQ(-EOPNOTSUPP, ioctx.write("foo", bl2, bsize, 0)); - bufferlist bl3; - ASSERT_EQ(dbsize, ioctx.read("foo", bl3, dbsize, 0)); - // Read the same as first write - ASSERT_EQ(0, memcmp(bl3.c_str(), buf, dbsize)); -} - -TEST_F(LibRadosIoEC, WriteFullRoundTrip) { - char buf[128]; - char buf2[64]; - char buf3[128]; - memset(buf, 0xcc, sizeof(buf)); - ASSERT_EQ(0, rados_write(ioctx, "foo", buf, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - ASSERT_EQ(0, rados_write_full(ioctx, "foo", buf2, sizeof(buf2))); - memset(buf3, 0xee, sizeof(buf3)); - ASSERT_EQ((int)sizeof(buf2), rados_read(ioctx, "foo", buf3, sizeof(buf3), 0)); - ASSERT_EQ(0, memcmp(buf3, buf2, sizeof(buf2))); -} - -TEST_F(LibRadosIoECPP, WriteFullRoundTripPP) { - char buf[128]; - char buf2[64]; - memset(buf, 0xcc, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo", bl1, sizeof(buf), 0)); - memset(buf2, 0xdd, sizeof(buf2)); - bufferlist bl2; - bl2.append(buf2, sizeof(buf2)); - ASSERT_EQ(0, ioctx.write_full("foo", bl2)); - bufferlist bl3; - ASSERT_EQ((int)sizeof(buf2), ioctx.read("foo", bl3, sizeof(buf), 0)); - ASSERT_EQ(0, memcmp(bl3.c_str(), buf2, sizeof(buf2))); -} - -TEST_F(LibRadosIoECPP, WriteFullRoundTripPP2) -{ - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write; - write.write_full(bl); - write.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - read.set_op_flags2(LIBRADOS_OP_FLAG_FADVISE_DONTNEED|LIBRADOS_OP_FLAG_FADVISE_RANDOM); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -} - -TEST_F(LibRadosIoEC, AppendRoundTrip) { - char *buf = (char *)new char[alignment]; - char *buf2 = (char *)new char[alignment]; - char *buf3 = (char *)new char[alignment *2]; - int uasize = alignment/2; - char *unalignedbuf = (char *)new char[uasize]; - auto cleanup = [&] { - delete[] buf; - delete[] buf2; - delete[] buf3; - delete[] unalignedbuf; - }; - scope_guard sg(std::move(cleanup)); - memset(buf, 0xde, alignment); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, alignment)); - memset(buf2, 0xad, alignment); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf2, alignment)); - memset(buf3, 0, alignment*2); - ASSERT_EQ((int)alignment*2, rados_read(ioctx, "foo", buf3, alignment*2, 0)); - ASSERT_EQ(0, memcmp(buf3, buf, alignment)); - ASSERT_EQ(0, memcmp(buf3 + alignment, buf2, alignment)); - memset(unalignedbuf, 0, uasize); - ASSERT_EQ(0, rados_append(ioctx, "foo", unalignedbuf, uasize)); - ASSERT_EQ(-EOPNOTSUPP, rados_append(ioctx, "foo", unalignedbuf, uasize)); -} - -TEST_F(LibRadosIoECPP, AppendRoundTripPP) { - char *buf = (char *)new char[alignment]; - char *buf2 = (char *)new char[alignment]; - auto cleanup = [&] { - delete[] buf; - delete[] buf2; - }; - scope_guard sg(std::move(cleanup)); - memset(buf, 0xde, alignment); - bufferlist bl1; - bl1.append(buf, alignment); - ASSERT_EQ(0, ioctx.append("foo", bl1, alignment)); - memset(buf2, 0xad, alignment); - bufferlist bl2; - bl2.append(buf2, alignment); - ASSERT_EQ(0, ioctx.append("foo", bl2, alignment)); - bufferlist bl3; - ASSERT_EQ((int)(alignment * 2), - ioctx.read("foo", bl3, (alignment * 4), 0)); - const char *bl3_str = bl3.c_str(); - ASSERT_EQ(0, memcmp(bl3_str, buf, alignment)); - ASSERT_EQ(0, memcmp(bl3_str + alignment, buf2, alignment)); -} - -TEST_F(LibRadosIoEC, TruncTest) { - char buf[128]; - char buf2[sizeof(buf)]; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(-EOPNOTSUPP, rados_trunc(ioctx, "foo", sizeof(buf) / 2)); - memset(buf2, 0, sizeof(buf2)); - // Same size - ASSERT_EQ((int)sizeof(buf), rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); - // No change - ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf))); -} - -TEST_F(LibRadosIoECPP, TruncTestPP) { - char buf[128]; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl; - bl.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl, sizeof(buf))); - ASSERT_EQ(-EOPNOTSUPP, ioctx.trunc("foo", sizeof(buf) / 2)); - bufferlist bl2; - // Same size - ASSERT_EQ((int)sizeof(buf), ioctx.read("foo", bl2, sizeof(buf), 0)); - // No change - ASSERT_EQ(0, memcmp(bl2.c_str(), buf, sizeof(buf))); -} - -TEST_F(LibRadosIoEC, RemoveTest) { - char buf[128]; - char buf2[sizeof(buf)]; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, rados_remove(ioctx, "foo")); - memset(buf2, 0, sizeof(buf2)); - ASSERT_EQ(-ENOENT, rados_read(ioctx, "foo", buf2, sizeof(buf2), 0)); -} - -TEST_F(LibRadosIoECPP, RemoveTestPP) { - char buf[128]; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - ASSERT_EQ(0, ioctx.remove("foo")); - bufferlist bl2; - ASSERT_EQ(-ENOENT, ioctx.read("foo", bl2, sizeof(buf), 0)); -} - -TEST_F(LibRadosIoEC, XattrsRoundTrip) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(-ENODATA, rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ((int)sizeof(attr1_buf), - rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - ASSERT_EQ(0, memcmp(attr1_buf, buf, sizeof(attr1_buf))); -} - -TEST_F(LibRadosIoECPP, XattrsRoundTripPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - ASSERT_EQ(-ENODATA, ioctx.getxattr("foo", attr1, bl2)); - bufferlist bl3; - bl3.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl3)); - bufferlist bl4; - ASSERT_EQ((int)sizeof(attr1_buf), - ioctx.getxattr("foo", attr1, bl4)); - ASSERT_EQ(0, memcmp(bl4.c_str(), attr1_buf, sizeof(attr1_buf))); -} - -TEST_F(LibRadosIoEC, RmXattr) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, - rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ(0, rados_rmxattr(ioctx, "foo", attr1)); - ASSERT_EQ(-ENODATA, rados_getxattr(ioctx, "foo", attr1, buf, sizeof(buf))); - - // Test rmxattr on a removed object - char buf2[128]; - char attr2[] = "attr2"; - char attr2_buf[] = "foo bar baz"; - memset(buf2, 0xbb, sizeof(buf2)); - ASSERT_EQ(0, rados_write(ioctx, "foo_rmxattr", buf2, sizeof(buf2), 0)); - ASSERT_EQ(0, - rados_setxattr(ioctx, "foo_rmxattr", attr2, attr2_buf, sizeof(attr2_buf))); - ASSERT_EQ(0, rados_remove(ioctx, "foo_rmxattr")); - ASSERT_EQ(-ENOENT, rados_rmxattr(ioctx, "foo_rmxattr", attr2)); -} - -TEST_F(LibRadosIoECPP, RmXattrPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - bl2.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl2)); - ASSERT_EQ(0, ioctx.rmxattr("foo", attr1)); - bufferlist bl3; - ASSERT_EQ(-ENODATA, ioctx.getxattr("foo", attr1, bl3)); - - // Test rmxattr on a removed object - char buf2[128]; - char attr2[] = "attr2"; - char attr2_buf[] = "foo bar baz"; - memset(buf2, 0xbb, sizeof(buf2)); - bufferlist bl21; - bl21.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.write("foo_rmxattr", bl21, sizeof(buf2), 0)); - bufferlist bl22; - bl22.append(attr2_buf, sizeof(attr2_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo_rmxattr", attr2, bl22)); - ASSERT_EQ(0, ioctx.remove("foo_rmxattr")); - ASSERT_EQ(-ENOENT, ioctx.rmxattr("foo_rmxattr", attr2)); -} - -TEST_F(LibRadosIoEC, XattrIter) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - char attr2[] = "attr2"; - char attr2_buf[256]; - for (size_t j = 0; j < sizeof(attr2_buf); ++j) { - attr2_buf[j] = j % 0xff; - } - memset(buf, 0xaa, sizeof(buf)); - ASSERT_EQ(0, rados_append(ioctx, "foo", buf, sizeof(buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr1, attr1_buf, sizeof(attr1_buf))); - ASSERT_EQ(0, rados_setxattr(ioctx, "foo", attr2, attr2_buf, sizeof(attr2_buf))); - rados_xattrs_iter_t iter; - ASSERT_EQ(0, rados_getxattrs(ioctx, "foo", &iter)); - int num_seen = 0; - while (true) { - const char *name; - const char *val; - size_t len; - ASSERT_EQ(0, rados_getxattrs_next(iter, &name, &val, &len)); - if (name == NULL) { - break; - } - ASSERT_LT(num_seen, 2); - if ((strcmp(name, attr1) == 0) && (val != NULL) && (memcmp(val, attr1_buf, len) == 0)) { - num_seen++; - continue; - } - else if ((strcmp(name, attr2) == 0) && (val != NULL) && (memcmp(val, attr2_buf, len) == 0)) { - num_seen++; - continue; - } - else { - ASSERT_EQ(0, 1); - } - } - rados_getxattrs_end(iter); -} - -TEST_F(LibRadosIoECPP, XattrListPP) { - char buf[128]; - char attr1[] = "attr1"; - char attr1_buf[] = "foo bar baz"; - char attr2[] = "attr2"; - char attr2_buf[256]; - for (size_t j = 0; j < sizeof(attr2_buf); ++j) { - attr2_buf[j] = j % 0xff; - } - memset(buf, 0xaa, sizeof(buf)); - bufferlist bl1; - bl1.append(buf, sizeof(buf)); - ASSERT_EQ(0, ioctx.append("foo", bl1, sizeof(buf))); - bufferlist bl2; - bl2.append(attr1_buf, sizeof(attr1_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr1, bl2)); - bufferlist bl3; - bl3.append(attr2_buf, sizeof(attr2_buf)); - ASSERT_EQ(0, ioctx.setxattr("foo", attr2, bl3)); - std::map attrset; - ASSERT_EQ(0, ioctx.getxattrs("foo", attrset)); - for (std::map::iterator i = attrset.begin(); - i != attrset.end(); ++i) { - if (i->first == string(attr1)) { - ASSERT_EQ(0, memcmp(i->second.c_str(), attr1_buf, sizeof(attr1_buf))); - } - else if (i->first == string(attr2)) { - ASSERT_EQ(0, memcmp(i->second.c_str(), attr2_buf, sizeof(attr2_buf))); - } - else { - ASSERT_EQ(0, 1); - } - } -} - -TEST_F(LibRadosIoPP, CmpExtPP) { - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write1; - write1.write(0, bl); - ASSERT_EQ(0, ioctx.operate("foo", &write1)); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write2; - write2.cmpext(0, bl, nullptr); - write2.write(0, new_bl); - ASSERT_EQ(0, ioctx.operate("foo", &write2)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "CEPH", 4)); -} - -TEST_F(LibRadosIoPP, CmpExtDNEPP) { - bufferlist bl; - bl.append(std::string(4, '\0')); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write; - write.cmpext(0, bl, nullptr); - write.write(0, new_bl); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "CEPH", 4)); -} - -TEST_F(LibRadosIoPP, CmpExtMismatchPP) { - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write1; - write1.write(0, bl); - ASSERT_EQ(0, ioctx.operate("foo", &write1)); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write2; - write2.cmpext(0, new_bl, nullptr); - write2.write(0, new_bl); - ASSERT_EQ(-MAX_ERRNO, ioctx.operate("foo", &write2)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -} - -TEST_F(LibRadosIoECPP, CmpExtPP) { - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write1; - write1.write(0, bl); - ASSERT_EQ(0, ioctx.operate("foo", &write1)); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write2; - write2.cmpext(0, bl, nullptr); - write2.write_full(new_bl); - ASSERT_EQ(0, ioctx.operate("foo", &write2)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "CEPH", 4)); -} - -TEST_F(LibRadosIoECPP, CmpExtDNEPP) { - bufferlist bl; - bl.append(std::string(4, '\0')); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write; - write.cmpext(0, bl, nullptr); - write.write_full(new_bl); - ASSERT_EQ(0, ioctx.operate("foo", &write)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "CEPH", 4)); -} - -TEST_F(LibRadosIoECPP, CmpExtMismatchPP) { - bufferlist bl; - bl.append("ceph"); - ObjectWriteOperation write1; - write1.write(0, bl); - ASSERT_EQ(0, ioctx.operate("foo", &write1)); - - bufferlist new_bl; - new_bl.append("CEPH"); - ObjectWriteOperation write2; - write2.cmpext(0, new_bl, nullptr); - write2.write_full(new_bl); - ASSERT_EQ(-MAX_ERRNO, ioctx.operate("foo", &write2)); - - ObjectReadOperation read; - read.read(0, bl.length(), NULL, NULL); - ASSERT_EQ(0, ioctx.operate("foo", &read, &bl)); - ASSERT_EQ(0, memcmp(bl.c_str(), "ceph", 4)); -}