tests/unit_tests/openvpn/test_argv.c
698e268a
 #include "config.h"
 #include "syshead.h"
 
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <setjmp.h>
 #include <cmocka.h>
 #include <assert.h>
 
 #include "argv.h"
 #include "buffer.h"
 
 /* Defines for use in the tests and the mock parse_line() */
 #define PATH1       "/s p a c e"
 #define PATH2       "/foo bar/baz"
 #define PARAM1      "param1"
 #define PARAM2      "param two"
 #define SCRIPT_CMD  "\"" PATH1 PATH2 "\"" PARAM1 "\"" PARAM2 "\""
 
 int
81d882d5
 __wrap_parse_line(const char *line, char **p, const int n, const char *file,
                   const int line_num, int msglevel, struct gc_arena *gc)
698e268a
 {
81d882d5
     p[0] = PATH1 PATH2;
     p[1] = PARAM1;
     p[2] = PARAM2;
     return 3;
698e268a
 }
 
 static void
81d882d5
 argv_printf__multiple_spaces_in_format__parsed_as_one(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
698e268a
 
81d882d5
     argv_printf(&a, "    %s     %s  %d   ", PATH1, PATH2, 42);
     assert_int_equal(a.argc, 3);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_printf_cat__multiple_spaces_in_format__parsed_as_one(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
698e268a
 
81d882d5
     argv_printf(&a, "%s ", PATH1);
     argv_printf_cat(&a, " %s  %s", PATH2, PARAM1);
     assert_int_equal(a.argc, 3);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_printf__combined_path_with_spaces__argc_correct(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
698e268a
 
81d882d5
     argv_printf(&a, "%s%sc", PATH1, PATH2);
     assert_int_equal(a.argc, 1);
698e268a
 
81d882d5
     argv_printf(&a, "%s%sc %d", PATH1, PATH2, 42);
     assert_int_equal(a.argc, 2);
698e268a
 
81d882d5
     argv_printf(&a, "foo %s%sc %s x y", PATH2, PATH1, "foo");
     assert_int_equal(a.argc, 5);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_parse_cmd__command_string__argc_correct(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
698e268a
 
81d882d5
     argv_parse_cmd(&a, SCRIPT_CMD);
     assert_int_equal(a.argc, 3);
698e268a
 
81d882d5
     argv_reset(&a);
25360912
 }
 
 static void
81d882d5
 argv_parse_cmd__command_and_extra_options__argc_correct(void **state)
25360912
 {
81d882d5
     struct argv a = argv_new();
25360912
 
81d882d5
     argv_parse_cmd(&a, SCRIPT_CMD);
     argv_printf_cat(&a, "bar baz %d %s", 42, PATH1);
     assert_int_equal(a.argc, 7);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_printf_cat__used_twice__argc_correct(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
698e268a
 
81d882d5
     argv_printf(&a, "%s %s %s", PATH1, PATH2, PARAM1);
     argv_printf_cat(&a, "%s", PARAM2);
     argv_printf_cat(&a, "foo");
     assert_int_equal(a.argc, 5);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_str__multiple_argv__correct_output(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
     struct gc_arena gc = gc_new();
     const char *output;
 
     argv_printf(&a, "%s%sc", PATH1, PATH2);
     argv_printf_cat(&a, "%s", PARAM1);
     argv_printf_cat(&a, "%s", PARAM2);
4376805d
     argv_printf_cat(&a, "%d", -1);
     argv_printf_cat(&a, "%u", -1);
     argv_printf_cat(&a, "%lu", 1L );
81d882d5
     output = argv_str(&a, &gc, PA_BRACKET);
4376805d
     assert_string_equal(output, "[" PATH1 PATH2 "] [" PARAM1 "] [" PARAM2 "]"
 				" [-1] [4294967295] [1]");
81d882d5
 
     argv_reset(&a);
     gc_free(&gc);
698e268a
 }
 
 static void
81d882d5
 argv_insert_head__empty_argv__head_only(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
     struct argv b;
698e268a
 
81d882d5
     b = argv_insert_head(&a, PATH1);
     assert_int_equal(b.argc, 1);
     assert_string_equal(b.argv[0], PATH1);
     argv_reset(&b);
698e268a
 
81d882d5
     argv_reset(&a);
698e268a
 }
 
 static void
81d882d5
 argv_insert_head__non_empty_argv__head_added(void **state)
698e268a
 {
81d882d5
     struct argv a = argv_new();
     struct argv b;
     int i;
 
     argv_printf(&a, "%s", PATH2);
     b = argv_insert_head(&a, PATH1);
     assert_int_equal(b.argc, a.argc + 1);
     for (i = 0; i < b.argc; i++) {
         if (i == 0)
         {
             assert_string_equal(b.argv[i], PATH1);
         }
         else
         {
             assert_string_equal(b.argv[i], a.argv[i - 1]);
         }
     }
     argv_reset(&b);
 
     argv_reset(&a);
698e268a
 }
 
 int
 main(void)
 {
81d882d5
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(argv_printf__multiple_spaces_in_format__parsed_as_one),
         cmocka_unit_test(argv_printf_cat__multiple_spaces_in_format__parsed_as_one),
         cmocka_unit_test(argv_printf__combined_path_with_spaces__argc_correct),
         cmocka_unit_test(argv_parse_cmd__command_string__argc_correct),
         cmocka_unit_test(argv_parse_cmd__command_and_extra_options__argc_correct),
         cmocka_unit_test(argv_printf_cat__used_twice__argc_correct),
         cmocka_unit_test(argv_str__multiple_argv__correct_output),
         cmocka_unit_test(argv_insert_head__non_empty_argv__head_added),
     };
 
     return cmocka_run_group_tests_name("argv", tests, NULL, NULL);
698e268a
 }