1*a8c975d2Sderaadt /* $OpenBSD: test_expand.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */
208adf9a7Sdjm /*
308adf9a7Sdjm * Regress test for misc string expansion functions.
408adf9a7Sdjm *
508adf9a7Sdjm * Placed in the public domain.
608adf9a7Sdjm */
708adf9a7Sdjm
808adf9a7Sdjm #include <sys/types.h>
908adf9a7Sdjm #include <stdio.h>
1008adf9a7Sdjm #include <stdint.h>
1108adf9a7Sdjm #include <stdlib.h>
1208adf9a7Sdjm #include <string.h>
1308adf9a7Sdjm
1408adf9a7Sdjm #include "test_helper.h"
1508adf9a7Sdjm
1608adf9a7Sdjm #include "log.h"
1708adf9a7Sdjm #include "misc.h"
1808adf9a7Sdjm
1908adf9a7Sdjm void test_expand(void);
2008adf9a7Sdjm
2108adf9a7Sdjm void
test_expand(void)2208adf9a7Sdjm test_expand(void)
2308adf9a7Sdjm {
2408adf9a7Sdjm int parseerr;
2508adf9a7Sdjm char *ret;
2608adf9a7Sdjm
2708adf9a7Sdjm TEST_START("dollar_expand");
2808adf9a7Sdjm ASSERT_INT_EQ(setenv("FOO", "bar", 1), 0);
2908adf9a7Sdjm ASSERT_INT_EQ(setenv("BAR", "baz", 1), 0);
302e8a885fSdtucker (void)unsetenv("BAZ");
3108adf9a7Sdjm #define ASSERT_DOLLAR_EQ(x, y) do { \
3208adf9a7Sdjm char *str = dollar_expand(NULL, (x)); \
3308adf9a7Sdjm ASSERT_STRING_EQ(str, (y)); \
3408adf9a7Sdjm free(str); \
3508adf9a7Sdjm } while(0)
3608adf9a7Sdjm ASSERT_DOLLAR_EQ("${FOO}", "bar");
3708adf9a7Sdjm ASSERT_DOLLAR_EQ(" ${FOO}", " bar");
3808adf9a7Sdjm ASSERT_DOLLAR_EQ("${FOO} ", "bar ");
3908adf9a7Sdjm ASSERT_DOLLAR_EQ(" ${FOO} ", " bar ");
4008adf9a7Sdjm ASSERT_DOLLAR_EQ("${FOO}${BAR}", "barbaz");
4108adf9a7Sdjm ASSERT_DOLLAR_EQ(" ${FOO} ${BAR}", " bar baz");
4208adf9a7Sdjm ASSERT_DOLLAR_EQ("${FOO}${BAR} ", "barbaz ");
4308adf9a7Sdjm ASSERT_DOLLAR_EQ(" ${FOO} ${BAR} ", " bar baz ");
4408adf9a7Sdjm ASSERT_DOLLAR_EQ("$", "$");
4508adf9a7Sdjm ASSERT_DOLLAR_EQ(" $", " $");
4608adf9a7Sdjm ASSERT_DOLLAR_EQ("$ ", "$ ");
4708adf9a7Sdjm
4808adf9a7Sdjm /* suppress error messages for error handing tests */
4908adf9a7Sdjm log_init("test_misc", SYSLOG_LEVEL_QUIET, SYSLOG_FACILITY_AUTH, 1);
5008adf9a7Sdjm /* error checking, non existent variable */
5108adf9a7Sdjm ret = dollar_expand(&parseerr, "a${BAZ}");
5208adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 0);
5308adf9a7Sdjm ret = dollar_expand(&parseerr, "${BAZ}b");
5408adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 0);
5508adf9a7Sdjm ret = dollar_expand(&parseerr, "a${BAZ}b");
5608adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 0);
5708adf9a7Sdjm /* invalid format */
5808adf9a7Sdjm ret = dollar_expand(&parseerr, "${");
5908adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 1);
6008adf9a7Sdjm ret = dollar_expand(&parseerr, "${F");
6108adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 1);
6208adf9a7Sdjm ret = dollar_expand(&parseerr, "${FO");
6308adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 1);
6408adf9a7Sdjm /* empty variable name */
6508adf9a7Sdjm ret = dollar_expand(&parseerr, "${}");
6608adf9a7Sdjm ASSERT_PTR_EQ(ret, NULL); ASSERT_INT_EQ(parseerr, 1);
6708adf9a7Sdjm /* restore loglevel to default */
6808adf9a7Sdjm log_init("test_misc", SYSLOG_LEVEL_INFO, SYSLOG_FACILITY_AUTH, 1);
6908adf9a7Sdjm TEST_DONE();
7008adf9a7Sdjm
7108adf9a7Sdjm TEST_START("percent_expand");
7208adf9a7Sdjm ASSERT_STRING_EQ(percent_expand("%%", "%h", "foo", NULL), "%");
7308adf9a7Sdjm ASSERT_STRING_EQ(percent_expand("%h", "h", "foo", NULL), "foo");
7408adf9a7Sdjm ASSERT_STRING_EQ(percent_expand("%h ", "h", "foo", NULL), "foo ");
7508adf9a7Sdjm ASSERT_STRING_EQ(percent_expand(" %h", "h", "foo", NULL), " foo");
7608adf9a7Sdjm ASSERT_STRING_EQ(percent_expand(" %h ", "h", "foo", NULL), " foo ");
7708adf9a7Sdjm ASSERT_STRING_EQ(percent_expand(" %a%b ", "a", "foo", "b", "bar", NULL),
7808adf9a7Sdjm " foobar ");
7908adf9a7Sdjm TEST_DONE();
8008adf9a7Sdjm
8108adf9a7Sdjm TEST_START("percent_dollar_expand");
8208adf9a7Sdjm ASSERT_STRING_EQ(percent_dollar_expand("%h${FOO}", "h", "foo", NULL),
8308adf9a7Sdjm "foobar");
8408adf9a7Sdjm TEST_DONE();
8508adf9a7Sdjm }
86