xref: /openbsd-src/regress/usr.bin/ssh/unittests/misc/test_argv.c (revision 3db7c0f63c899a7470bd6ee63aa74a089acc7bac)
1*3db7c0f6Sdjm /* 	$OpenBSD: test_argv.c,v 1.1 2021/03/19 04:23:50 djm Exp $ */
2*3db7c0f6Sdjm /*
3*3db7c0f6Sdjm  * Regress test for misc argv handling functions.
4*3db7c0f6Sdjm  *
5*3db7c0f6Sdjm  * Placed in the public domain.
6*3db7c0f6Sdjm  */
7*3db7c0f6Sdjm 
8*3db7c0f6Sdjm #include <sys/types.h>
9*3db7c0f6Sdjm #include <sys/param.h>
10*3db7c0f6Sdjm #include <stdio.h>
11*3db7c0f6Sdjm #include <stdint.h>
12*3db7c0f6Sdjm #include <stdlib.h>
13*3db7c0f6Sdjm #include <string.h>
14*3db7c0f6Sdjm 
15*3db7c0f6Sdjm #include "test_helper.h"
16*3db7c0f6Sdjm 
17*3db7c0f6Sdjm #include "log.h"
18*3db7c0f6Sdjm #include "misc.h"
19*3db7c0f6Sdjm 
20*3db7c0f6Sdjm void test_argv(void);
21*3db7c0f6Sdjm 
22*3db7c0f6Sdjm static void
23*3db7c0f6Sdjm free_argv(char **av, int ac)
24*3db7c0f6Sdjm {
25*3db7c0f6Sdjm 	int i;
26*3db7c0f6Sdjm 
27*3db7c0f6Sdjm 	for (i = 0; i < ac; i++)
28*3db7c0f6Sdjm 		free(av[i]);
29*3db7c0f6Sdjm 	free(av);
30*3db7c0f6Sdjm }
31*3db7c0f6Sdjm 
32*3db7c0f6Sdjm void
33*3db7c0f6Sdjm test_argv(void)
34*3db7c0f6Sdjm {
35*3db7c0f6Sdjm 	char **av = NULL;
36*3db7c0f6Sdjm 	int ac = 0;
37*3db7c0f6Sdjm 
38*3db7c0f6Sdjm #define RESET_ARGV() \
39*3db7c0f6Sdjm 	do { \
40*3db7c0f6Sdjm 		free_argv(av, ac); \
41*3db7c0f6Sdjm 		av = NULL; \
42*3db7c0f6Sdjm 		ac = -1; \
43*3db7c0f6Sdjm 	} while (0)
44*3db7c0f6Sdjm 
45*3db7c0f6Sdjm 	TEST_START("empty args");
46*3db7c0f6Sdjm 	RESET_ARGV();
47*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("", &ac, &av), 0);
48*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 0);
49*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
50*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[0], NULL);
51*3db7c0f6Sdjm 	RESET_ARGV();
52*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("    ", &ac, &av), 0);
53*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 0);
54*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
55*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[0], NULL);
56*3db7c0f6Sdjm 	TEST_DONE();
57*3db7c0f6Sdjm 
58*3db7c0f6Sdjm 	TEST_START("trivial args");
59*3db7c0f6Sdjm 	RESET_ARGV();
60*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("leamas", &ac, &av), 0);
61*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
62*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
63*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "leamas");
64*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
65*3db7c0f6Sdjm 	RESET_ARGV();
66*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av), 0);
67*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 2);
68*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
69*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "smiley");
70*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[1], "leamas");
71*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[2], NULL);
72*3db7c0f6Sdjm 	TEST_DONE();
73*3db7c0f6Sdjm 
74*3db7c0f6Sdjm 	TEST_START("quoted");
75*3db7c0f6Sdjm 	RESET_ARGV();
76*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av), 0);
77*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
78*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
79*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "smiley");
80*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
81*3db7c0f6Sdjm 	RESET_ARGV();
82*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av), 0);
83*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 2);
84*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
85*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "leamas");
86*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[1], " smiley ");
87*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[2], NULL);
88*3db7c0f6Sdjm 	RESET_ARGV();
89*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av), 0);
90*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
91*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
92*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "smiley leamas");
93*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
94*3db7c0f6Sdjm 	RESET_ARGV();
95*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av), 0);
96*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 2);
97*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
98*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "smiley leamas");
99*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[1], "liz");
100*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[2], NULL);
101*3db7c0f6Sdjm 	TEST_DONE();
102*3db7c0f6Sdjm 
103*3db7c0f6Sdjm 	TEST_START("escaped");
104*3db7c0f6Sdjm 	RESET_ARGV();
105*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av), 0);
106*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
107*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
108*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "\"smiley'");
109*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
110*3db7c0f6Sdjm 	RESET_ARGV();
111*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av), 0);
112*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
113*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
114*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "'smiley\"");
115*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
116*3db7c0f6Sdjm 	RESET_ARGV();
117*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av), 0);
118*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 2);
119*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
120*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "smiley's");
121*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[1], "leamas'");
122*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[2], NULL);
123*3db7c0f6Sdjm 	RESET_ARGV();
124*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av), 0);
125*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 1);
126*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
127*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "leamas\\smiley");
128*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[1], NULL);
129*3db7c0f6Sdjm 	RESET_ARGV();
130*3db7c0f6Sdjm 	ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av), 0);
131*3db7c0f6Sdjm 	ASSERT_INT_EQ(ac, 2);
132*3db7c0f6Sdjm 	ASSERT_PTR_NE(av, NULL);
133*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[0], "leamas\\");
134*3db7c0f6Sdjm 	ASSERT_STRING_EQ(av[1], "\\smiley");
135*3db7c0f6Sdjm 	ASSERT_PTR_EQ(av[2], NULL);
136*3db7c0f6Sdjm 	TEST_DONE();
137*3db7c0f6Sdjm 
138*3db7c0f6Sdjm 	/* XXX test char *argv_assemble(int argc, char **argv) */
139*3db7c0f6Sdjm }
140