xref: /openbsd-src/regress/usr.bin/ssh/unittests/misc/test_expand.c (revision a8c975d25b8973125837f3cd4c63b4a611f5c5f5)
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