4715f1ca7e812877771e013585f24acc9f3f73fa
[mono.git] / eglib / test / shell.c
1 #include <glib.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include "test.h"
5
6 RESULT
7 test_shell_argv1 ()
8 {
9         GError *error;
10         gint argc;
11         gchar **argv;
12         gboolean ret;
13
14         /* The next line prints a critical error and returns FALSE 
15         ret = g_shell_parse_argv (NULL, NULL, NULL, NULL);
16         */
17         ret = g_shell_parse_argv ("", NULL, NULL, NULL);
18         if (ret)
19                 return FAILED ("1. It should return FALSE");
20
21         ret = g_shell_parse_argv ("hola", NULL, NULL, NULL);
22         if (!ret)
23                 return FAILED ("2. It should return TRUE");
24
25         argc = 0;
26         ret = g_shell_parse_argv ("hola", &argc, NULL, NULL);
27         if (!ret)
28                 return FAILED ("3. It should return TRUE");
29         if (argc != 1)
30                 return FAILED ("4. argc was %d", argc);
31
32         argc = 0;
33         ret = g_shell_parse_argv ("hola bola", &argc, NULL, NULL);
34         if (!ret)
35                 return FAILED ("5. It should return TRUE");
36         if (argc != 2)
37                 return FAILED ("6. argc was %d", argc);
38
39         argc = 0;
40         ret = g_shell_parse_argv ("hola bola", &argc, &argv, NULL);
41         if (!ret)
42                 return FAILED ("7. It should return TRUE");
43         if (argc != 2)
44                 return FAILED ("8. argc was %d", argc);
45         if (strcmp (argv [0], "hola"))
46                 return FAILED ("9. argv[0] was %s", argv [0]);
47         if (strcmp (argv [1], "bola"))
48                 return FAILED ("10. argv[1] was %s", argv [1]);
49
50         g_strfreev (argv);
51         argv = NULL;
52         argc = 0;
53         error = NULL;
54         ret = g_shell_parse_argv ("hola      'bola'", &argc, &argv, &error);
55         if (!ret)
56                 return FAILED ("11. It should return TRUE");
57         if (argc != 2)
58                 return FAILED ("12. argc was %d expected 2", argc);
59         if (strcmp (argv [0], "hola"))
60                 return FAILED ("13. argv[0] was %s", argv [0]);
61         if (strcmp (argv [1], "bola"))
62                 return FAILED ("14. argv[1] was %s", argv [1]);
63         if (error != NULL)
64                 return FAILED ("15. error is not null");
65
66
67         g_strfreev (argv);
68         argv = NULL;
69         argc = 0;
70         error = NULL;
71         ret = g_shell_parse_argv ("hola    ''  'bola'", &argc, &argv, &error);
72         if (!ret)
73                 return FAILED ("16. It should return TRUE");
74         if (argc != 3)
75                 return FAILED ("17. argc was %d expected 3", argc);
76         if (strcmp (argv [0], "hola"))
77                 return FAILED ("18. argv[0] was %s", argv [0]);
78         if (strcmp (argv [1], ""))
79                 return FAILED ("19. argv[2] was %s", argv [1]);
80         if (strcmp (argv [2], "bola"))
81                 return FAILED ("19. argv[2] was %s", argv [2]);
82         if (error != NULL)
83                 return FAILED ("20. error is not null");
84
85         g_strfreev (argv);
86         argv = NULL;
87         argc = 0;
88         error = NULL;
89         ret = g_shell_parse_argv ("hola'' bola", &argc, &argv, &error);
90         if (!ret)
91                 return FAILED ("21. It should return TRUE");
92         if (argc != 2)
93                 return FAILED ("22. argc was %d expected 2", argc);
94         if (strcmp (argv [0], "hola"))
95                 return FAILED ("23. argv[0] was %s", argv [0]);
96         if (strcmp (argv [1], "bola"))
97                 return FAILED ("24. argv[2] was %s", argv [1]);
98         if (error != NULL)
99                 return FAILED ("25. error is not null");
100         
101         return OK;
102 }
103
104 RESULT
105 test_shell_argv2 ()
106 {
107         GError *error;
108         gint argc;
109         gchar **argv;
110         gboolean ret;
111
112         argv = NULL;
113         argc = 0;
114         error = NULL;
115         ret = g_shell_parse_argv ("hola      \"bola\"", &argc, &argv, &error);
116         if (!ret)
117                 return FAILED ("1. It should return TRUE");
118         if (argc != 2)
119                 return FAILED ("2. argc was %d expected 2", argc);
120         if (strcmp (argv [0], "hola"))
121                 return FAILED ("3. argv[0] was %s", argv [0]);
122         if (strcmp (argv [1], "bola"))
123                 return FAILED ("4. argv[1] was %s", argv [1]);
124         if (error != NULL)
125                 return FAILED ("5. error is not null");
126
127         g_strfreev (argv);
128         argv = NULL;
129         argc = 0;
130         error = NULL;
131         ret = g_shell_parse_argv ("hola    \"\"  \"bola \"", &argc, &argv, &error);
132         if (!ret)
133                 return FAILED ("6. It should return TRUE");
134         if (argc != 3)
135                 return FAILED ("7. argc was %d expected 3", argc);
136         if (strcmp (argv [0], "hola"))
137                 return FAILED ("8. argv[0] was %s", argv [0]);
138         if (strcmp (argv [1], ""))
139                 return FAILED ("9. argv[2] was %s", argv [1]);
140         if (strcmp (argv [2], "bola "))
141                 return FAILED ("10. argv[2] was %s", argv [2]);
142         if (error != NULL)
143                 return FAILED ("11. error is not null");
144
145         g_strfreev (argv);
146         argv = NULL;
147         argc = 0;
148         error = NULL;
149         ret = g_shell_parse_argv ("hola\n\t    \"\t\"  \"bola \"", &argc, &argv, &error);
150         if (!ret)
151                 return FAILED ("10. It should return TRUE");
152         if (argc != 3)
153                 return FAILED ("11. argc was %d expected 3", argc);
154         if (strcmp (argv [0], "hola"))
155                 return FAILED ("12. argv[0] was %s", argv [0]);
156         if (strcmp (argv [1], "\t"))
157                 return FAILED ("13. argv[2] was %s", argv [1]);
158         if (strcmp (argv [2], "bola "))
159                 return FAILED ("14. argv[2] was %s", argv [2]);
160         if (error != NULL)
161                 return FAILED ("15. error is not null");
162
163         g_strfreev (argv);
164         argv = NULL;
165         argc = 0;
166         error = NULL;
167         ret = g_shell_parse_argv ("hola\n\t  \\\n  \"\t\"  \"bola \"", &argc, &argv, &error);
168         if (!ret)
169                 return FAILED ("16. It should return TRUE");
170         if (argc != 3)
171                 return FAILED ("17. argc was %d expected 3", argc);
172         if (strcmp (argv [0], "hola"))
173                 return FAILED ("18. argv[0] was %s", argv [0]);
174         if (strcmp (argv [1], "\t"))
175                 return FAILED ("19. argv[2] was %s", argv [1]);
176         if (strcmp (argv [2], "bola "))
177                 return FAILED ("20. argv[2] was %s", argv [2]);
178         if (error != NULL)
179                 return FAILED ("21. error is not null");
180
181         g_strfreev (argv);
182         return OK;
183 }
184
185 RESULT
186 test_shell_argv3 ()
187 {
188         GError *error;
189         gint argc;
190         gchar **argv;
191         gboolean ret;
192
193         argv = NULL;
194         argc = 0;
195         error = NULL;
196         ret = g_shell_parse_argv ("hola      \"bola", &argc, &argv, &error);
197         if (ret)
198                 return FAILED ("1. It should return FALSE");
199         if (argc != 0)
200                 return FAILED ("2. argc was %d expected 0", argc);
201         if (argv != NULL)
202                 return FAILED ("3. argv[0] was %s", argv [0]);
203         if (error == NULL)
204                 return FAILED ("4. error is null");
205
206         /* Text ended before matching quote was found for ". (The text was 'hola      "bola') */
207         g_error_free (error);
208         error = NULL;
209         ret = g_shell_parse_argv ("hola      \\\"bola", &argc, &argv, &error);
210         if (!ret)
211                 return FAILED ("5. It should return TRUE");
212         if (argc != 2)
213                 return FAILED ("6. argc was %d expected 2", argc);
214         if (strcmp (argv [0], "hola"))
215                 return FAILED ("18. argv[0] was %s", argv [0]);
216         if (strcmp (argv [1], "\"bola"))
217                 return FAILED ("18. argv[1] was %s", argv [1]);
218         if (error != NULL)
219                 return FAILED ("8. error is not null");
220
221         g_strfreev (argv);
222         argv = NULL;
223         argc = 0;
224         ret = g_shell_parse_argv ("hola      \"\n\\'bola\"", &argc, &argv, &error);
225         if (!ret)
226                 return FAILED ("9. It should return TRUE. %s", error->message);
227         if (argc != 2)
228                 return FAILED ("10. argc was %d expected 2", argc);
229         if (strcmp (argv [0], "hola"))
230                 return FAILED ("11. argv[0] was %s", argv [0]);
231         if (strcmp (argv [1], "\n\\'bola"))
232                 return FAILED ("12. argv[1] was %s", argv [1]);
233         if (error != NULL)
234                 return FAILED ("13. error is not null");
235
236         g_strfreev (argv);
237         argv = NULL;
238         argc = 0;
239         return OK;
240 }
241
242 // This was the 2.8 showstopper error
243 RESULT
244 test_shell_argv4 ()
245 {
246         GError *error;
247         gint argc;
248         gchar **argv;
249         gboolean ret;
250         char *str = "'/usr/bin/gnome-terminal' -e \"bash -c 'read -p \\\"Press any key to continue...\\\" -n1;'\"";
251
252         argv = NULL;
253         argc = 0;
254         error = NULL;
255         ret = g_shell_parse_argv (str, &argc, &argv, &error);
256         if (!ret)
257                 return FAILED ("1. It should return TRUE");
258         if (argc != 3)
259                 return FAILED ("2. argc was %d expected 3", argc);
260         if (argv == NULL)
261                 return FAILED ("3. argv[0] was NULL");
262         if (error != NULL)
263                 return FAILED ("4. error was set");
264
265         if (strcmp (argv [0], "/usr/bin/gnome-terminal"))
266                 return FAILED ("5. Expected /usr/bin/gnome-terminal got %s", argv [0]);
267         if (strcmp (argv [1], "-e"))
268                 return FAILED ("6. Expected -e, got: %s", argv [1]);
269         if (strcmp (argv [2], "bash -c 'read -p \"Press any key to continue...\" -n1;'"))
270                 return FAILED ("7. Got unexpected result: %s\n", argv [2]);
271         
272         return OK;
273 }
274
275 // This is https://bugzilla.novell.com/show_bug.cgi?id=655896
276 RESULT
277 test_shell_argv5 ()
278 {
279         GError *error;
280         gint argc;
281         gchar **argv;
282         gboolean ret;
283         char *str = "echo \"foo\",\"bar\"";
284
285         argv = NULL;
286         argc = 0;
287         error = NULL;
288         ret = g_shell_parse_argv (str, &argc, &argv, &error);
289         if (!ret)
290                 return FAILED ("1. It should return TRUE");
291         if (argc != 2)
292                 return FAILED ("2. argc was %d expected 2", argc);
293         if (argv == NULL)
294                 return FAILED ("3. argv[0] was NULL");
295         if (error != NULL)
296                 return FAILED ("4. error was set");
297
298         if (strcmp (argv [0], "echo"))
299                 return FAILED ("5. Expected echo got %s", argv [0]);
300         if (strcmp (argv [1], "foo,bar"))
301                 return FAILED ("6. Expected foo,bar, got: %s", argv [1]);
302         
303         return OK;
304 }
305
306 RESULT
307 test_quote ()
308 {
309         if (strcmp (g_shell_quote ("foo"), "'foo'"))
310                 return FAILED ("Should return 'foo'");
311
312         if (strcmp (g_shell_quote ("foo'bar"), "'foo'\\''bar'"))
313                 return FAILED ("Should return 'foo'\\''bar'");
314
315         if (strcmp (g_shell_quote ("foo bar"), "'foo bar'"))
316                 return FAILED ("Should return 'foo bar'");
317         return OK;
318 }
319
320 static Test shell_tests [] = {
321         {"test_shell_argv1", test_shell_argv1},
322         {"test_shell_argv2", test_shell_argv2},
323         {"test_shell_argv3", test_shell_argv3},
324         {"test_shell_argv4", test_shell_argv4},
325         {"test_shell_argv5", test_shell_argv5},
326         {"g_shell_quote", test_quote},
327         {NULL, NULL}
328 };
329
330 DEFINE_TEST_GROUP_INIT(shell_tests_init, shell_tests)
331