On Wed, 6 Feb 2013, Loic Dachary wrote:
> Hi,
>
> The patch below adds unit tests for FileStore::_detect_fs, but it needs to run
> as root in order to mount the ext3, ext4 and btrfs file systems created for
> test purposes.
>
> Is there a way to mount filesystems without root privileges ?
Not that I know of.
There are several other tests that are meant ot be run separate from the
build environment that use gtest (test_filejournal, the api functional
tests, etc.). As long as this is built to a separate binary, I don't
think it's a problem. We should converge on unittest_* for the stuff
'make check' runs and test_* for stuff that is meant to run elsewhere.
Having our normal qa harness be root is not a problem.
> configure.ac does not detect the presence of commands such as
> mkfs.ext4 or mkfs.btrfs. The patch below does not add
> AC_CHECK_TOOL([BTRFS], [mkfs.btrfs], ...) because it has no use
> except for unit testing. Instead, the TEST_F(StoreTest, _detect_fs)
> function checks if /sbin/mkfs.btrfs is an executable. If it is not,
> "SKIP btrfs because /sbin/mkfs.btrfs is not executable" is displayed
> and nothing is done.
>
> The drawback is that it is quite difficult to figure out what tools
> must be installed to maximize test coverage.
>
> How would you implement unit test tools detection ?
>
> The error returned when ext4 is mounted without user_xattr is the same
> as the error returned when ext4 is is mounted with user_xattr but
> without the filestore_xattr_use_omap option : -ENOTSUP. From the point
> of view of the unit tests, they cannot be distinguished, except by
> parsing the messages sent to derr which show
>
> Extended attributes don't appear to work.
>
> or
>
> limited size xattrs -- enable filestore_xattr_use_omap
>
> Is parsing the output a good practice to assert success or failure during
> unit testing ?
I'm not sure it is worth the complexity. IMO it would be better to change
the return value (suggestions?) or not both distinguishing between the two
cases in the test.
sage
>
> Cheers
>
> diff --git a/src/test/filestore/store_test.cc
> b/src/test/filestore/store_test.cc
> index c98ffb0..7ba38e2 100644
> --- a/src/test/filestore/store_test.cc
> +++ b/src/test/filestore/store_test.cc
> @@ -16,6 +16,7 @@
> #include <string.h>
> #include <iostream>
> #include <time.h>
> +#include <sys/mount.h>
> #include "os/FileStore.h"
> #include "include/Context.h"
> #include "common/ceph_argparse.h"
> @@ -38,6 +39,7 @@ public:
>
> StoreTest() : store(0) {}
> virtual void SetUp() {
> + ::system("rm -fr store_test_temp_dir store_test_temp_journal");
> ::mkdir("store_test_temp_dir", 0777);
> ObjectStore *store_ = new FileStore(string("store_test_temp_dir"),
> string("store_test_temp_journal"));
> store.reset(store_);
> @@ -823,6 +825,95 @@ TEST_F(StoreTest, ColSplitTest3) {
> }
> #endif
>
> +TEST_F(StoreTest, _detect_fs) {
> + if (getuid() != 0) {
> + cerr << "SKIP because it does not run as root" << std::endl;
> + return;
> + }
> +
> + if (access("/dev/zero", R_OK) != 0) {
> + cerr << "SKIP because /dev/zero is not a readable file" << std::endl;
> + return;
> + }
> +
> + const string mnt("/tmp/test_filestore");
> + ::mkdir(mnt.c_str(), 0755);
> + ::umount(mnt.c_str());
> + const string disk(mnt + ".disk");
> + ::unlink(disk.c_str());
> + ASSERT_EQ(::system(string("dd if=/dev/zero of=" + disk + " bs=1 count=0
> seek=1G").c_str()), 0);
> +
> + const string dir("store_test_temp_dir");
> + const string journal("store_test_temp_journal");
> +
> + const string mkfs_ext4("/sbin/mkfs.ext4");
> + if (::access(mkfs_ext4.c_str(), X_OK) == 0) {
> +
> + ASSERT_EQ(::system((mkfs_ext4 + " -q -F " + disk).c_str()), 0);
> + //
> + // without user_xattr, ext4 fails
> + //
> + {
> + g_ceph_context->_conf->set_val("filestore_xattr_use_omap", "true");
> + ASSERT_EQ(::system((string("mount -o loop,nouser_xattr ") + disk + " "
> + mnt).c_str()), 0);
> + ASSERT_EQ(::chdir(mnt.c_str()), 0);
> + ASSERT_EQ(::mkdir(dir.c_str(), 0755), 0);
> + FileStore store(dir, journal);
> + ASSERT_EQ(store._detect_fs(), -ENOTSUP);
> + ASSERT_EQ(::chdir("/tmp"), 0);
> + ASSERT_EQ(::umount(mnt.c_str()), 0);
> + }
> + //
> + // mounted with user_xattr, ext4 fails if filestore_xattr_use_omap is
> false
> + //
> + {
> + g_ceph_context->_conf->set_val("filestore_xattr_use_omap", "false");
> + ASSERT_EQ(::system((string("mount -o loop,user_xattr ") + disk + " " +
> mnt).c_str()), 0);
> + ASSERT_EQ(::chdir(mnt.c_str()), 0);
> + FileStore store(dir, journal);
> + ASSERT_EQ(store._detect_fs(), -ENOTSUP);
> + ASSERT_EQ(::chdir("/tmp"), 0);
> + ASSERT_EQ(::umount(mnt.c_str()), 0);
> + }
> + //
> + // mounted with user_xattr, ext4 succeeds if filestore_xattr_use_omap is
> true
> + //
> + {
> + g_ceph_context->_conf->set_val("filestore_xattr_use_omap", "true");
> + ASSERT_EQ(::system((string("mount -o loop,user_xattr ") + disk + " " +
> mnt).c_str()), 0);
> + ASSERT_EQ(::chdir(mnt.c_str()), 0);
> + FileStore store(dir, journal);
> + ASSERT_EQ(store._detect_fs(), 0);
> + ASSERT_EQ(::chdir("/tmp"), 0);
> + ASSERT_EQ(::umount(mnt.c_str()), 0);
> + }
> + } else {
> + cerr << "SKIP ext4 because " << mkfs_ext4 << " is not executable" <<
> std::endl;
> + }
> +
> + g_ceph_context->_conf->set_val("filestore_xattr_use_omap", "false");
> + ASSERT_EQ(::unlink(disk.c_str()), 0);
> + ASSERT_EQ(::system(string("dd if=/dev/zero of=" + disk + " bs=1 count=0
> seek=1G").c_str()), 0);
> + const string mkfs_btrfs("/sbin/mkfs.btrfs");
> + if (::access(mkfs_btrfs.c_str(), X_OK) == 0) {
> + ASSERT_EQ(::system((mkfs_btrfs + " " + disk).c_str()), 0);
> + //
> + // btrfs succeeds
> + //
> + {
> + ASSERT_EQ(::system((string("mount -o loop ") + disk + " " +
> mnt).c_str()), 0);
> + ASSERT_EQ(::chdir(mnt.c_str()), 0);
> + ASSERT_EQ(::mkdir(dir.c_str(), 0755), 0);
> + FileStore store(dir, journal);
> + ASSERT_EQ(store._detect_fs(), 0);
> + ASSERT_EQ(::chdir("/tmp"), 0);
> + ASSERT_EQ(::umount(mnt.c_str()), 0);
> + }
> + } else {
> + cerr << "SKIP btrfs because " << mkfs_btrfs << " is not executable" <<
> std::endl;
> + }
> +}
> +
>
> --
> Lo?c Dachary, Artisan Logiciel Libre
>
>
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html