From aefcd5dcdcbc9a265b54a331b212f269769c61cd Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 14 Feb 2016 20:17:37 +0000 Subject: Almost complete coverage of basic directory operations --- netfs/daemon/daemonDirectory.cpp | 4 +++ netfs/unittests/testCore.cpp | 54 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/netfs/daemon/daemonDirectory.cpp b/netfs/daemon/daemonDirectory.cpp index 86b595f..8c6c344 100644 --- a/netfs/daemon/daemonDirectory.cpp +++ b/netfs/daemon/daemonDirectory.cpp @@ -20,7 +20,9 @@ DirectoryServer::close(const Ice::Current & ice) { errno = 0; if (::closedir(od) != 0) { + // LCOV_EXCL_START throw NetFS::SystemError(errno); + // LCOV_EXCL_STOP } ice.adapter->remove(ice.id); } @@ -32,7 +34,9 @@ DirectoryServer::readdir(const Ice::Current&) NetFS::NameList list; while (dirent * d = ::readdir(od)) { if (errno) { + // LCOV_EXCL_START throw NetFS::SystemError(errno); + // LCOV_EXCL_STOP } list.push_back(d->d_name); } diff --git a/netfs/unittests/testCore.cpp b/netfs/unittests/testCore.cpp index 6f8eb57..9610111 100644 --- a/netfs/unittests/testCore.cpp +++ b/netfs/unittests/testCore.cpp @@ -5,6 +5,7 @@ #include #include #include +#include const auto testExport = stringbf("testExport-%d", getpid()); const std::string testEndpoint("tcp -h localhost -p 12012"); @@ -131,6 +132,59 @@ BOOST_AUTO_TEST_CASE( testSandboxing ) BOOST_REQUIRE(boost::filesystem::exists(binDir / testExport / "inside")); } +int +nameListAdd(void *buf, const char *name, const struct stat *, off_t) +{ + static_cast(buf)->push_back(name); + return 0; +} + +BOOST_AUTO_TEST_CASE( directories ) +{ + struct fuse_file_info fi; + memset(&fi, 0, sizeof(fi)); + struct stat st; + memset(&st, 0, sizeof(st)); + BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), 0); + BOOST_REQUIRE(boost::filesystem::is_directory(binDir / testExport / "test")); + BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), -EEXIST); + BOOST_REQUIRE_EQUAL(fuse->getattr("/test", &st), 0); + + BOOST_REQUIRE_EQUAL(fuse->opendir("/test", &fi), 0); + NetFS::NameList nl; + BOOST_REQUIRE_EQUAL(fuse->readdir("/test", &nl, &nameListAdd, 0, &fi), 0); + BOOST_REQUIRE_EQUAL(nl.size(), 2); + std::sort(nl.begin(), nl.end()); + BOOST_REQUIRE_EQUAL(nl[0], "."); + BOOST_REQUIRE_EQUAL(nl[1], ".."); + BOOST_REQUIRE_EQUAL(fuse->getattr("/test/.", &st), 0); + BOOST_REQUIRE_EQUAL(fuse->getattr("/test/..", &st), 0); + BOOST_REQUIRE_EQUAL(fuse->releasedir("/test", &fi), 0); + nl.clear(); + + BOOST_REQUIRE_EQUAL(fuse->mkdir("/test/sub", 0700), 0); + BOOST_REQUIRE_EQUAL(fuse->opendir("/test", &fi), 0); + BOOST_REQUIRE_EQUAL(fuse->readdir("/test", &nl, &nameListAdd, 0, &fi), 0); + BOOST_REQUIRE_EQUAL(nl.size(), 3); + std::sort(nl.begin(), nl.end()); + BOOST_REQUIRE_EQUAL(nl[0], "."); + BOOST_REQUIRE_EQUAL(nl[1], ".."); + BOOST_REQUIRE_EQUAL(nl[2], "sub"); + BOOST_REQUIRE_EQUAL(fuse->releasedir("/test", &fi), 0); + nl.clear(); + + BOOST_REQUIRE_EQUAL(fuse->readdir("/test", &nl, &nameListAdd, 0, &fi), -EBADF); + BOOST_REQUIRE_EQUAL(fuse->releasedir("/test", &fi), -EBADF); + + BOOST_REQUIRE_EQUAL(fuse->rmdir("/test"), -ENOTEMPTY); + BOOST_REQUIRE_EQUAL(fuse->rmdir("/test/sub"), 0); + BOOST_REQUIRE_EQUAL(fuse->rmdir("/test"), 0); + BOOST_REQUIRE(!boost::filesystem::is_directory(binDir / testExport / "test")); + BOOST_REQUIRE_EQUAL(fuse->rmdir("/test"), -ENOENT); + BOOST_REQUIRE_EQUAL(fuse->getattr("/test", &st), -ENOENT); + BOOST_REQUIRE_EQUAL(fuse->opendir("/test", &fi), -ENOENT); +} + BOOST_AUTO_TEST_SUITE_END(); BOOST_AUTO_TEST_CASE( testNoAuthNoPass ) -- cgit v1.2.3