summaryrefslogtreecommitdiff
path: root/unittests/config.cpp
blob: f6a914e87f1bbcc7afdf00607f4d32b350a19930 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#define BOOST_TEST_MODULE GitFS_Config
#include <boost/test/data/test_case.hpp> // IWYU pragma: keep
#include <boost/test/unit_test.hpp>

#include "mockDefs.h"
#include <compileTimeFormatter.h>
#include <definedDirs.h>
#include <dryice.h>
#include <filesystem>
#include <map>
#include <memory>
#include <service.h>
#include <string>
#include <volume.h>
namespace NetFS {
	class ConfigError;
}

using namespace GitFS;
using namespace GitFS::Test;
using namespace AdHoc::literals;

namespace btdata = boost::unit_test::data;

class IdsIce : public IceTray::DryIce {
public:
	IdsIce(const char * uid, const char * gid) :
		IceTray::DryIce({
				"--GitFS.testrepo.gitdir=%?"_fmt(rootDir.string()),
				"--GitFS.testrepo.authkey=%?"_fmt("testauth"),
				"--GitFS.testrepo.gid=%?"_fmt(gid),
				"--GitFS.testrepo.uid=%?"_fmt(uid),
				"--GitFS.testrepo.commitish=7a0ccb40084c3ab31d9856e7f689c0514c28c930",
		})
	{
	}
};

const auto USERS = btdata::make({"root", "gituser", "www"});
const auto GROUPS = btdata::make({"root", "gitgroup", "www"});
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"});

BOOST_DATA_TEST_CASE(uid_gid_override_getattr, USERS * GROUPS *(DIRS + FILES + LINKS), uid, gid, path)
{
	IdsIce s(uid, gid);
	VolumeClient c;
	BOOST_CHECK_NO_THROW(c.s->ice_ping());

	auto attr = c.v->getattr(c.env, path);
	BOOST_CHECK_EQUAL(attr.uid, uid);
	BOOST_CHECK_EQUAL(attr.gid, gid);
}

BOOST_DATA_TEST_CASE(uid_gid_override_fgetattr, USERS * GROUPS * FILES, uid, gid, path)
{
	IdsIce s(uid, gid);
	VolumeClient c;
	BOOST_CHECK_NO_THROW(c.s->ice_ping());

	auto file = c.v->open(c.env, path, {});
	auto attr = file->fgetattr();
	BOOST_CHECK_EQUAL(attr.uid, uid);
	BOOST_CHECK_EQUAL(attr.gid, gid);
	file->close();
}

BOOST_DATA_TEST_CASE(uid_gid_override_list, USERS * GROUPS * DIRS, uid, gid, path)
{
	IdsIce s(uid, gid);
	VolumeClient c;
	BOOST_CHECK_NO_THROW(c.s->ice_ping());

	auto dir = c.v->opendir(c.env, path);
	for (const auto & dirent : dir->listdir()) {
		BOOST_TEST_CONTEXT(dirent.first) {
			BOOST_CHECK_EQUAL(dirent.second.uid, uid);
			BOOST_CHECK_EQUAL(dirent.second.gid, gid);
		}
	}
	dir->close();
}

BOOST_DATA_TEST_CASE(commitishs, COMMITISHS *(FILES + DIRS), commitish, path)
{
	IceTray::DryIce di({
			"--GitFS.testrepo.gitdir=%?"_fmt(rootDir.string()),
			"--GitFS.testrepo.authkey=%?"_fmt("testauth"),
			"--GitFS.testrepo.commitish=%?"_fmt(commitish),
	});
	VolumeClient c;
	BOOST_CHECK_NO_THROW(c.v->ice_ping());
	BOOST_CHECK_NO_THROW(c.v->getattr(c.env, path));
}

BOOST_DATA_TEST_CASE(bad_commitishs, FILES, commitish) // File paths aren't commitishs
{
	IceTray::DryIce di({
			"--GitFS.testrepo.gitdir=%?"_fmt(rootDir.string()),
			"--GitFS.testrepo.authkey=%?"_fmt("testauth"),
			"--GitFS.testrepo.commitish=%?"_fmt(commitish),
	});
	Client c;
	BOOST_CHECK_THROW(c.s->connect("testrepo", "testauth"), NetFS::ConfigError);
}