Expose the `config_set` C API as a set of simple commands in order to facilitate testing. Add tests for the `config_set` API as well as for `git_config_get_*()` family for the usual config files. Signed-off-by: Tanay Abhra <tanayabh@xxxxxxxxx> --- .gitignore | 1 + Makefile | 1 + t/t1308-config-hash.sh | 163 +++++++++++++++++++++++++++++++++++++++++++++++++ test-config.c | 129 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 294 insertions(+) create mode 100755 t/t1308-config-hash.sh create mode 100644 test-config.c diff --git a/.gitignore b/.gitignore index 42294e5..eeb66e2 100644 --- a/.gitignore +++ b/.gitignore @@ -176,6 +176,7 @@ /gitweb/static/gitweb.js /gitweb/static/gitweb.min.* /test-chmtime +/test-config /test-ctype /test-date /test-delta diff --git a/Makefile b/Makefile index d503f78..e875070 100644 --- a/Makefile +++ b/Makefile @@ -548,6 +548,7 @@ X = PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS)) TEST_PROGRAMS_NEED_X += test-chmtime +TEST_PROGRAMS_NEED_X += test-config TEST_PROGRAMS_NEED_X += test-ctype TEST_PROGRAMS_NEED_X += test-date TEST_PROGRAMS_NEED_X += test-delta diff --git a/t/t1308-config-hash.sh b/t/t1308-config-hash.sh new file mode 100755 index 0000000..6c059c5 --- /dev/null +++ b/t/t1308-config-hash.sh @@ -0,0 +1,163 @@ +#!/bin/sh + +test_description='Test git config-hash API in different settings' + +. ./test-lib.sh + +test_expect_success 'clear default config' ' + rm -f .git/config +' + +cat > .git/config << EOF +[core] + penguin = very blue + Movie = BadPhysics + UPPERCASE = true + MixedCase = true + my = + foo + baz = sam +[Cores] + WhatEver = Second +[my "Foo bAr"] + hi = hello +[core] + baz = bat + baz = hask +[lamb] + chop = 65 + head = none +[goat] + legs = 4 + head = true + skin = false + nose = 1 + horns +EOF + +test_expect_success 'get value for a simple key' ' + echo "very blue" >expect && + test-config get_value core.penguin >actual && + test_cmp expect actual +' + +test_expect_success 'get value for a key with value as an empty string' ' + echo "" >expect && + test-config get_value core.my >actual && + test_cmp expect actual +' + +test_expect_success 'get value for a key with value as NULL' ' + echo "(NULL)" >expect && + test-config get_value core.foo >actual && + test_cmp expect actual +' +test_expect_success 'upper case key' ' + echo "true" >expect && + test-config get_value core.UPPERCASE >actual && + test_cmp expect actual +' +test_expect_success 'mixed case key' ' + echo "true" >expect && + test-config get_value core.MixedCase >actual && + test_cmp expect actual +' +test_expect_success 'key and value with mixed case' ' + echo "BadPhysics" >expect && + test-config get_value core.Movie >actual && + test_cmp expect actual +' + +test_expect_success 'key with case sensitive subsection' ' + echo "hello" >expect && + test-config get_value "my.Foo bAr.hi">actual && + test_cmp expect actual +' + +test_expect_success 'find value with misspelled key' ' + echo "Value not found for \"my.fOo Bar.hi\"" >expect && + test_must_fail test-config get_value "my.fOo Bar.hi">actual && + test_cmp expect actual +' + +test_expect_success 'find value with the highest priority' ' + echo hask >expect && + test-config get_value "core.baz">actual && + test_cmp expect actual +' + +test_expect_success 'find integer value for a key' ' + echo 65 >expect && + test-config get_int lamb.chop >actual && + test_cmp expect actual +' + +test_expect_success 'find integer if value is non parse-able' ' + echo 65 >expect && + test_must_fail test-config get_int lamb.head >actual && + test_must_fail test_cmp expect actual +' + +cat > expect << EOF +1 +0 +1 +1 +1 +EOF + +test_expect_success 'find bool value for the entered key' ' + test-config get_bool goat.head >>actual && + test-config get_bool goat.skin >>actual && + test-config get_bool goat.nose >>actual && + test-config get_bool goat.horns >>actual && + test-config get_bool goat.legs >>actual && + test_cmp expect actual +' + +cat > expect << EOF +sam +bat +hask +EOF + +test_expect_success 'find multiple values' ' + test-config get_value_multi "core.baz">actual && + test_cmp expect actual +' + +cat > config2 << EOF +[core] + baz = lama +[my] + new = silk +[core] + baz = ball +EOF + +test_expect_success 'find value from a configset' ' + echo silk > expect && + test-config configset_get_value 2 config2 .git/config my.new >actual && + test_cmp expect actual +' + +test_expect_success 'find value with highest priority from a configset' ' + echo hask > expect && + test-config configset_get_value 2 config2 .git/config core.baz >actual && + test_cmp expect actual +' + +cat > except << EOF +sam +bat +hask +lama +ball +EOF + +test_expect_success 'find value_list for a key from a configset' ' + test-config configset_get_value 2 config2 .git/config core.baz >actual && + test_cmp expect actual +' + +test_done diff --git a/test-config.c b/test-config.c new file mode 100644 index 0000000..32c912a --- /dev/null +++ b/test-config.c @@ -0,0 +1,129 @@ +#include "cache.h" +#include "hashmap.h" +#include "string-list.h" + +/* + * This program exposes the C API of the `config_set` mechanism + * as a set of simple commands in order to facilitate testing. + * + * Reads stdin and prints result of command to stdout: + * + * get_value -> prints the value with highest priority for the entered key + * + * get_value_multi -> prints all values for the entered key in increasing order + * of priority + * + * get_int -> print integer value for the entered key or die + * + * get_bool -> print bool value for the entered key or die + * + * configset_get_value -> first makes a config-set of files entered as arguments + * and then returns value with the highest priority for the + * entered key. + * + * configset_get_value_multi -> first makes a config-set of files entered as + * arguments and then returns value_list for the entered + * key sorted in ascending order of priority. + * + * Examples: + * + * To print the value with highest priority for key "foo.bAr Baz.rock": + * test-config get_value "foo.bAr Baz.rock" + * + */ + + +int main(int argc, char **argv) +{ + int i, no_of_files; + int ret = 0; + const char *v; + int val; + const struct string_list *strptr; + struct config_set cs = CONFIG_SET_INIT; + if (argc == 3 && !strcmp(argv[1], "get_value")) { + if (!git_config_get_value(argv[2], &v)) { + if (!v) + printf("(NULL)\n"); + else + printf("%s\n", v); + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + } else if (argc == 3 && !strcmp(argv[1], "get_value_multi")) { + strptr = git_config_get_value_multi(argv[2]); + if (strptr) { + for (i = 0; i < strptr->nr; i++) { + v = strptr->items[i].string; + if (!v) + printf("(NULL)\n"); + else + printf("%s\n", v); + } + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + } else if (argc == 3 && !strcmp(argv[1], "get_int")) { + if (!git_config_get_int(argv[2], &val)) { + printf("%d\n", val); + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + } else if (argc == 3 && !strcmp(argv[1], "get_bool")) { + if (!git_config_get_bool(argv[2], &val)) { + printf("%d\n", val); + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + } else if (!strcmp(argv[1], "configset_get_value")) { + no_of_files = git_config_int("unused", argv[2]); + for (i = 1; i <= no_of_files; i++) { + ret = git_configset_add_file(&cs, argv[i + 2]); + if (ret) + return -1; + } + if (!git_configset_get_value(&cs, argv[3 + no_of_files], &v)) { + if (!v) + printf("(NULL)\n"); + else + printf("%s\n", v); + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + + } else if (!strcmp(argv[1], "configset_get_value_multi")) { + no_of_files = git_config_int("unused", argv[2]); + for (i = 1; i <= no_of_files; i++) { + ret = git_configset_add_file(&cs, argv[i + 2]); + if (ret) + return -1; + } + strptr = git_configset_get_value_multi(&cs, argv[3 + no_of_files]); + if (strptr) { + for (i = 0; i < strptr->nr; i++) { + v = strptr->items[i].string; + if (!v) + printf("(NULL)\n"); + else + printf("%s\n", v); + } + return 0; + } else { + printf("Value not found for \"%s\"\n", argv[2]); + return -1; + } + } + + fprintf(stderr, "%s: Please check the syntax and the function name\n", argv[0]); + return 1; +} -- 1.9.0.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html