test argv_split() optional termination on comments
authordjm <djm@openbsd.org>
Tue, 8 Jun 2021 07:40:12 +0000 (07:40 +0000)
committerdjm <djm@openbsd.org>
Tue, 8 Jun 2021 07:40:12 +0000 (07:40 +0000)
regress/usr.bin/ssh/unittests/misc/test_argv.c

index 81c3ee7..061369d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_argv.c,v 1.2 2021/05/21 04:03:47 djm Exp $ */
+/*     $OpenBSD: test_argv.c,v 1.3 2021/06/08 07:40:12 djm Exp $ */
 /*
  * Regress test for misc argv handling functions.
  *
 
 void test_argv(void);
 
-static void
-free_argv(char **av, int ac)
-{
-       int i;
-
-       for (i = 0; i < ac; i++)
-               free(av[i]);
-       free(av);
-}
-
 void
 test_argv(void)
 {
@@ -37,19 +27,18 @@ test_argv(void)
 
 #define RESET_ARGV() \
        do { \
-               free_argv(av, ac); \
+               argv_free(av, ac); \
                av = NULL; \
                ac = -1; \
        } while (0)
 
        TEST_START("empty args");
-       RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 0);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_PTR_EQ(av[0], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("    ", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("    ", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 0);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_PTR_EQ(av[0], NULL);
@@ -57,14 +46,13 @@ test_argv(void)
        TEST_DONE();
 
        TEST_START("trivial args");
-       RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("leamas", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("leamas", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "leamas");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 2);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "smiley");
@@ -74,27 +62,26 @@ test_argv(void)
        TEST_DONE();
 
        TEST_START("quoted");
-       RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "smiley");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 2);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "leamas");
        ASSERT_STRING_EQ(av[1], " smiley ");
        ASSERT_PTR_EQ(av[2], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "smiley leamas");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 2);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "smiley leamas");
@@ -104,39 +91,92 @@ test_argv(void)
        TEST_DONE();
 
        TEST_START("escaped");
-       RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "\"smiley'");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "'smiley\"");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 2);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "smiley's");
        ASSERT_STRING_EQ(av[1], "leamas'");
        ASSERT_PTR_EQ(av[2], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 1);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "leamas\\smiley");
        ASSERT_PTR_EQ(av[1], NULL);
        RESET_ARGV();
-       ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av), 0);
+       ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av, 0), 0);
        ASSERT_INT_EQ(ac, 2);
        ASSERT_PTR_NE(av, NULL);
        ASSERT_STRING_EQ(av[0], "leamas\\");
        ASSERT_STRING_EQ(av[1], "\\smiley");
        ASSERT_PTR_EQ(av[2], NULL);
        RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("smiley\\ leamas", &ac, &av, 0), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "smiley leamas");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
+       TEST_DONE();
+
+       TEST_START("quoted escaped");
+       ASSERT_INT_EQ(argv_split("'smiley\\ leamas'", &ac, &av, 0), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "smiley\\ leamas");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("\"smiley\\ leamas\"", &ac, &av, 0), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "smiley\\ leamas");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
+       TEST_DONE();
+
+       TEST_START("comments");
+       ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 0), 0);
+       ASSERT_INT_EQ(ac, 2);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "#");
+       ASSERT_STRING_EQ(av[1], "gold");
+       ASSERT_PTR_EQ(av[2], NULL);
+       RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 1), 0);
+       ASSERT_INT_EQ(ac, 0);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_PTR_EQ(av[0], NULL);
+       RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("leamas#gold", &ac, &av, 1), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "leamas#gold");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("\"leamas # gold\"", &ac, &av, 1), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "leamas # gold");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
+       ASSERT_INT_EQ(argv_split("\"leamas\"#gold", &ac, &av, 1), 0);
+       ASSERT_INT_EQ(ac, 1);
+       ASSERT_PTR_NE(av, NULL);
+       ASSERT_STRING_EQ(av[0], "leamas#gold");
+       ASSERT_PTR_EQ(av[1], NULL);
+       RESET_ARGV();
        TEST_DONE();
 
        /* XXX test char *argv_assemble(int argc, char **argv) */