summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2019-07-19 08:45:45 +0200
committerPatrick Steinhardt <ps@pks.im>2019-07-19 11:02:45 +0200
commitee1934807bc65862abf92d4ab78f0c9f5b612632 (patch)
tree8e525941488e737b618fa06748b9ab1a8b6262c9 /tests
parente86d75f3b2ce6d359520d035b8b21c70545c8cf0 (diff)
downloadlibgit2-ee1934807bc65862abf92d4ab78f0c9f5b612632.tar.gz
tests: repo: move template tests into their own suite
There's quite a lot of supporting code for our templates and they are an obvious standalone feature. Thus, let's extract those tests into their own suite to also make refactoring of them easier.
Diffstat (limited to 'tests')
-rw-r--r--tests/repo/init.c269
-rw-r--r--tests/repo/template.c294
2 files changed, 296 insertions, 267 deletions
diff --git a/tests/repo/init.c b/tests/repo/init.c
index f2155b4cd..9879ef1f7 100644
--- a/tests/repo/init.c
+++ b/tests/repo/init.c
@@ -13,20 +13,13 @@ enum repo_mode {
static git_repository *_repo = NULL;
static git_buf _global_path = GIT_BUF_INIT;
-static mode_t g_umask = 0;
void test_repo_init__initialize(void)
{
_repo = NULL;
- /* load umask if not already loaded */
- if (!g_umask) {
- g_umask = p_umask(022);
- (void)p_umask(g_umask);
- }
-
- git_libgit2_opts(GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL,
- &_global_path);
+ git_libgit2_opts(GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL,
+ &_global_path);
}
void test_repo_init__cleanup(void)
@@ -380,17 +373,6 @@ void test_repo_init__sets_logAllRefUpdates_according_to_type_of_repository(void)
assert_config_entry_on_init_bytype("core.logallrefupdates", true, false);
}
-void test_repo_init__empty_template_path(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- opts.template_path = "";
-
- cl_git_pass(git_futils_mkdir("foo", 0755, 0));
- cl_git_pass(git_repository_init_ext(&_repo, "foo", &opts));
-
- cleanup_repository("foo");
-}
-
void test_repo_init__extended_0(void)
{
git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
@@ -524,253 +506,6 @@ void test_repo_init__relative_gitdir_2(void)
cleanup_repository("root");
}
-#define CLEAR_FOR_CORE_FILEMODE(M) ((M) &= ~0177)
-
-static void assert_hooks_match(
- const char *template_dir,
- const char *repo_dir,
- const char *hook_path,
- bool core_filemode)
-{
- git_buf expected = GIT_BUF_INIT;
- git_buf actual = GIT_BUF_INIT;
- struct stat expected_st, st;
-
- cl_git_pass(git_buf_joinpath(&expected, template_dir, hook_path));
- cl_git_pass(git_path_lstat(expected.ptr, &expected_st));
-
- cl_git_pass(git_buf_joinpath(&actual, repo_dir, hook_path));
- cl_git_pass(git_path_lstat(actual.ptr, &st));
-
- cl_assert(expected_st.st_size == st.st_size);
-
- if (GIT_MODE_TYPE(expected_st.st_mode) != GIT_FILEMODE_LINK) {
- mode_t expected_mode =
- GIT_MODE_TYPE(expected_st.st_mode) |
- (GIT_PERMS_FOR_WRITE(expected_st.st_mode) & ~g_umask);
-
- if (!core_filemode) {
- CLEAR_FOR_CORE_FILEMODE(expected_mode);
- CLEAR_FOR_CORE_FILEMODE(st.st_mode);
- }
-
- cl_assert_equal_i_fmt(expected_mode, st.st_mode, "%07o");
- }
-
- git_buf_dispose(&expected);
- git_buf_dispose(&actual);
-}
-
-static void assert_mode_seems_okay(
- const char *base, const char *path,
- git_filemode_t expect_mode, bool expect_setgid, bool core_filemode)
-{
- git_buf full = GIT_BUF_INIT;
- struct stat st;
-
- cl_git_pass(git_buf_joinpath(&full, base, path));
- cl_git_pass(git_path_lstat(full.ptr, &st));
- git_buf_dispose(&full);
-
- if (!core_filemode) {
- CLEAR_FOR_CORE_FILEMODE(expect_mode);
- CLEAR_FOR_CORE_FILEMODE(st.st_mode);
- expect_setgid = false;
- }
-
- if (S_ISGID != 0)
- cl_assert_equal_b(expect_setgid, (st.st_mode & S_ISGID) != 0);
-
- cl_assert_equal_b(
- GIT_PERMS_IS_EXEC(expect_mode), GIT_PERMS_IS_EXEC(st.st_mode));
-
- cl_assert_equal_i_fmt(
- GIT_MODE_TYPE(expect_mode), GIT_MODE_TYPE(st.st_mode), "%07o");
-}
-
-static const char *template_sandbox(const char *name)
-{
- git_buf hooks_path = GIT_BUF_INIT, link_path = GIT_BUF_INIT,
- dotfile_path = GIT_BUF_INIT;
- const char *path = cl_fixture(name);
-
- cl_fixture_sandbox(name);
-
- /* create a symlink from link.sample to update.sample if the filesystem
- * supports it.
- */
-
- cl_git_pass(git_buf_joinpath(&hooks_path, name, "hooks"));
- cl_git_pass(git_buf_joinpath(&link_path, hooks_path.ptr, "link.sample"));
-
-#ifdef GIT_WIN32
- cl_git_mkfile(link_path.ptr, "#!/bin/sh\necho hello, world\n");
-#else
- cl_must_pass(symlink("update.sample", link_path.ptr));
-#endif
-
- /* create a file starting with a dot */
- cl_git_pass(git_buf_joinpath(&dotfile_path, hooks_path.ptr, ".dotfile"));
- cl_git_mkfile(dotfile_path.ptr, "something\n");
- git_buf_dispose(&dotfile_path);
-
- git_buf_dispose(&dotfile_path);
- git_buf_dispose(&link_path);
- git_buf_dispose(&hooks_path);
-
- return path;
-}
-
-static void configure_templatedir(const char *template_path)
-{
- create_tmp_global_config("tmp_global_path", "init.templatedir", template_path);
-}
-
-static void validate_templates(git_repository *repo, const char *template_path)
-{
- git_buf template_description = GIT_BUF_INIT;
- git_buf repo_description = GIT_BUF_INIT;
- git_buf expected = GIT_BUF_INIT;
- git_buf actual = GIT_BUF_INIT;
- int filemode;
-
- cl_git_pass(git_buf_joinpath(&template_description, template_path,
- "description"));
- cl_git_pass(git_buf_joinpath(&repo_description, git_repository_path(repo),
- "description"));
-
- cl_git_pass(git_futils_readbuffer(&expected, template_description.ptr));
- cl_git_pass(git_futils_readbuffer(&actual, repo_description.ptr));
-
- cl_assert_equal_s(expected.ptr, actual.ptr);
-
- filemode = cl_repo_get_bool(repo, "core.filemode");
-
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/update.sample", filemode);
-
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/link.sample", filemode);
-
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/.dotfile", filemode);
-
- git_buf_dispose(&expected);
- git_buf_dispose(&actual);
- git_buf_dispose(&repo_description);
- git_buf_dispose(&template_description);
-}
-
-void test_repo_init__external_templates_specified_in_options(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- cl_set_cleanup(&cleanup_repository, "templated.git");
- template_sandbox("template");
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.template_path = "template";
-
- cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
-
- cl_assert(git_repository_is_bare(_repo));
-
- cl_assert(!git__suffixcmp(git_repository_path(_repo), "/templated.git/"));
-
- validate_templates(_repo, "template");
- cl_fixture_cleanup("template");
-}
-
-void test_repo_init__external_templates_specified_in_config(void)
-{
- git_buf template_path = GIT_BUF_INIT;
-
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- cl_set_cleanup(&cleanup_repository, "templated.git");
- template_sandbox("template");
-
- cl_git_pass(git_buf_joinpath(&template_path, clar_sandbox_path(),
- "template"));
-
- configure_templatedir(template_path.ptr);
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
-
- cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
-
- validate_templates(_repo, "template");
- cl_fixture_cleanup("template");
-
- git_buf_dispose(&template_path);
-}
-
-void test_repo_init__external_templates_with_leading_dot(void)
-{
- git_buf template_path = GIT_BUF_INIT;
-
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- cl_set_cleanup(&cleanup_repository, "templated.git");
- template_sandbox("template");
-
- cl_must_pass(p_rename("template", ".template_with_leading_dot"));
-
- cl_git_pass(git_buf_joinpath(&template_path, clar_sandbox_path(),
- ".template_with_leading_dot"));
-
- configure_templatedir(template_path.ptr);
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
-
- cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
-
- validate_templates(_repo, ".template_with_leading_dot");
- cl_fixture_cleanup(".template_with_leading_dot");
-
- git_buf_dispose(&template_path);
-}
-
-void test_repo_init__extended_with_template_and_shared_mode(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- int filemode = true;
- const char *repo_path = NULL;
-
- cl_set_cleanup(&cleanup_repository, "init_shared_from_tpl");
- template_sandbox("template");
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.template_path = "template";
- opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP;
-
- cl_git_pass(git_repository_init_ext(&_repo, "init_shared_from_tpl", &opts));
-
- cl_assert(!git_repository_is_bare(_repo));
- cl_assert(!git__suffixcmp(git_repository_path(_repo), "/init_shared_from_tpl/.git/"));
-
- filemode = cl_repo_get_bool(_repo, "core.filemode");
-
- repo_path = git_repository_path(_repo);
- assert_mode_seems_okay(repo_path, "hooks",
- GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
- assert_mode_seems_okay(repo_path, "info",
- GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
- assert_mode_seems_okay(repo_path, "description",
- GIT_FILEMODE_BLOB, false, filemode);
-
- validate_templates(_repo, "template");
-
- cl_fixture_cleanup("template");
-}
-
void test_repo_init__can_reinit_an_initialized_repository(void)
{
git_repository *reinit;
diff --git a/tests/repo/template.c b/tests/repo/template.c
new file mode 100644
index 000000000..9b8904330
--- /dev/null
+++ b/tests/repo/template.c
@@ -0,0 +1,294 @@
+#include "clar_libgit2.h"
+
+#include "fileops.h"
+#include "repo/repo_helpers.h"
+
+#define CLEAR_FOR_CORE_FILEMODE(M) ((M) &= ~0177)
+
+static git_repository *_repo = NULL;
+static mode_t g_umask = 0;
+static git_buf _global_path = GIT_BUF_INIT;
+
+void test_repo_template__initialize(void)
+{
+ _repo = NULL;
+
+ /* load umask if not already loaded */
+ if (!g_umask) {
+ g_umask = p_umask(022);
+ (void)p_umask(g_umask);
+ }
+}
+
+void test_repo_template__cleanup(void)
+{
+ git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL,
+ _global_path.ptr);
+ git_buf_dispose(&_global_path);
+
+ cl_fixture_cleanup("tmp_global_path");
+}
+
+static void cleanup_repository(void *path)
+{
+ git_repository_free(_repo);
+ _repo = NULL;
+
+ cl_fixture_cleanup((const char *)path);
+}
+
+static void assert_hooks_match(
+ const char *template_dir,
+ const char *repo_dir,
+ const char *hook_path,
+ bool core_filemode)
+{
+ git_buf expected = GIT_BUF_INIT;
+ git_buf actual = GIT_BUF_INIT;
+ struct stat expected_st, st;
+
+ cl_git_pass(git_buf_joinpath(&expected, template_dir, hook_path));
+ cl_git_pass(git_path_lstat(expected.ptr, &expected_st));
+
+ cl_git_pass(git_buf_joinpath(&actual, repo_dir, hook_path));
+ cl_git_pass(git_path_lstat(actual.ptr, &st));
+
+ cl_assert(expected_st.st_size == st.st_size);
+
+ if (GIT_MODE_TYPE(expected_st.st_mode) != GIT_FILEMODE_LINK) {
+ mode_t expected_mode =
+ GIT_MODE_TYPE(expected_st.st_mode) |
+ (GIT_PERMS_FOR_WRITE(expected_st.st_mode) & ~g_umask);
+
+ if (!core_filemode) {
+ CLEAR_FOR_CORE_FILEMODE(expected_mode);
+ CLEAR_FOR_CORE_FILEMODE(st.st_mode);
+ }
+
+ cl_assert_equal_i_fmt(expected_mode, st.st_mode, "%07o");
+ }
+
+ git_buf_dispose(&expected);
+ git_buf_dispose(&actual);
+}
+
+static void assert_mode_seems_okay(
+ const char *base, const char *path,
+ git_filemode_t expect_mode, bool expect_setgid, bool core_filemode)
+{
+ git_buf full = GIT_BUF_INIT;
+ struct stat st;
+
+ cl_git_pass(git_buf_joinpath(&full, base, path));
+ cl_git_pass(git_path_lstat(full.ptr, &st));
+ git_buf_dispose(&full);
+
+ if (!core_filemode) {
+ CLEAR_FOR_CORE_FILEMODE(expect_mode);
+ CLEAR_FOR_CORE_FILEMODE(st.st_mode);
+ expect_setgid = false;
+ }
+
+ if (S_ISGID != 0)
+ cl_assert_equal_b(expect_setgid, (st.st_mode & S_ISGID) != 0);
+
+ cl_assert_equal_b(
+ GIT_PERMS_IS_EXEC(expect_mode), GIT_PERMS_IS_EXEC(st.st_mode));
+
+ cl_assert_equal_i_fmt(
+ GIT_MODE_TYPE(expect_mode), GIT_MODE_TYPE(st.st_mode), "%07o");
+}
+
+static const char *template_sandbox(const char *name)
+{
+ git_buf hooks_path = GIT_BUF_INIT, link_path = GIT_BUF_INIT,
+ dotfile_path = GIT_BUF_INIT;
+ const char *path = cl_fixture(name);
+
+ cl_fixture_sandbox(name);
+
+ /* create a symlink from link.sample to update.sample if the filesystem
+ * supports it.
+ */
+
+ cl_git_pass(git_buf_joinpath(&hooks_path, name, "hooks"));
+ cl_git_pass(git_buf_joinpath(&link_path, hooks_path.ptr, "link.sample"));
+
+#ifdef GIT_WIN32
+ cl_git_mkfile(link_path.ptr, "#!/bin/sh\necho hello, world\n");
+#else
+ cl_must_pass(symlink("update.sample", link_path.ptr));
+#endif
+
+ /* create a file starting with a dot */
+ cl_git_pass(git_buf_joinpath(&dotfile_path, hooks_path.ptr, ".dotfile"));
+ cl_git_mkfile(dotfile_path.ptr, "something\n");
+ git_buf_dispose(&dotfile_path);
+
+ git_buf_dispose(&dotfile_path);
+ git_buf_dispose(&link_path);
+ git_buf_dispose(&hooks_path);
+
+ return path;
+}
+
+static void configure_templatedir(const char *template_path)
+{
+ create_tmp_global_config("tmp_global_path", "init.templatedir", template_path);
+}
+
+static void validate_templates(git_repository *repo, const char *template_path)
+{
+ git_buf template_description = GIT_BUF_INIT;
+ git_buf repo_description = GIT_BUF_INIT;
+ git_buf expected = GIT_BUF_INIT;
+ git_buf actual = GIT_BUF_INIT;
+ int filemode;
+
+ cl_git_pass(git_buf_joinpath(&template_description, template_path,
+ "description"));
+ cl_git_pass(git_buf_joinpath(&repo_description, git_repository_path(repo),
+ "description"));
+
+ cl_git_pass(git_futils_readbuffer(&expected, template_description.ptr));
+ cl_git_pass(git_futils_readbuffer(&actual, repo_description.ptr));
+
+ cl_assert_equal_s(expected.ptr, actual.ptr);
+
+ filemode = cl_repo_get_bool(repo, "core.filemode");
+
+ assert_hooks_match(
+ template_path, git_repository_path(repo),
+ "hooks/update.sample", filemode);
+
+ assert_hooks_match(
+ template_path, git_repository_path(repo),
+ "hooks/link.sample", filemode);
+
+ assert_hooks_match(
+ template_path, git_repository_path(repo),
+ "hooks/.dotfile", filemode);
+
+ git_buf_dispose(&expected);
+ git_buf_dispose(&actual);
+ git_buf_dispose(&repo_description);
+ git_buf_dispose(&template_description);
+}
+
+void test_repo_template__external_templates_specified_in_options(void)
+{
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
+
+ cl_set_cleanup(&cleanup_repository, "templated.git");
+ template_sandbox("template");
+
+ opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
+ GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
+ opts.template_path = "template";
+
+ cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
+
+ cl_assert(git_repository_is_bare(_repo));
+
+ cl_assert(!git__suffixcmp(git_repository_path(_repo), "/templated.git/"));
+
+ validate_templates(_repo, "template");
+ cl_fixture_cleanup("template");
+}
+
+void test_repo_template__external_templates_specified_in_config(void)
+{
+ git_buf template_path = GIT_BUF_INIT;
+
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
+
+ cl_set_cleanup(&cleanup_repository, "templated.git");
+ template_sandbox("template");
+
+ cl_git_pass(git_buf_joinpath(&template_path, clar_sandbox_path(),
+ "template"));
+
+ configure_templatedir(template_path.ptr);
+
+ opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
+ GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
+
+ cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
+
+ validate_templates(_repo, "template");
+ cl_fixture_cleanup("template");
+
+ git_buf_dispose(&template_path);
+}
+
+void test_repo_template__external_templates_with_leading_dot(void)
+{
+ git_buf template_path = GIT_BUF_INIT;
+
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
+
+ cl_set_cleanup(&cleanup_repository, "templated.git");
+ template_sandbox("template");
+
+ cl_must_pass(p_rename("template", ".template_with_leading_dot"));
+
+ cl_git_pass(git_buf_joinpath(&template_path, clar_sandbox_path(),
+ ".template_with_leading_dot"));
+
+ configure_templatedir(template_path.ptr);
+
+ opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
+ GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
+
+ cl_git_pass(git_repository_init_ext(&_repo, "templated.git", &opts));
+
+ validate_templates(_repo, ".template_with_leading_dot");
+ cl_fixture_cleanup(".template_with_leading_dot");
+
+ git_buf_dispose(&template_path);
+}
+
+void test_repo_template__extended_with_template_and_shared_mode(void)
+{
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
+ int filemode = true;
+ const char *repo_path = NULL;
+
+ cl_set_cleanup(&cleanup_repository, "init_shared_from_tpl");
+ template_sandbox("template");
+
+ opts.flags = GIT_REPOSITORY_INIT_MKPATH |
+ GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
+ opts.template_path = "template";
+ opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP;
+
+ cl_git_pass(git_repository_init_ext(&_repo, "init_shared_from_tpl", &opts));
+
+ cl_assert(!git_repository_is_bare(_repo));
+ cl_assert(!git__suffixcmp(git_repository_path(_repo), "/init_shared_from_tpl/.git/"));
+
+ filemode = cl_repo_get_bool(_repo, "core.filemode");
+
+ repo_path = git_repository_path(_repo);
+ assert_mode_seems_okay(repo_path, "hooks",
+ GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
+ assert_mode_seems_okay(repo_path, "info",
+ GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
+ assert_mode_seems_okay(repo_path, "description",
+ GIT_FILEMODE_BLOB, false, filemode);
+
+ validate_templates(_repo, "template");
+
+ cl_fixture_cleanup("template");
+}
+
+void test_repo_template__empty_template_path(void)
+{
+ git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
+ opts.template_path = "";
+
+ cl_git_pass(git_futils_mkdir("foo", 0755, 0));
+ cl_git_pass(git_repository_init_ext(&_repo, "foo", &opts));
+
+ cleanup_repository("foo");
+}