summaryrefslogtreecommitdiff
path: root/unittests
diff options
context:
space:
mode:
Diffstat (limited to 'unittests')
-rw-r--r--unittests/Jamfile.jam6
-rw-r--r--unittests/config.cpp7
-rw-r--r--unittests/core.cpp63
-rw-r--r--unittests/mockDefs.cpp5
-rw-r--r--unittests/mockDefs.h5
-rw-r--r--unittests/perf.cpp50
-rw-r--r--unittests/service.cpp2
7 files changed, 106 insertions, 32 deletions
diff --git a/unittests/Jamfile.jam b/unittests/Jamfile.jam
index 830fd25..b27d67a 100644
--- a/unittests/Jamfile.jam
+++ b/unittests/Jamfile.jam
@@ -1,7 +1,6 @@
-import testing ;
-
lib boost_utf : : <name>boost_unit_test_framework ;
lib dryice : : : : <library>..//icetray ;
+lib benchmark ;
path-constant gitdir : ../.git ;
@@ -25,4 +24,5 @@ lib common :
run config.cpp : : : <library>common ;
run core.cpp : : : <library>common ;
run service.cpp : : : <library>common ;
-
+explicit perf ;
+run perf.cpp : : : <library>common <library>benchmark ;
diff --git a/unittests/config.cpp b/unittests/config.cpp
index 6e3f92c..72d7d31 100644
--- a/unittests/config.cpp
+++ b/unittests/config.cpp
@@ -7,11 +7,10 @@
#include <definedDirs.h>
#include <dryice.h>
#include <filesystem>
-#include <map>
-#include <memory>
#include <service.h>
#include <string>
#include <volume.h>
+
namespace NetFS {
class ConfigError;
}
@@ -42,7 +41,7 @@ const auto DIRS = btdata::make({"/", "/src", "/unittests/fixtures"});
const auto FILES = btdata::make({"/Jamroot.jam", "/src/repo.cpp", "/unittests/fixtures/executable"});
const auto LINKS = btdata::make({"/unittests/fixtures/symlink"});
const auto COMMITISHS
- = btdata::make({"", "master", "origin/master", "testcommit", "7a0ccb40084c3ab31d9856e7f689c0514c28c930"});
+ = btdata::make({"", "main", "origin/main", "testcommit", "7a0ccb40084c3ab31d9856e7f689c0514c28c930"});
BOOST_DATA_TEST_CASE(uid_gid_override_getattr, USERS * GROUPS *(DIRS + FILES + LINKS), uid, gid, path)
{
@@ -62,7 +61,7 @@ BOOST_DATA_TEST_CASE(uid_gid_override_fgetattr, USERS * GROUPS * FILES, uid, gid
BOOST_CHECK_NO_THROW(c.s->ice_ping());
auto file = c.v->open(c.env, path, {});
- auto attr = file->fgetattr(c.env);
+ auto attr = file->fgetattr();
BOOST_CHECK_EQUAL(attr.uid, uid);
BOOST_CHECK_EQUAL(attr.gid, gid);
file->close();
diff --git a/unittests/core.cpp b/unittests/core.cpp
index e64ae80..f496508 100644
--- a/unittests/core.cpp
+++ b/unittests/core.cpp
@@ -8,8 +8,6 @@
#include <cstdio>
#include <exceptions.h>
#include <fcntl.h>
-#include <map>
-#include <memory>
#include <ostream>
#include <string>
#include <sys/stat.h>
@@ -125,38 +123,46 @@ BOOST_DATA_TEST_CASE(
{
BOOST_CHECK_EQUAL(EACCES, v->access(env, path, W_OK));
}
+
BOOST_DATA_TEST_CASE(accessDirs, DIRPATHS, path)
{
BOOST_CHECK_EQUAL(0, v->access(env, path, R_OK));
BOOST_CHECK_EQUAL(0, v->access(env, path, X_OK));
}
+
BOOST_DATA_TEST_CASE(accessRead, REGPATHS, path)
{
BOOST_CHECK_EQUAL(0, v->access(env, path, R_OK));
BOOST_CHECK_EQUAL(EACCES, v->access(env, path, X_OK));
}
+
BOOST_DATA_TEST_CASE(accessLink, LINKPATHS, path)
{
BOOST_CHECK_EQUAL(0, v->access(env, path, R_OK));
BOOST_CHECK_EQUAL(0, v->access(env, path, X_OK));
}
+
BOOST_DATA_TEST_CASE(accessExec, EXECPATHS, path)
{
BOOST_CHECK_EQUAL(0, v->access(env, path, R_OK));
BOOST_CHECK_EQUAL(0, v->access(env, path, X_OK));
}
+
BOOST_DATA_TEST_CASE(accessInval, INVALIDPATHS * btdata::make({R_OK, X_OK}), path, mode)
{
BOOST_CHECK_EQUAL(EINVAL, v->access(env, path, mode));
}
+
BOOST_DATA_TEST_CASE(accessBad, BADPATHS * btdata::make({R_OK, X_OK}), path, mode)
{
BOOST_CHECK_EQUAL(ENOENT, v->access(env, path, mode));
}
+
BOOST_DATA_TEST_CASE(statInval, INVALIDPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->getattr(env, path), EINVAL);
}
+
BOOST_DATA_TEST_CASE(statBad, BADPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->getattr(env, path), ENOENT);
@@ -167,8 +173,8 @@ const auto FILEMODE = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH;
const auto EXECMODE = FILEMODE | S_IXUSR | S_IXGRP | S_IXOTH;
const auto LINKMODE = S_IFLNK | S_IRUSR | S_IRGRP | S_IROTH;
const time_t COMMIT_TIME = 1563621030;
-const std::string USER = "root";
-const std::string GROUP = "root";
+constexpr std::string USER = "root";
+constexpr std::string GROUP = "root";
BOOST_DATA_TEST_CASE(statDirs, DIRPATHS, path)
{
@@ -181,6 +187,7 @@ BOOST_DATA_TEST_CASE(statDirs, DIRPATHS, path)
BOOST_CHECK_EQUAL(USER, attr.uid);
BOOST_CHECK_EQUAL(GROUP, attr.gid);
}
+
BOOST_DATA_TEST_CASE(statFiles, REGPATHS, path)
{
const auto attr = v->getattr(env, path);
@@ -192,6 +199,7 @@ BOOST_DATA_TEST_CASE(statFiles, REGPATHS, path)
BOOST_CHECK_EQUAL(USER, attr.uid);
BOOST_CHECK_EQUAL(GROUP, attr.gid);
}
+
BOOST_DATA_TEST_CASE(statExecs, EXECPATHS, path)
{
const auto attr = v->getattr(env, path);
@@ -203,6 +211,7 @@ BOOST_DATA_TEST_CASE(statExecs, EXECPATHS, path)
BOOST_CHECK_EQUAL(USER, attr.uid);
BOOST_CHECK_EQUAL(GROUP, attr.gid);
}
+
BOOST_DATA_TEST_CASE(statSymlink, LINKPATHS, path)
{
const auto attr = v->getattr(env, path);
@@ -219,10 +228,12 @@ BOOST_DATA_TEST_CASE(readlinkInval, INVALIDPATHS + DIRPATHS + REGPATHS + EXECPAT
{
BOOST_CHECK_THROW_SYSTEMERROR(v->readlink(env, path), EINVAL);
}
+
BOOST_DATA_TEST_CASE(readlinkBad, BADPATHS + MISSINGPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->readlink(env, path), ENOENT);
}
+
BOOST_DATA_TEST_CASE(readlink, LINKPATHS ^ btdata::make({"executable"}), path, target)
{
BOOST_CHECK_EQUAL(target, v->readlink(env, path));
@@ -232,21 +243,25 @@ BOOST_DATA_TEST_CASE(openDirInval, INVALIDPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->opendir(env, path), EINVAL);
}
+
BOOST_DATA_TEST_CASE(openDirBad, BADPATHS + MISSINGPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->opendir(env, path), ENOENT);
}
+
BOOST_DATA_TEST_CASE(openDirNotDir, REGPATHS + LINKPATHS + EXECPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->opendir(env, path), ENOTDIR);
}
+
const auto DIRCONTENTS = btdata::make<std::vector<std::string>>({
- {".gitignore", "Jamroot.jam", "src", "unittests"},
- {"Jamfile.jam", "blob.cpp", "blob.h", "dir.cpp", "dir.h", "git.cpp", "git.h", "main.cpp", "repo.cpp", "repo.h",
- "repoList.cpp", "repoList.h"},
- {"Jamfile.jam", "core.cpp", "fixtures", "mockDefs.cpp", "mockDefs.h"},
- {"executable", "symlink"},
+ {".", "..", ".gitignore", "Jamroot.jam", "src", "unittests"},
+ {".", "..", "Jamfile.jam", "blob.cpp", "blob.h", "dir.cpp", "dir.h", "git.cpp", "git.h", "main.cpp", "repo.cpp",
+ "repo.h", "repoList.cpp", "repoList.h"},
+ {".", "..", "Jamfile.jam", "core.cpp", "fixtures", "mockDefs.cpp", "mockDefs.h"},
+ {".", "..", "executable", "symlink"},
});
+
BOOST_DATA_TEST_CASE(openDirRead, DIRPATHS ^ DIRCONTENTS, path, contents)
{
auto dir = v->opendir(env, path);
@@ -256,15 +271,19 @@ BOOST_DATA_TEST_CASE(openDirRead, DIRPATHS ^ DIRCONTENTS, path, contents)
BOOST_CHECK_EQUAL_COLLECTIONS(names.begin(), names.end(), contents.begin(), contents.end());
dir->close();
}
-const auto DIRCONTENTMODES = btdata::make<std::vector<std::tuple<std::string, int>>>({
- {{".gitignore", FILEMODE}, {"Jamroot.jam", FILEMODE}, {"src", DIRMODE}, {"unittests", DIRMODE}},
- {{"Jamfile.jam", FILEMODE}, {"blob.cpp", FILEMODE}, {"blob.h", FILEMODE}, {"dir.cpp", FILEMODE},
- {"dir.h", FILEMODE}, {"git.cpp", FILEMODE}, {"git.h", FILEMODE}, {"main.cpp", FILEMODE},
- {"repo.cpp", FILEMODE}, {"repo.h", FILEMODE}, {"repoList.cpp", FILEMODE}, {"repoList.h", FILEMODE}},
- {{"Jamfile.jam", FILEMODE}, {"core.cpp", FILEMODE}, {"fixtures", DIRMODE}, {"mockDefs.cpp", FILEMODE},
- {"mockDefs.h", FILEMODE}},
- {{"executable", EXECMODE}, {"symlink", LINKMODE}},
+
+const auto DIRCONTENTMODES = btdata::make<std::vector<std::tuple<std::string, Ice::Int>>>({
+ {{".", DIRMODE}, {"..", DIRMODE}, {".gitignore", FILEMODE}, {"Jamroot.jam", FILEMODE}, {"src", DIRMODE},
+ {"unittests", DIRMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"Jamfile.jam", FILEMODE}, {"blob.cpp", FILEMODE}, {"blob.h", FILEMODE},
+ {"dir.cpp", FILEMODE}, {"dir.h", FILEMODE}, {"git.cpp", FILEMODE}, {"git.h", FILEMODE},
+ {"main.cpp", FILEMODE}, {"repo.cpp", FILEMODE}, {"repo.h", FILEMODE}, {"repoList.cpp", FILEMODE},
+ {"repoList.h", FILEMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"Jamfile.jam", FILEMODE}, {"core.cpp", FILEMODE}, {"fixtures", DIRMODE},
+ {"mockDefs.cpp", FILEMODE}, {"mockDefs.h", FILEMODE}},
+ {{".", DIRMODE}, {"..", DIRMODE}, {"executable", EXECMODE}, {"symlink", LINKMODE}},
});
+
BOOST_DATA_TEST_CASE(openDirList, DIRPATHS ^ DIRCONTENTMODES, path, contents)
{
auto dir = v->opendir(env, path);
@@ -291,23 +310,27 @@ BOOST_DATA_TEST_CASE(openInval, INVALIDPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->open(env, path, O_RDONLY), EINVAL);
}
+
BOOST_DATA_TEST_CASE(openBad, BADPATHS + MISSINGPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->open(env, path, O_RDONLY), ENOENT);
}
+
BOOST_DATA_TEST_CASE(openNotFileDir, DIRPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->open(env, path, O_RDONLY), EISDIR);
}
+
BOOST_DATA_TEST_CASE(openNotFileLink, LINKPATHS, path)
{
BOOST_CHECK_THROW_SYSTEMERROR(v->open(env, path, O_RDONLY), ELOOP);
}
+
BOOST_DATA_TEST_CASE(openFileROFSOps, REGPATHS + EXECPATHS, path)
{
auto f = v->open(env, path, O_RDONLY);
BOOST_REQUIRE(f);
- BOOST_CHECK_THROW_SYSTEMERROR(f->ftruncate(env, {}), EROFS);
+ BOOST_CHECK_THROW_SYSTEMERROR(f->ftruncate({}), EROFS);
BOOST_CHECK_THROW_SYSTEMERROR(f->write({}, {}, {}), EROFS);
f->close();
}
@@ -316,7 +339,7 @@ BOOST_DATA_TEST_CASE(openFileGetAttr, REGPATHS + EXECPATHS, path)
{
auto f = v->open(env, path, O_RDONLY);
BOOST_REQUIRE(f);
- const auto attr = f->fgetattr(env);
+ const auto attr = f->fgetattr();
BOOST_CHECK(S_ISREG(attr.mode));
BOOST_CHECK_EQUAL(attr.size, attr.blocks);
BOOST_CHECK_EQUAL(1, attr.blockSize);
@@ -331,7 +354,7 @@ BOOST_DATA_TEST_CASE(openFileRead, REGPATHS + EXECPATHS, path)
auto f = v->open(env, path, O_RDONLY);
BOOST_REQUIRE(f);
- const auto attr = f->fgetattr(env);
+ const auto attr = f->fgetattr();
const auto readAll = f->read(0, attr.size);
BOOST_CHECK_EQUAL(attr.size, readAll.size());
diff --git a/unittests/mockDefs.cpp b/unittests/mockDefs.cpp
index a144575..7856c2d 100644
--- a/unittests/mockDefs.cpp
+++ b/unittests/mockDefs.cpp
@@ -4,7 +4,6 @@
#include <definedDirs.h>
#include <dryice.h>
#include <filesystem>
-#include <memory>
#include <service.h>
#include <string>
#include <volume.h>
@@ -24,13 +23,13 @@ GitFS::Test::Service::Service() :
GitFS::Test::Client::Client() : s(getProxy<NetFS::ServicePrx>("Service"))
{
BOOST_TEST_REQUIRE(s);
- s->ice_ping();
+ BOOST_CHECK_NO_THROW(s->ice_ping());
}
GitFS::Test::VolumeClient::VolumeClient() : v(s->connect("testrepo", "testauth"))
{
BOOST_TEST_REQUIRE(v);
- v->ice_ping();
+ BOOST_CHECK_NO_THROW(v->ice_ping());
}
GitFS::Test::VolumeClient::~VolumeClient()
diff --git a/unittests/mockDefs.h b/unittests/mockDefs.h
index 9efe187..9fa3ab7 100644
--- a/unittests/mockDefs.h
+++ b/unittests/mockDefs.h
@@ -1,6 +1,7 @@
#ifndef GITFS_TEST_MOCKDEFS_H
#define GITFS_TEST_MOCKDEFS_H
+#include <c++11Helpers.h>
#include <dryice.h>
#include <service.h>
#include <types.h>
@@ -19,10 +20,12 @@ namespace GitFS::Test {
const NetFS::ServicePrxPtr s;
};
+
class DLL_PUBLIC VolumeClient : public Client {
public:
VolumeClient();
- ~VolumeClient();
+ ~VolumeClient() override;
+ SPECIAL_MEMBERS_DELETE(VolumeClient);
const NetFS::ReqEnv env;
const NetFS::VolumePrxPtr v;
diff --git a/unittests/perf.cpp b/unittests/perf.cpp
new file mode 100644
index 0000000..4e7155c
--- /dev/null
+++ b/unittests/perf.cpp
@@ -0,0 +1,50 @@
+#include "mockDefs.h"
+#include <benchmark/benchmark.h>
+#include <volume.h>
+
+using namespace GitFS;
+using namespace GitFS::Test;
+
+const Service globalService;
+
+struct BenchmarkClient : public benchmark::Fixture {
+ NetFS::ReqEnv re {"root", "root"};
+ std::string root {"/"}, deep {"/unittests/fixtures/executable"};
+};
+
+BENCHMARK_F(BenchmarkClient, statfs_root)(benchmark::State & state)
+{
+ VolumeClient v;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(v.v->statfs(re, root));
+ }
+}
+
+BENCHMARK_F(BenchmarkClient, getattr_root)(benchmark::State & state)
+{
+ VolumeClient v;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(v.v->getattr(re, root));
+ }
+}
+
+BENCHMARK_F(BenchmarkClient, getattr_deep)(benchmark::State & state)
+{
+ VolumeClient v;
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(v.v->getattr(re, root));
+ }
+}
+
+BENCHMARK_F(BenchmarkClient, listdir_src)(benchmark::State & state)
+{
+ VolumeClient v;
+ const std::string src {"/src"};
+ auto dir = v.v->opendir(re, src);
+ for (auto _ : state) {
+ benchmark::DoNotOptimize(dir->listdir());
+ }
+ dir->close();
+}
+
+BENCHMARK_MAIN();
diff --git a/unittests/service.cpp b/unittests/service.cpp
index e2829a6..f3e7a8c 100644
--- a/unittests/service.cpp
+++ b/unittests/service.cpp
@@ -7,9 +7,9 @@
#include <definedDirs.h>
#include <dryice.h>
#include <filesystem>
-#include <memory>
#include <service.h>
#include <string>
+
namespace NetFS {
class AuthError;
class ConfigError;