From: Samuel Just Date: Sat, 2 Apr 2016 00:50:37 +0000 (-0700) Subject: test/objectstore/chain_xattr.cc: add test for ensure_single_attr X-Git-Tag: v10.1.2~7^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=18b9f95a4a233dfe7f32cbceb78ec0c5a6fd695c;p=ceph.git test/objectstore/chain_xattr.cc: add test for ensure_single_attr Signed-off-by: Samuel Just --- diff --git a/src/test/objectstore/chain_xattr.cc b/src/test/objectstore/chain_xattr.cc index 5080321cfc65..d3b4b1e9eeaf 100644 --- a/src/test/objectstore/chain_xattr.cc +++ b/src/test/objectstore/chain_xattr.cc @@ -259,6 +259,120 @@ TEST(chain_xattr, listxattr) { ::unlink(file); } +list get_xattrs(int fd) +{ + char _buf[1024]; + char *buf = _buf; + int len = sys_flistxattr(fd, _buf, sizeof(_buf)); + if (len < 0) + return list(); + list ret; + while (len > 0) { + size_t next_len = strlen(buf); + ret.push_back(string(buf, buf + next_len)); + assert(len >= (int)(next_len + 1)); + buf += (next_len + 1); + len -= (next_len + 1); + } + return ret; +} + +list get_xattrs(string fn) +{ + int fd = ::open(fn.c_str(), O_RDONLY); + if (fd < 0) + return list(); + auto ret = get_xattrs(fd); + ::close(fd); + return ret; +} + +TEST(chain_xattr, fskip_chain_cleanup_and_ensure_single_attr) +{ + const char *name = "user.foo"; + const char *file = FILENAME; + ::unlink(file); + int fd = ::open(file, O_CREAT|O_RDWR|O_TRUNC, 0700); + + char buf[800]; + memset(buf, sizeof(buf), 0x1F); + // set chunked without either + { + int r = chain_fsetxattr(fd, name, buf, sizeof(buf)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_GT(get_xattrs(fd).size(), 1); + } + + // verify + { + char buf2[sizeof(buf)*2]; + int r = chain_fgetxattr(fd, name, buf2, sizeof(buf2)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_EQ(memcmp(buf, buf2, sizeof(buf)), 0); + } + + // overwrite + { + int r = chain_fsetxattr(fd, name, buf, sizeof(buf)); + ASSERT_EQ(r, sizeof (buf)); + ASSERT_EQ(get_xattrs(fd).size(), 1); + } + + // verify + { + char buf2[sizeof(buf)*2]; + int r = chain_fgetxattr(fd, name, buf2, sizeof(buf2)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_EQ(memcmp(buf, buf2, sizeof(buf)), 0); + } + + ::close(fd); + ::unlink(file); +} + +TEST(chain_xattr, skip_chain_cleanup_and_ensure_single_attr) +{ + const char *name = "user.foo"; + const char *file = FILENAME; + ::unlink(file); + int fd = ::open(file, O_CREAT|O_RDWR|O_TRUNC, 0700); + ::close(fd); + + char buf[3000]; + memset(buf, sizeof(buf), 0x1F); + // set chunked without either + { + int r = chain_setxattr(file, name, buf, sizeof(buf)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_GT(get_xattrs(file).size(), 1); + } + + // verify + { + char buf2[sizeof(buf)*2]; + int r = chain_getxattr(file, name, buf2, sizeof(buf2)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_EQ(memcmp(buf, buf2, sizeof(buf)), 0); + } + + // overwrite + { + int r = chain_setxattr(file, name, buf, sizeof(buf)); + ASSERT_EQ(r, sizeof (buf)); + ASSERT_EQ(get_xattrs(file).size(), 1); + } + + // verify + { + char buf2[sizeof(buf)*2]; + int r = chain_getxattr(file, name, buf2, sizeof(buf2)); + ASSERT_EQ(r, sizeof(buf)); + ASSERT_EQ(memcmp(buf, buf2, sizeof(buf)), 0); + } + + ::unlink(file); +} + int main(int argc, char **argv) { vector args; argv_to_vec(argc, (const char **)argv, args);