diff options
Diffstat (limited to 'crypto/openssh/regress/unittests/misc/test_strdelim.c')
| -rw-r--r-- | crypto/openssh/regress/unittests/misc/test_strdelim.c | 201 | 
1 files changed, 201 insertions, 0 deletions
| diff --git a/crypto/openssh/regress/unittests/misc/test_strdelim.c b/crypto/openssh/regress/unittests/misc/test_strdelim.c new file mode 100644 index 000000000000..f7bea4bfe8f7 --- /dev/null +++ b/crypto/openssh/regress/unittests/misc/test_strdelim.c @@ -0,0 +1,201 @@ +/* 	$OpenBSD: test_strdelim.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */ +/* + * Regress test for misc strdelim() and co + * + * Placed in the public domain. + */ + +#include "includes.h" + +#include <sys/types.h> +#include <stdio.h> +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif +#include <stdlib.h> +#include <string.h> + +#include "../test_helper/test_helper.h" + +#include "log.h" +#include "misc.h" +#include "xmalloc.h" + +void test_strdelim(void); + +void +test_strdelim(void) +{ +	char *orig, *str, *cp; + +#define START_STRING(x)	orig = str = xstrdup(x) +#define DONE_STRING()	free(orig) + +	TEST_START("empty"); +	START_STRING(""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX arguable */ +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("whitespace"); +	START_STRING("	"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX better as NULL */ +	ASSERT_STRING_EQ(str, ""); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("trivial"); +	START_STRING("blob"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob"); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("trivial whitespace"); +	START_STRING("blob   "); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob"); +	ASSERT_STRING_EQ(str, ""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX better as NULL */ +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("multi"); +	START_STRING("blob1 blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	ASSERT_STRING_EQ(str, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	ASSERT_PTR_EQ(str, NULL); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("multi whitespace"); +	START_STRING("blob1	 	blob2  	 	"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	ASSERT_STRING_EQ(str, "blob2  	 	"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX better as NULL */ +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("multi equals"); +	START_STRING("blob1=blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	ASSERT_STRING_EQ(str, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	ASSERT_PTR_EQ(str, NULL); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("multi too many equals"); +	START_STRING("blob1==blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1");	/* XXX better returning NULL early */ +	ASSERT_STRING_EQ(str, "=blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, ""); +	ASSERT_STRING_EQ(str, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2");	/* XXX should (but can't) reject */ +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("multi equals strdelimw"); +	START_STRING("blob1=blob2"); +	cp = strdelimw(&str); +	ASSERT_STRING_EQ(cp, "blob1=blob2"); +	ASSERT_PTR_EQ(str, NULL); +	cp = strdelimw(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("quoted"); +	START_STRING("\"blob\""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX better as NULL */ +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("quoted multi"); +	START_STRING("\"blob1\" blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	ASSERT_STRING_EQ(str, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	ASSERT_PTR_EQ(str, NULL); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("quoted multi reverse"); +	START_STRING("blob1 \"blob2\""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	ASSERT_STRING_EQ(str, "\"blob2\""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	ASSERT_STRING_EQ(str, ""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "");	/* XXX better as NULL */ +	ASSERT_PTR_EQ(str, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("quoted multi middle"); +	START_STRING("blob1 \"blob2\" blob3"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob1"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob2"); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob3"); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("badquote"); +	START_STRING("\"blob"); +	cp = strdelim(&str); +	ASSERT_PTR_EQ(cp, NULL); +	DONE_STRING(); +	TEST_DONE(); + +	TEST_START("oops quote"); +	START_STRING("\"blob\\\""); +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, "blob\\");	/* XXX wrong */ +	cp = strdelim(&str); +	ASSERT_STRING_EQ(cp, ""); +	DONE_STRING(); +	TEST_DONE(); + +} | 
