Blame tests/config/read.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "buffer.h"
Packit Service 20376f
#include "path.h"
Packit Service 20376f
Packit Service 20376f
static git_buf buf = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
void test_config_read__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf_free(&buf;;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__simple_read(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int32_t i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config0")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg, "core.repositoryformatversion"));
Packit Service 20376f
	cl_assert(i == 0);
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "core.filemode"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "core.bare"));
Packit Service 20376f
	cl_assert(i == 0);
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "core.logallrefupdates"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__case_sensitive(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config1")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.that.other"));
Packit Service 20376f
	cl_assert_equal_s("true", git_buf_cstr(&buf));
Packit Service 20376f
	git_buf_clear(&buf;;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.That.other"));
Packit Service 20376f
	cl_assert_equal_s("yes", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "this.that.other"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "this.That.other"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
Packit Service 20376f
	/* This one doesn't exist */
Packit Service 20376f
	cl_must_fail(git_config_get_bool(&i, cfg, "this.thaT.other"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * If \ is the last non-space character on the line, we read the next
Packit Service 20376f
 * one, separating each line with SP.
Packit Service 20376f
 */
Packit Service 20376f
void test_config_read__multiline_value(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config2")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "this.That.and"));
Packit Service 20376f
	cl_assert_equal_s("one one one two two three three", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void clean_test_config(void *unused)
Packit Service 20376f
{
Packit Service 20376f
	GIT_UNUSED(unused);
Packit Service 20376f
	cl_fixture_cleanup("./testconfig");
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__multiline_value_and_eof(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[header]\n  key1 = foo\\\n");
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "header.key1"));
Packit Service 20376f
	cl_assert_equal_s("foo", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__multiline_eof(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[header]\n  key1 = \\\n");
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "header.key1"));
Packit Service 20376f
	cl_assert_equal_s("", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * This kind of subsection declaration is case-insensitive
Packit Service 20376f
 */
Packit Service 20376f
void test_config_read__subsection_header(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config3")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "section.subsection.var"));
Packit Service 20376f
	cl_assert_equal_s("hello", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	/* The subsection is transformed to lower-case */
Packit Service 20376f
	cl_must_fail(git_config_get_string_buf(&buf, cfg, "section.subSectIon.var"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__lone_variable(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config4")));
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_config_get_int32(&i, cfg, "some.section.variable"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.section.variable"));
Packit Service 20376f
	cl_assert_equal_s("", git_buf_cstr(&buf));
Packit Service 20376f
	git_buf_clear(&buf;;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "some.section.variable"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.section.variableeq"));
Packit Service 20376f
	cl_assert_equal_s("", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "some.section.variableeq"));
Packit Service 20376f
	cl_assert(i == 0);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__number_suffixes(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int64_t i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config5")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.simple"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.k"));
Packit Service 20376f
	cl_assert(i == 1 * 1024);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.kk"));
Packit Service 20376f
	cl_assert(i == 1 * 1024);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.m"));
Packit Service 20376f
	cl_assert(i == 1 * 1024 * 1024);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.mm"));
Packit Service 20376f
	cl_assert(i == 1 * 1024 * 1024);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.g"));
Packit Service 20376f
	cl_assert(i == 1 * 1024 * 1024 * 1024);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&i, cfg, "number.gg"));
Packit Service 20376f
	cl_assert(i == 1 * 1024 * 1024 * 1024);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__blank_lines(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config6")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "valid.subsection.something"));
Packit Service 20376f
	cl_assert(i == 1);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg, "something.else.something"));
Packit Service 20376f
	cl_assert(i == 0);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__invalid_ext_headers(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	cl_must_fail(git_config_open_ondisk(&cfg, cl_fixture("config/config7")));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__empty_files(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config8")));
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__symbol_headers(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config20")));
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__header_in_last_line(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config10")));
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__prefixes(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9")));
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "remote.ab.url"));
Packit Service 20376f
	cl_assert_equal_s("http://example.com/git/ab", git_buf_cstr(&buf));
Packit Service 20376f
	git_buf_clear(&buf;;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "remote.abba.url"));
Packit Service 20376f
	cl_assert_equal_s("http://example.com/git/abba", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__escaping_quotes(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config13")));
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "core.editor"));
Packit Service 20376f
	cl_assert_equal_s("\"C:/Program Files/Nonsense/bah.exe\" \"--some option\"", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__invalid_escape_sequence(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[header]\n  key1 = \\\\\\;\n  key2 = value2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int count_cfg_entries_and_compare_levels(
Packit Service 20376f
	const git_config_entry *entry, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	int *count = payload;
Packit Service 20376f
Packit Service 20376f
	if (!strcmp(entry->value, "7") || !strcmp(entry->value, "17"))
Packit Service 20376f
		cl_assert(entry->level == GIT_CONFIG_LEVEL_GLOBAL);
Packit Service 20376f
	else
Packit Service 20376f
		cl_assert(entry->level == GIT_CONFIG_LEVEL_SYSTEM);
Packit Service 20376f
Packit Service 20376f
	(*count)++;
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int cfg_callback_countdown(const git_config_entry *entry, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	int *count = payload;
Packit Service 20376f
	GIT_UNUSED(entry);
Packit Service 20376f
	(*count)--;
Packit Service 20376f
	if (*count == 0)
Packit Service 20376f
		return -100;
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__foreach(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int count, ret;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(git_config_foreach(cfg, count_cfg_entries_and_compare_levels, &count));
Packit Service 20376f
	cl_assert_equal_i(7, count);
Packit Service 20376f
Packit Service 20376f
	count = 3;
Packit Service 20376f
	cl_git_fail(ret = git_config_foreach(cfg, cfg_callback_countdown, &count));
Packit Service 20376f
	cl_assert_equal_i(-100, ret);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__iterator(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	git_config_iterator *iter;
Packit Service 20376f
	git_config_entry *entry;
Packit Service 20376f
	int count, ret;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(git_config_iterator_new(&iter, cfg));
Packit Service 20376f
Packit Service 20376f
	while ((ret = git_config_next(&entry, iter)) == 0) {
Packit Service 20376f
		count++;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_config_iterator_free(iter);
Packit Service 20376f
	cl_assert_equal_i(GIT_ITEROVER, ret);
Packit Service 20376f
	cl_assert_equal_i(7, count);
Packit Service 20376f
Packit Service 20376f
	count = 3;
Packit Service 20376f
	cl_git_pass(git_config_iterator_new(&iter, cfg));
Packit Service 20376f
Packit Service 20376f
	git_config_iterator_free(iter);
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int count_cfg_entries(const git_config_entry *entry, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	int *count = payload;
Packit Service 20376f
	GIT_UNUSED(entry);
Packit Service 20376f
	(*count)++;
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__foreach_match(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int count;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9")));
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_config_foreach_match(cfg, "core.*", count_cfg_entries, &count));
Packit Service 20376f
	cl_assert_equal_i(3, count);
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_config_foreach_match(cfg, "remote\\.ab.*", count_cfg_entries, &count));
Packit Service 20376f
	cl_assert_equal_i(2, count);
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_config_foreach_match(cfg, ".*url$", count_cfg_entries, &count));
Packit Service 20376f
	cl_assert_equal_i(2, count);
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_config_foreach_match(cfg, ".*dummy.*", count_cfg_entries, &count));
Packit Service 20376f
	cl_assert_equal_i(2, count);
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_config_foreach_match(cfg, ".*nomatch.*", count_cfg_entries, &count));
Packit Service 20376f
	cl_assert_equal_i(0, count);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void check_glob_iter(git_config *cfg, const char *regexp, int expected)
Packit Service 20376f
{
Packit Service 20376f
	git_config_iterator *iter;
Packit Service 20376f
	git_config_entry *entry;
Packit Service 20376f
	int count, error;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_iterator_glob_new(&iter, cfg, regexp));
Packit Service 20376f
Packit Service 20376f
	count = 0;
Packit Service 20376f
	while ((error = git_config_next(&entry, iter)) == 0)
Packit Service 20376f
		count++;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit Service 20376f
	cl_assert_equal_i(expected, count);
Packit Service 20376f
	git_config_iterator_free(iter);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__iterator_invalid_glob(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	git_config_iterator *iter;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9")));
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_config_iterator_glob_new(&iter, cfg, "*"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__iterator_glob(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9")));
Packit Service 20376f
Packit Service 20376f
	check_glob_iter(cfg, "core.*", 3);
Packit Service 20376f
	check_glob_iter(cfg, "remote\\.ab.*", 2);
Packit Service 20376f
	check_glob_iter(cfg, ".*url$", 2);
Packit Service 20376f
	check_glob_iter(cfg, ".*dummy.*", 2);
Packit Service 20376f
	check_glob_iter(cfg, ".*nomatch.*", 0);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__whitespace_not_required_around_assignment(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config14")));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "a.b"));
Packit Service 20376f
	cl_assert_equal_s("c", git_buf_cstr(&buf));
Packit Service 20376f
	git_buf_clear(&buf;;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "d.e"));
Packit Service 20376f
	cl_assert_equal_s("f", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__read_git_config_entry(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	git_config_entry *entry;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_entry(&entry, cfg, "core.dummy2"));
Packit Service 20376f
	cl_assert_equal_s("core.dummy2", entry->name);
Packit Service 20376f
	cl_assert_equal_s("42", entry->value);
Packit Service 20376f
	cl_assert_equal_i(GIT_CONFIG_LEVEL_SYSTEM, entry->level);
Packit Service 20376f
Packit Service 20376f
	git_config_entry_free(entry);
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * At the beginning of the test:
Packit Service 20376f
 *  - config9 has: core.dummy2=42
Packit Service 20376f
 *  - config15 has: core.dummy2=7
Packit Service 20376f
 *  - config16 has: core.dummy2=28
Packit Service 20376f
 */
Packit Service 20376f
void test_config_read__local_config_overrides_global_config_overrides_system_config(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int32_t i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config16"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_LOCAL, 0));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy2"));
Packit Service 20376f
	cl_assert_equal_i(28, i);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg, "core.dummy2"));
Packit Service 20376f
	cl_assert_equal_i(7, i);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * At the beginning of the test:
Packit Service 20376f
 *  - config9 has: core.global does not exist
Packit Service 20376f
 *  - config15 has: core.global=17
Packit Service 20376f
 *  - config16 has: core.global=29
Packit Service 20376f
 *
Packit Service 20376f
 * And also:
Packit Service 20376f
 *  - config9 has: core.system does not exist
Packit Service 20376f
 *  - config15 has: core.system does not exist
Packit Service 20376f
 *  - config16 has: core.system=11
Packit Service 20376f
 */
Packit Service 20376f
void test_config_read__fallback_from_local_to_global_and_from_global_to_system(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int32_t i;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config9"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config15"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config16"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_LOCAL, 0));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg, "core.global"));
Packit Service 20376f
	cl_assert_equal_i(17, i);
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg, "core.system"));
Packit Service 20376f
	cl_assert_equal_i(11, i);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/*
Packit Service 20376f
 * At the beginning of the test, config18 has:
Packit Service 20376f
 *	int32global = 28
Packit Service 20376f
 *	int64global = 9223372036854775803
Packit Service 20376f
 *	boolglobal = true
Packit Service 20376f
 *	stringglobal = I'm a global config value!
Packit Service 20376f
 *
Packit Service 20376f
 * And config19 has:
Packit Service 20376f
 *	int32global = -1
Packit Service 20376f
 *	int64global = -2
Packit Service 20376f
 *	boolglobal = false
Packit Service 20376f
 *	stringglobal = don't find me!
Packit Service 20376f
 *
Packit Service 20376f
 */
Packit Service 20376f
void test_config_read__simple_read_from_specific_level(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg, *cfg_specific;
Packit Service 20376f
	int i;
Packit Service 20376f
	int64_t l, expected = +9223372036854775803;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_new(&cfg));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config18"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_GLOBAL, 0));
Packit Service 20376f
	cl_git_pass(git_config_add_file_ondisk(cfg, cl_fixture("config/config19"),
Packit Service 20376f
		GIT_CONFIG_LEVEL_SYSTEM, 0));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_level(&cfg_specific, cfg, GIT_CONFIG_LEVEL_GLOBAL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_int32(&i, cfg_specific, "core.int32global"));
Packit Service 20376f
	cl_assert_equal_i(28, i);
Packit Service 20376f
	cl_git_pass(git_config_get_int64(&l, cfg_specific, "core.int64global"));
Packit Service 20376f
	cl_assert(l == expected);
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&i, cfg_specific, "core.boolglobal"));
Packit Service 20376f
	cl_assert_equal_b(true, i);
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg_specific, "core.stringglobal"));
Packit Service 20376f
	cl_assert_equal_s("I'm a global config value!", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg_specific);
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__can_load_and_parse_an_empty_config_file(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int i;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "");
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
	cl_assert_equal_i(GIT_ENOTFOUND, git_config_get_int32(&i, cfg, "nope.neither"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__corrupt_header(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[sneaky ] \"quoted closing quote mark\\\"");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__corrupt_header2(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[unclosed \"bracket\"\n    lib = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__corrupt_header3(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[unclosed \"slash\\\"]\n    lib = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__invalid_key_chars(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[foo]\n    has_underscore = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("./testconfig", "[foo]\n  has/slash = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("./testconfig", "[foo]\n  has+plus = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("./testconfig", "[no_key]\n  = git2\n");
Packit Service 20376f
	cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__lone_variable_with_trailing_whitespace(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	int b;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[foo]\n    lonevariable   \n");
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_bool(&b, cfg, "foo.lonevariable"));
Packit Service 20376f
	cl_assert_equal_b(true, b);
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__override_variable(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&clean_test_config, NULL);
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[some] var = one\nvar = two");
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_string_buf(&buf, cfg, "some.var"));
Packit Service 20376f
	cl_assert_equal_s("two", git_buf_cstr(&buf));
Packit Service 20376f
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_config_read__path(void)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
	git_buf path = GIT_BUF_INIT;
Packit Service 20376f
	git_buf old_path = GIT_BUF_INIT;
Packit Service 20376f
	git_buf home_path = GIT_BUF_INIT;
Packit Service 20376f
	git_buf expected_path = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(p_mkdir("fakehome", 0777));
Packit Service 20376f
	cl_git_pass(git_path_prettify(&home_path, "fakehome", NULL));
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_GET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, &old_path));
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, home_path.ptr));
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[some]\n path = ~/somefile");
Packit Service 20376f
	cl_git_pass(git_path_join_unrooted(&expected_path, "somefile", home_path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
Packit Service 20376f
	cl_git_pass(git_config_get_path(&path, cfg, "some.path"));
Packit Service 20376f
	cl_assert_equal_s(expected_path.ptr, path.ptr);
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[some]\n path = ~/");
Packit Service 20376f
	cl_git_pass(git_path_join_unrooted(&expected_path, "", home_path.ptr, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_path(&path, cfg, "some.path"));
Packit Service 20376f
	cl_assert_equal_s(expected_path.ptr, path.ptr);
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[some]\n path = ~");
Packit Service 20376f
	cl_git_pass(git_buf_sets(&expected_path, home_path.ptr));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_config_get_path(&path, cfg, "some.path"));
Packit Service 20376f
	cl_assert_equal_s(expected_path.ptr, path.ptr);
Packit Service 20376f
	git_buf_free(&path);
Packit Service 20376f
Packit Service 20376f
	cl_git_mkfile("./testconfig", "[some]\n path = ~user/foo");
Packit Service 20376f
	cl_git_fail(git_config_get_path(&path, cfg, "some.path"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL, old_path.ptr));
Packit Service 20376f
	git_buf_free(&old_path);
Packit Service 20376f
	git_buf_free(&home_path);
Packit Service 20376f
	git_buf_free(&expected_path);
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}