diff options
author | Noah Watkins <noahwatkins@gmail.com> | 2012-11-28 15:33:45 -0800 |
---|---|---|
committer | Noah Watkins <noahwatkins@gmail.com> | 2013-01-05 11:42:43 -0800 |
commit | e1112f9ae1c29165656c6540c6b36be712a92f7f (patch) | |
tree | ee8507d98aa4a902280e7fe05f2c0fb72ba8a942 | |
parent | 8548a88d476adffdf7e01d2fee38a67d7675bd54 (diff) | |
download | ceph-e1112f9ae1c29165656c6540c6b36be712a92f7f.tar.gz |
test: auto create/cleanup ceph mount instances
Adds a test fixture which creates and destroys a ceph mount
automatically for each test. This lets us easily alter the mount before
each test runs. We'll use this to enable/disable local reads for each
test.
Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
-rw-r--r-- | src/test/libcephfs/test.cc | 289 |
1 files changed, 91 insertions, 198 deletions
diff --git a/src/test/libcephfs/test.cc b/src/test/libcephfs/test.cc index b8c62dff23e..9cd6541a0a6 100644 --- a/src/test/libcephfs/test.cc +++ b/src/test/libcephfs/test.cc @@ -22,13 +22,54 @@ #include <dirent.h> #include <sys/xattr.h> -TEST(LibCephFS, OpenEmptyComponent) { +class ConfiguredMountTest : public ::testing::Test { + protected: + struct ceph_mount_info *cmount; + + virtual void SetUp() { + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + } + + virtual void TearDown() { + ASSERT_EQ(ceph_release(cmount), 0); + } + + void RefreshMount() { + ASSERT_EQ(ceph_release(cmount), 0); + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + } +}; + +class MountedTest : public ConfiguredMountTest { + protected: + virtual void SetUp() { + ConfiguredMountTest::SetUp(); + Mount(); + } + + virtual void TearDown() { + ASSERT_EQ(ceph_unmount(cmount), 0); + ConfiguredMountTest::TearDown(); + } + + void Remount(bool deep=false) { + ASSERT_EQ(ceph_unmount(cmount), 0); + if (deep) + ConfiguredMountTest::RefreshMount(); + Mount(); + } + + private: + void Mount() { + ASSERT_EQ(ceph_mount(cmount, NULL), 0); + } +}; + +TEST_F(MountedTest, OpenEmptyComponent) { pid_t mypid = getpid(); - struct ceph_mount_info *cmount; - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_mount(cmount, "/")); char c_dir[1024]; sprintf(c_dir, "/open_test_%d", mypid); @@ -45,116 +86,65 @@ TEST(LibCephFS, OpenEmptyComponent) { ASSERT_EQ(0, ceph_close(cmount, fd)); ASSERT_EQ(0, ceph_closedir(cmount, dirp)); - ceph_shutdown(cmount); - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - - ASSERT_EQ(0, ceph_mount(cmount, "/")); + Remount(); fd = ceph_open(cmount, c_path, O_RDONLY, 0666); ASSERT_LT(0, fd); ASSERT_EQ(0, ceph_close(cmount, fd)); - ceph_shutdown(cmount); } -TEST(LibCephFS, MountNonExist) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); +TEST_F(ConfiguredMountTest, MountNonExist) { ASSERT_NE(0, ceph_mount(cmount, "/non-exist")); } -TEST(LibCephFS, MountDouble) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_mount(cmount, "/")); +TEST_F(MountedTest, MountDouble) { ASSERT_EQ(-EISCONN, ceph_mount(cmount, "/")); - ceph_shutdown(cmount); } -TEST(LibCephFS, MountRemount) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - +TEST_F(MountedTest, MountRemount) { CephContext *cct = ceph_get_mount_context(cmount); - ASSERT_EQ(0, ceph_mount(cmount, "/")); - ASSERT_EQ(0, ceph_unmount(cmount)); - - ASSERT_EQ(0, ceph_mount(cmount, "/")); + Remount(); ASSERT_EQ(cct, ceph_get_mount_context(cmount)); - - ceph_shutdown(cmount); } -TEST(LibCephFS, UnmountUnmounted) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); +TEST_F(ConfiguredMountTest, UnmountUnmounted) { ASSERT_EQ(-ENOTCONN, ceph_unmount(cmount)); } -TEST(LibCephFS, ReleaseUnmounted) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_release(cmount)); +TEST_F(ConfiguredMountTest, ReleaseUnmounted) { + // Default behavior of ConfiguredMountTest } -TEST(LibCephFS, ReleaseMounted) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_mount(cmount, "/")); +TEST_F(MountedTest, ReleaseMounted) { ASSERT_EQ(-EISCONN, ceph_release(cmount)); - ceph_shutdown(cmount); } -TEST(LibCephFS, UnmountRelease) { - - struct ceph_mount_info *cmount; - - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_mount(cmount, "/")); - ASSERT_EQ(0, ceph_unmount(cmount)); - ASSERT_EQ(0, ceph_release(cmount)); +TEST_F(MountedTest, UnmountRelease) { + // Default behavior of ConfiguredMountTest } -TEST(LibCephFS, Mount) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - ceph_shutdown(cmount); - - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - ceph_shutdown(cmount); +TEST_F(MountedTest, Mount) { + /* + * Remount(true) will reproduce the following. The first mount operation is + * taken care of by the fixture. + * + * struct ceph_mount_info *cmount; + * ASSERT_EQ(ceph_create(&cmount, NULL), 0); + * ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + * ASSERT_EQ(ceph_mount(cmount, NULL), 0); + * ceph_shutdown(cmount); + * + * ASSERT_EQ(ceph_create(&cmount, NULL), 0); + * ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + * ASSERT_EQ(ceph_mount(cmount, NULL), 0); + * ceph_shutdown(cmount); + */ + Remount(true); } -TEST(LibCephFS, OpenLayout) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, OpenLayout) { /* valid layout */ char test_layout_file[256]; sprintf(test_layout_file, "test_layout_%d_b", getpid()); @@ -188,19 +178,12 @@ TEST(LibCephFS, OpenLayout) { sprintf(test_layout_file, "test_layout_%d_f", getpid()); fd = ceph_open_layout(cmount, test_layout_file, O_CREAT, 0666, (1<<20), 7, (1<<20), "asdfjasdfjasdf"); ASSERT_EQ(fd, -EINVAL); - - ceph_shutdown(cmount); } -TEST(LibCephFS, DirLs) { +TEST_F(MountedTest, DirLs) { pid_t mypid = getpid(); - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, "/"), 0); - struct ceph_dir_result *ls_dir = NULL; char foostr[256]; sprintf(foostr, "dir_ls%d", mypid); @@ -349,16 +332,9 @@ TEST(LibCephFS, DirLs) { } ASSERT_EQ(ceph_closedir(cmount, ls_dir), 0); - - ceph_shutdown(cmount); } -TEST(LibCephFS, ManyNestedDirs) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, ManyNestedDirs) { const char *many_path = "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a"; ASSERT_EQ(ceph_mkdirs(cmount, many_path, 0755), 0); @@ -393,16 +369,9 @@ TEST(LibCephFS, ManyNestedDirs) { ASSERT_EQ(ceph_chdir(cmount, "/"), 0); ASSERT_EQ(ceph_rmdir(cmount, "a/a/a"), 0); - - ceph_shutdown(cmount); } -TEST(LibCephFS, Xattrs) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, Xattrs) { char test_xattr_file[256]; sprintf(test_xattr_file, "test_xattr_%d", getpid()); int fd = ceph_open(cmount, test_xattr_file, O_CREAT, 0666); @@ -445,28 +414,15 @@ TEST(LibCephFS, Xattrs) { } ceph_close(cmount, fd); - ceph_shutdown(cmount); } -TEST(LibCephFS, LstatSlashdot) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, LstatSlashdot) { struct stat stbuf; ASSERT_EQ(ceph_lstat(cmount, "/.", &stbuf), 0); ASSERT_EQ(ceph_lstat(cmount, ".", &stbuf), 0); - - ceph_shutdown(cmount); } -TEST(LibCephFS, DoubleChmod) { - - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); +TEST_F(MountedTest, DoubleChmod) { char test_file[256]; sprintf(test_file, "test_perms_%d", getpid()); @@ -512,16 +468,9 @@ TEST(LibCephFS, DoubleChmod) { ASSERT_EQ(ceph_write(cmount, fd, bytes, strlen(bytes), 0), (int)strlen(bytes)); ceph_close(cmount, fd); - - ceph_shutdown(cmount); } -TEST(LibCephFS, Fchmod) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, Fchmod) { char test_file[256]; sprintf(test_file, "test_perms_%d", getpid()); @@ -555,16 +504,9 @@ TEST(LibCephFS, Fchmod) { ASSERT_EQ(ceph_write(cmount, fd, bytes, strlen(bytes), 0), (int)strlen(bytes)); ceph_close(cmount, fd); - - ceph_shutdown(cmount); } -TEST(LibCephFS, Fchown) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, Fchown) { char test_file[256]; sprintf(test_file, "test_fchown_%d", getpid()); @@ -581,15 +523,9 @@ TEST(LibCephFS, Fchown) { fd = ceph_open(cmount, test_file, O_RDWR, 0); ASSERT_EQ(fd, -EACCES); - ceph_shutdown(cmount); } -TEST(LibCephFS, Symlinks) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, Symlinks) { char test_file[256]; sprintf(test_file, "test_symlinks_%d", getpid()); @@ -634,16 +570,9 @@ TEST(LibCephFS, Symlinks) { struct stat stbuf_symlink; ASSERT_EQ(ceph_lstat(cmount, test_symlink, &stbuf_symlink), 0); ASSERT_TRUE(S_ISLNK(stbuf_symlink.st_mode)); - - ceph_shutdown(cmount); } -TEST(LibCephFS, DirSyms) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, DirSyms) { char test_dir1[256]; sprintf(test_dir1, "dir1_symlinks_%d", getpid()); @@ -665,16 +594,9 @@ TEST(LibCephFS, DirSyms) { // ensure that its a file not a directory we get back ASSERT_TRUE(S_ISREG(stbuf.st_mode)); - - ceph_shutdown(cmount); } -TEST(LibCephFS, LoopSyms) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, LoopSyms) { char test_dir1[256]; sprintf(test_dir1, "dir1_loopsym_%d", getpid()); @@ -705,19 +627,12 @@ TEST(LibCephFS, LoopSyms) { ASSERT_EQ(ceph_symlink(cmount, b, c), 0); ASSERT_EQ(ceph_symlink(cmount, c, a), 0); ASSERT_EQ(ceph_open(cmount, a, O_RDWR, 0), -ELOOP); - - ceph_shutdown(cmount); } -TEST(LibCephFS, HardlinkNoOriginal) { +TEST_F(MountedTest, HardlinkNoOriginal) { int mypid = getpid(); - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - char dir[256]; sprintf(dir, "/test_rmdirfail%d", mypid); ASSERT_EQ(ceph_mkdir(cmount, dir, 0777), 0); @@ -735,25 +650,16 @@ TEST(LibCephFS, HardlinkNoOriginal) { // remove file link points to ASSERT_EQ(ceph_unlink(cmount, "f1"), 0); - ceph_shutdown(cmount); + /* Complete refresh (builds new context) */ + Remount(true); // now cleanup - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); ASSERT_EQ(ceph_chdir(cmount, dir), 0); ASSERT_EQ(ceph_unlink(cmount, "hardl1"), 0); ASSERT_EQ(ceph_rmdir(cmount, dir), 0); - - ceph_shutdown(cmount); } -TEST(LibCephFS, BadFileDesc) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, BadFileDesc) { ASSERT_EQ(ceph_fchmod(cmount, -1, 0655), -EBADF); ASSERT_EQ(ceph_close(cmount, -1), -EBADF); ASSERT_EQ(ceph_lseek(cmount, -1, 0, SEEK_SET), -EBADF); @@ -776,12 +682,7 @@ TEST(LibCephFS, BadFileDesc) { ASSERT_EQ(ceph_get_file_replication(cmount, -1), -EBADF); } -TEST(LibCephFS, ReadEmptyFile) { - struct ceph_mount_info *cmount; - ASSERT_EQ(ceph_create(&cmount, NULL), 0); - ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); - ASSERT_EQ(ceph_mount(cmount, NULL), 0); - +TEST_F(MountedTest, ReadEmptyFile) { // test the read_sync path in the client for zero files ASSERT_EQ(ceph_conf_set(cmount, "client_debug_force_sync_read", "true"), 0); @@ -801,15 +702,9 @@ TEST(LibCephFS, ReadEmptyFile) { ASSERT_EQ(ceph_read(cmount, fd, buf, 4096, 0), 0); ceph_close(cmount, fd); - ceph_shutdown(cmount); } -TEST(LibCephFS, ReaddirRCB) { - struct ceph_mount_info *cmount; - ASSERT_EQ(0, ceph_create(&cmount, NULL)); - ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); - ASSERT_EQ(0, ceph_mount(cmount, "/")); - +TEST_F(MountedTest, ReaddirRCB) { char c_dir[256]; sprintf(c_dir, "/readdir_r_cb_tests_%d", getpid()); struct ceph_dir_result *dirp; @@ -842,6 +737,4 @@ TEST(LibCephFS, ReaddirRCB) { ASSERT_EQ(5, ceph_getdnames(cmount, dirp, buf, 6)); ASSERT_EQ(4, ceph_getdnames(cmount, dirp, buf, 6)); ASSERT_LE(0, ceph_closedir(cmount, dirp)); - - ceph_shutdown(cmount); } |