1*a8c975d2Sderaadt /* $OpenBSD: test_argv.c,v 1.4 2021/12/14 21:25:27 deraadt Exp $ */
23db7c0f6Sdjm /*
33db7c0f6Sdjm * Regress test for misc argv handling functions.
43db7c0f6Sdjm *
53db7c0f6Sdjm * Placed in the public domain.
63db7c0f6Sdjm */
73db7c0f6Sdjm
83db7c0f6Sdjm #include <sys/types.h>
93db7c0f6Sdjm #include <stdio.h>
103db7c0f6Sdjm #include <stdint.h>
113db7c0f6Sdjm #include <stdlib.h>
123db7c0f6Sdjm #include <string.h>
133db7c0f6Sdjm
143db7c0f6Sdjm #include "test_helper.h"
153db7c0f6Sdjm
163db7c0f6Sdjm #include "log.h"
173db7c0f6Sdjm #include "misc.h"
183db7c0f6Sdjm
193db7c0f6Sdjm void test_argv(void);
203db7c0f6Sdjm
213db7c0f6Sdjm void
test_argv(void)223db7c0f6Sdjm test_argv(void)
233db7c0f6Sdjm {
243db7c0f6Sdjm char **av = NULL;
253db7c0f6Sdjm int ac = 0;
263db7c0f6Sdjm
273db7c0f6Sdjm #define RESET_ARGV() \
283db7c0f6Sdjm do { \
2928618202Sdjm argv_free(av, ac); \
303db7c0f6Sdjm av = NULL; \
313db7c0f6Sdjm ac = -1; \
323db7c0f6Sdjm } while (0)
333db7c0f6Sdjm
343db7c0f6Sdjm TEST_START("empty args");
3528618202Sdjm ASSERT_INT_EQ(argv_split("", &ac, &av, 0), 0);
363db7c0f6Sdjm ASSERT_INT_EQ(ac, 0);
373db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
383db7c0f6Sdjm ASSERT_PTR_EQ(av[0], NULL);
393db7c0f6Sdjm RESET_ARGV();
4028618202Sdjm ASSERT_INT_EQ(argv_split(" ", &ac, &av, 0), 0);
413db7c0f6Sdjm ASSERT_INT_EQ(ac, 0);
423db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
433db7c0f6Sdjm ASSERT_PTR_EQ(av[0], NULL);
443ee6b33aSdjm RESET_ARGV();
453db7c0f6Sdjm TEST_DONE();
463db7c0f6Sdjm
473db7c0f6Sdjm TEST_START("trivial args");
4828618202Sdjm ASSERT_INT_EQ(argv_split("leamas", &ac, &av, 0), 0);
493db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
503db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
513db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas");
523db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
533db7c0f6Sdjm RESET_ARGV();
5428618202Sdjm ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av, 0), 0);
553db7c0f6Sdjm ASSERT_INT_EQ(ac, 2);
563db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
573db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley");
583db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "leamas");
593db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL);
603ee6b33aSdjm RESET_ARGV();
613db7c0f6Sdjm TEST_DONE();
623db7c0f6Sdjm
633db7c0f6Sdjm TEST_START("quoted");
6428618202Sdjm ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av, 0), 0);
653db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
663db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
673db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley");
683db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
693db7c0f6Sdjm RESET_ARGV();
7028618202Sdjm ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av, 0), 0);
713db7c0f6Sdjm ASSERT_INT_EQ(ac, 2);
723db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
733db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas");
743db7c0f6Sdjm ASSERT_STRING_EQ(av[1], " smiley ");
753db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL);
763db7c0f6Sdjm RESET_ARGV();
7728618202Sdjm ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av, 0), 0);
783db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
793db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
803db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley leamas");
813db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
823db7c0f6Sdjm RESET_ARGV();
8328618202Sdjm ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av, 0), 0);
843db7c0f6Sdjm ASSERT_INT_EQ(ac, 2);
853db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
863db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley leamas");
873db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "liz");
883db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL);
893ee6b33aSdjm RESET_ARGV();
903db7c0f6Sdjm TEST_DONE();
913db7c0f6Sdjm
923db7c0f6Sdjm TEST_START("escaped");
9328618202Sdjm ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av, 0), 0);
943db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
953db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
963db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "\"smiley'");
973db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
983db7c0f6Sdjm RESET_ARGV();
9928618202Sdjm ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av, 0), 0);
1003db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
1013db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
1023db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "'smiley\"");
1033db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
1043db7c0f6Sdjm RESET_ARGV();
10528618202Sdjm ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av, 0), 0);
1063db7c0f6Sdjm ASSERT_INT_EQ(ac, 2);
1073db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
1083db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley's");
1093db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "leamas'");
1103db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL);
1113db7c0f6Sdjm RESET_ARGV();
11228618202Sdjm ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av, 0), 0);
1133db7c0f6Sdjm ASSERT_INT_EQ(ac, 1);
1143db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
1153db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas\\smiley");
1163db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL);
1173db7c0f6Sdjm RESET_ARGV();
11828618202Sdjm ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av, 0), 0);
1193db7c0f6Sdjm ASSERT_INT_EQ(ac, 2);
1203db7c0f6Sdjm ASSERT_PTR_NE(av, NULL);
1213db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas\\");
1223db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "\\smiley");
1233db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL);
1243ee6b33aSdjm RESET_ARGV();
12528618202Sdjm ASSERT_INT_EQ(argv_split("smiley\\ leamas", &ac, &av, 0), 0);
12628618202Sdjm ASSERT_INT_EQ(ac, 1);
12728618202Sdjm ASSERT_PTR_NE(av, NULL);
12828618202Sdjm ASSERT_STRING_EQ(av[0], "smiley leamas");
12928618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
13028618202Sdjm RESET_ARGV();
13128618202Sdjm TEST_DONE();
13228618202Sdjm
13328618202Sdjm TEST_START("quoted escaped");
13428618202Sdjm ASSERT_INT_EQ(argv_split("'smiley\\ leamas'", &ac, &av, 0), 0);
13528618202Sdjm ASSERT_INT_EQ(ac, 1);
13628618202Sdjm ASSERT_PTR_NE(av, NULL);
13728618202Sdjm ASSERT_STRING_EQ(av[0], "smiley\\ leamas");
13828618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
13928618202Sdjm RESET_ARGV();
14028618202Sdjm ASSERT_INT_EQ(argv_split("\"smiley\\ leamas\"", &ac, &av, 0), 0);
14128618202Sdjm ASSERT_INT_EQ(ac, 1);
14228618202Sdjm ASSERT_PTR_NE(av, NULL);
14328618202Sdjm ASSERT_STRING_EQ(av[0], "smiley\\ leamas");
14428618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
14528618202Sdjm RESET_ARGV();
14628618202Sdjm TEST_DONE();
14728618202Sdjm
14828618202Sdjm TEST_START("comments");
14928618202Sdjm ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 0), 0);
15028618202Sdjm ASSERT_INT_EQ(ac, 2);
15128618202Sdjm ASSERT_PTR_NE(av, NULL);
15228618202Sdjm ASSERT_STRING_EQ(av[0], "#");
15328618202Sdjm ASSERT_STRING_EQ(av[1], "gold");
15428618202Sdjm ASSERT_PTR_EQ(av[2], NULL);
15528618202Sdjm RESET_ARGV();
15628618202Sdjm ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 1), 0);
15728618202Sdjm ASSERT_INT_EQ(ac, 0);
15828618202Sdjm ASSERT_PTR_NE(av, NULL);
15928618202Sdjm ASSERT_PTR_EQ(av[0], NULL);
16028618202Sdjm RESET_ARGV();
16128618202Sdjm ASSERT_INT_EQ(argv_split("leamas#gold", &ac, &av, 1), 0);
16228618202Sdjm ASSERT_INT_EQ(ac, 1);
16328618202Sdjm ASSERT_PTR_NE(av, NULL);
16428618202Sdjm ASSERT_STRING_EQ(av[0], "leamas#gold");
16528618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
16628618202Sdjm RESET_ARGV();
16728618202Sdjm ASSERT_INT_EQ(argv_split("\"leamas # gold\"", &ac, &av, 1), 0);
16828618202Sdjm ASSERT_INT_EQ(ac, 1);
16928618202Sdjm ASSERT_PTR_NE(av, NULL);
17028618202Sdjm ASSERT_STRING_EQ(av[0], "leamas # gold");
17128618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
17228618202Sdjm RESET_ARGV();
17328618202Sdjm ASSERT_INT_EQ(argv_split("\"leamas\"#gold", &ac, &av, 1), 0);
17428618202Sdjm ASSERT_INT_EQ(ac, 1);
17528618202Sdjm ASSERT_PTR_NE(av, NULL);
17628618202Sdjm ASSERT_STRING_EQ(av[0], "leamas#gold");
17728618202Sdjm ASSERT_PTR_EQ(av[1], NULL);
17828618202Sdjm RESET_ARGV();
1793db7c0f6Sdjm TEST_DONE();
1803db7c0f6Sdjm
1813db7c0f6Sdjm /* XXX test char *argv_assemble(int argc, char **argv) */
1823db7c0f6Sdjm }
183