X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftest%2Ftest-env-replace.c;h=0274e97618a71dd9d4064a7b51a1e4aa4a7cf954;hp=4b6b8847794e714b199a00650d7afa265f1371dc;hb=d7bd3de0654669e65b9642c248c5fa6d1d9a9f61;hpb=379079ba6b06e82de9a8f0025456308a34b4b115 diff --git a/src/test/test-env-replace.c b/src/test/test-env-replace.c index 4b6b88477..0274e9761 100644 --- a/src/test/test-env-replace.c +++ b/src/test/test-env-replace.c @@ -23,17 +23,92 @@ #include #include "util.h" -#include "log.h" #include "strv.h" +#include "env-util.h" -int main(int argc, char *argv[]) { +static void test_strv_env_delete(void) { + _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL, **d = NULL; + + a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL); + assert_se(a); + + b = strv_new("PIEP", "FOO", NULL); + assert_se(b); + + c = strv_new("SCHLUMPF", NULL); + assert_se(c); + + d = strv_env_delete(a, 2, b, c); + assert_se(d); + + assert_se(streq(d[0], "WALDO=WALDO")); + assert_se(streq(d[1], "WALDO=")); + assert_se(strv_length(d) == 2); +} + +static void test_strv_env_unset(void) { + _cleanup_strv_free_ char **l = NULL; + + l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); + assert_se(l); + + assert_se(strv_env_unset(l, "SCHLUMPF") == l); + + assert_se(streq(l[0], "PIEP")); + assert_se(streq(l[1], "NANANANA=YES")); + assert_se(strv_length(l) == 2); +} + +static void test_strv_env_set(void) { + _cleanup_strv_free_ char **l = NULL, **r = NULL; + + l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); + assert_se(l); + + r = strv_env_set(l, "WALDO=WALDO"); + assert_se(r); + + assert_se(streq(r[0], "PIEP")); + assert_se(streq(r[1], "SCHLUMPF=SMURFF")); + assert_se(streq(r[2], "NANANANA=YES")); + assert_se(streq(r[3], "WALDO=WALDO")); + assert_se(strv_length(r) == 4); +} + +static void test_strv_env_merge(void) { + _cleanup_strv_free_ char **a = NULL, **b = NULL, **r = NULL; + + a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL); + assert_se(a); + + b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); + assert_se(b); + + r = strv_env_merge(2, a, b); + assert_se(r); + assert_se(streq(r[0], "FOO=")); + assert_se(streq(r[1], "WALDO=")); + assert_se(streq(r[2], "PIEP")); + assert_se(streq(r[3], "SCHLUMPF=SMURFF")); + assert_se(streq(r[4], "PIEP=")); + assert_se(streq(r[5], "NANANANA=YES")); + assert_se(strv_length(r) == 6); + + assert_se(strv_env_clean(r) == r); + assert_se(streq(r[0], "FOO=")); + assert_se(streq(r[1], "WALDO=")); + assert_se(streq(r[2], "SCHLUMPF=SMURFF")); + assert_se(streq(r[3], "PIEP=")); + assert_se(streq(r[4], "NANANANA=YES")); + assert_se(strv_length(r) == 5); +} +static void test_replace_env_arg(void) { const char *env[] = { "FOO=BAR BAR", "BAR=waldo", NULL }; - const char *line[] = { "FOO$FOO", "FOO$FOOFOO", @@ -46,82 +121,98 @@ int main(int argc, char *argv[]) { "${FOO", NULL }; - - char **i, **r, *t, **a, **b; - const char nulstr[] = "fuck\0fuck2\0fuck3\0\0fuck5\0\0xxx"; - - a = strv_parse_nulstr(nulstr, sizeof(nulstr)-1); - - STRV_FOREACH(i, a) - printf("nulstr--%s\n", *i); - - strv_free(a); + _cleanup_strv_free_ char **r = NULL; r = replace_env_argv((char**) line, (char**) env); + assert_se(r); + assert_se(streq(r[0], "FOO$FOO")); + assert_se(streq(r[1], "FOO$FOOFOO")); + assert_se(streq(r[2], "FOOBAR BAR$FOO")); + assert_se(streq(r[3], "FOOBAR BAR")); + assert_se(streq(r[4], "BAR BAR")); + assert_se(streq(r[5], "BAR")); + assert_se(streq(r[6], "BAR")); + assert_se(streq(r[7], "BAR BARwaldo")); + assert_se(streq(r[8], "${FOO")); + assert_se(strv_length(r) == 9); +} - STRV_FOREACH(i, r) - printf("%s\n", *i); - - strv_free(r); - - t = normalize_env_assignment("foo=bar"); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("=bar"); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("foo="); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("="); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment(""); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("a=\"waldo\""); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("a=\"waldo"); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("a=waldo\""); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("a=\'"); - printf("%s\n", t); - free(t); - - t = normalize_env_assignment("a=\'\'"); - printf("%s\n", t); - free(t); - - a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL); - b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); +static void test_one_normalize(const char *input, const char *output) { + _cleanup_free_ char *t; - r = strv_env_merge(2, a, b); - strv_free(a); - strv_free(b); + t = normalize_env_assignment(input); + assert_se(t); + assert_se(streq(t, output)); +} - STRV_FOREACH(i, r) - printf("%s\n", *i); +static void test_normalize_env_assignment(void) { + test_one_normalize("foo=bar", "foo=bar"); + test_one_normalize("=bar", "=bar"); + test_one_normalize("foo=", "foo="); + test_one_normalize("=", "="); + test_one_normalize("", ""); + test_one_normalize("a=\"waldo\"", "a=waldo"); + test_one_normalize("a=\"waldo", "a=\"waldo"); + test_one_normalize("a=waldo\"", "a=waldo\""); + test_one_normalize("a=\'", "a='"); + test_one_normalize("a=\'\'", "a="); + test_one_normalize(" xyz ", "xyz"); + test_one_normalize(" xyz = bar ", "xyz=bar"); + test_one_normalize(" xyz = 'bar ' ", "xyz=bar "); + test_one_normalize(" ' xyz' = 'bar ' ", "' xyz'=bar "); +} - printf("CLEANED UP:\n"); +static void test_env_clean(void) { + _cleanup_strv_free_ char **e; + + e = strv_new("FOOBAR=WALDO", + "FOOBAR=WALDO", + "FOOBAR", + "F", + "X=", + "F=F", + "=", + "=F", + "", + "0000=000", + "äöüß=abcd", + "abcd=äöüß", + "xyz\n=xyz", + "xyz=xyz\n", + "another=one", + "another=final one", + NULL); + assert_se(e); + assert_se(!strv_env_is_valid(e)); + assert_se(strv_env_clean(e) == e); + assert_se(strv_env_is_valid(e)); + + assert_se(streq(e[0], "FOOBAR=WALDO")); + assert_se(streq(e[1], "X=")); + assert_se(streq(e[2], "F=F")); + assert_se(streq(e[3], "abcd=äöüß")); + assert_se(streq(e[4], "another=final one")); + assert_se(e[5] == NULL); +} - r = strv_env_clean(r); +static void test_env_name_is_valid(void) { + assert_se(env_name_is_valid("test")); - STRV_FOREACH(i, r) - printf("%s\n", *i); + assert_se(!env_name_is_valid(NULL)); + assert_se(!env_name_is_valid("")); + assert_se(!env_name_is_valid("5_starting_with_a_number_is_wrong")); + assert_se(!env_name_is_valid("#¤%&?_only_numbers_letters_and_underscore_allowed")); +} - strv_free(r); +int main(int argc, char *argv[]) { + test_strv_env_delete(); + test_strv_env_unset(); + test_strv_env_set(); + test_strv_env_merge(); + test_replace_env_arg(); + test_normalize_env_assignment(); + test_env_clean(); + test_env_name_is_valid(); return 0; }