test_argv.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include "config.h"
  2. #include "syshead.h"
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <stdarg.h>
  7. #include <string.h>
  8. #include <setjmp.h>
  9. #include <cmocka.h>
  10. #include <assert.h>
  11. #include "argv.h"
  12. #include "buffer.h"
  13. /* Defines for use in the tests and the mock parse_line() */
  14. #define PATH1 "/s p a c e"
  15. #define PATH2 "/foo bar/baz"
  16. #define PARAM1 "param1"
  17. #define PARAM2 "param two"
  18. #define SCRIPT_CMD "\"" PATH1 PATH2 "\"" PARAM1 "\"" PARAM2 "\""
  19. int
  20. __wrap_parse_line(const char *line, char **p, const int n, const char *file,
  21. const int line_num, int msglevel, struct gc_arena *gc)
  22. {
  23. p[0] = PATH1 PATH2;
  24. p[1] = PARAM1;
  25. p[2] = PARAM2;
  26. return 3;
  27. }
  28. static void
  29. argv_printf__multiple_spaces_in_format__parsed_as_one(void **state)
  30. {
  31. struct argv a = argv_new();
  32. argv_printf(&a, " %s %s %d ", PATH1, PATH2, 42);
  33. assert_int_equal(a.argc, 3);
  34. argv_reset(&a);
  35. }
  36. static void
  37. argv_printf_cat__multiple_spaces_in_format__parsed_as_one(void **state)
  38. {
  39. struct argv a = argv_new();
  40. argv_printf(&a, "%s ", PATH1);
  41. argv_printf_cat(&a, " %s %s", PATH2, PARAM1);
  42. assert_int_equal(a.argc, 3);
  43. argv_reset(&a);
  44. }
  45. static void
  46. argv_printf__combined_path_with_spaces__argc_correct(void **state)
  47. {
  48. struct argv a = argv_new();
  49. argv_printf(&a, "%s%sc", PATH1, PATH2);
  50. assert_int_equal(a.argc, 1);
  51. argv_printf(&a, "%s%sc %d", PATH1, PATH2, 42);
  52. assert_int_equal(a.argc, 2);
  53. argv_printf(&a, "foo %s%sc %s x y", PATH2, PATH1, "foo");
  54. assert_int_equal(a.argc, 5);
  55. argv_reset(&a);
  56. }
  57. static void
  58. argv_parse_cmd__command_string__argc_correct(void **state)
  59. {
  60. struct argv a = argv_new();
  61. argv_parse_cmd(&a, SCRIPT_CMD);
  62. assert_int_equal(a.argc, 3);
  63. argv_reset(&a);
  64. }
  65. static void
  66. argv_parse_cmd__command_and_extra_options__argc_correct(void **state)
  67. {
  68. struct argv a = argv_new();
  69. argv_parse_cmd(&a, SCRIPT_CMD);
  70. argv_printf_cat(&a, "bar baz %d %s", 42, PATH1);
  71. assert_int_equal(a.argc, 7);
  72. argv_reset(&a);
  73. }
  74. static void
  75. argv_printf_cat__used_twice__argc_correct(void **state)
  76. {
  77. struct argv a = argv_new();
  78. argv_printf(&a, "%s %s %s", PATH1, PATH2, PARAM1);
  79. argv_printf_cat(&a, "%s", PARAM2);
  80. argv_printf_cat(&a, "foo");
  81. assert_int_equal(a.argc, 5);
  82. argv_reset(&a);
  83. }
  84. static void
  85. argv_str__multiple_argv__correct_output(void **state)
  86. {
  87. struct argv a = argv_new();
  88. struct gc_arena gc = gc_new();
  89. const char *output;
  90. argv_printf(&a, "%s%sc", PATH1, PATH2);
  91. argv_printf_cat(&a, "%s", PARAM1);
  92. argv_printf_cat(&a, "%s", PARAM2);
  93. argv_printf_cat(&a, "%d", -1);
  94. argv_printf_cat(&a, "%u", -1);
  95. argv_printf_cat(&a, "%lu", 1L );
  96. output = argv_str(&a, &gc, PA_BRACKET);
  97. assert_string_equal(output, "[" PATH1 PATH2 "] [" PARAM1 "] [" PARAM2 "]"
  98. " [-1] [4294967295] [1]");
  99. argv_reset(&a);
  100. gc_free(&gc);
  101. }
  102. static void
  103. argv_insert_head__empty_argv__head_only(void **state)
  104. {
  105. struct argv a = argv_new();
  106. struct argv b;
  107. b = argv_insert_head(&a, PATH1);
  108. assert_int_equal(b.argc, 1);
  109. assert_string_equal(b.argv[0], PATH1);
  110. argv_reset(&b);
  111. argv_reset(&a);
  112. }
  113. static void
  114. argv_insert_head__non_empty_argv__head_added(void **state)
  115. {
  116. struct argv a = argv_new();
  117. struct argv b;
  118. int i;
  119. argv_printf(&a, "%s", PATH2);
  120. b = argv_insert_head(&a, PATH1);
  121. assert_int_equal(b.argc, a.argc + 1);
  122. for (i = 0; i < b.argc; i++) {
  123. if (i == 0)
  124. {
  125. assert_string_equal(b.argv[i], PATH1);
  126. }
  127. else
  128. {
  129. assert_string_equal(b.argv[i], a.argv[i - 1]);
  130. }
  131. }
  132. argv_reset(&b);
  133. argv_reset(&a);
  134. }
  135. int
  136. main(void)
  137. {
  138. const struct CMUnitTest tests[] = {
  139. cmocka_unit_test(argv_printf__multiple_spaces_in_format__parsed_as_one),
  140. cmocka_unit_test(argv_printf_cat__multiple_spaces_in_format__parsed_as_one),
  141. cmocka_unit_test(argv_printf__combined_path_with_spaces__argc_correct),
  142. cmocka_unit_test(argv_parse_cmd__command_string__argc_correct),
  143. cmocka_unit_test(argv_parse_cmd__command_and_extra_options__argc_correct),
  144. cmocka_unit_test(argv_printf_cat__used_twice__argc_correct),
  145. cmocka_unit_test(argv_str__multiple_argv__correct_output),
  146. cmocka_unit_test(argv_insert_head__non_empty_argv__head_added),
  147. };
  148. return cmocka_run_group_tests_name("argv", tests, NULL, NULL);
  149. }