4
0

test_opts.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /*****************************************************************************
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 3 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. *
  16. * $Id: test_ini.c 1951 2008-03-16 18:10:47Z dermoth $
  17. *
  18. *****************************************************************************/
  19. #include "common.h"
  20. #include "extra_opts.h"
  21. #include "utils_base.h"
  22. #include "tap.h"
  23. void my_free(int *argc, char **argv) {
  24. int i;
  25. printf (" Arg(%i): ", *argc);
  26. for (i=1; i<*argc; i++) printf ("'%s' ", argv[i]);
  27. printf ("\n");
  28. free(argv);
  29. *argc=0;
  30. }
  31. int array_diff(int i1, char **a1, int i2, char **a2) {
  32. int i;
  33. if (i1 != i2) {
  34. printf(" Argument count doesn't match!\n");
  35. return 0;
  36. }
  37. for (i=0; i<=i1; i++) {
  38. if (a1[i]==NULL && a2[i]==NULL) continue;
  39. if (a1[i]==NULL || a2[i]==NULL) {
  40. printf(" Argument # %i null in one array!\n", i);
  41. return 0;
  42. }
  43. if (strcmp(a1[i], a2[i])) {
  44. printf(" Argument # %i doesn't match!\n", i);
  45. return 0;
  46. }
  47. }
  48. return 1;
  49. }
  50. int
  51. main (int argc, char **argv)
  52. {
  53. char **argv_test=NULL, **argv_known=NULL;
  54. int i, argc_test, argc_new;
  55. plan_tests(8);
  56. argv_test=(char **)malloc(2*sizeof(char **));
  57. argv_test[0] = "prog_name";
  58. argv_test[1] = NULL;
  59. argc_test=1;
  60. argv_known=(char **)realloc(argv_known, 2*sizeof(char **));
  61. argv_known[0] = "prog_name";
  62. argv_known[1] = NULL;
  63. argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new);
  64. ok(array_diff(argc_new, argv_test, 1, argv_known), "No opts, returns correct argv/argc");
  65. my_free(&argc_new, argv_test);
  66. argv_test=(char **)malloc(6*sizeof(char **));
  67. argv_test[0] = "prog_name";
  68. argv_test[1] = "arg1";
  69. argv_test[2] = "--arg2=val1";
  70. argv_test[3] = "--arg3";
  71. argv_test[4] = "val2";
  72. argv_test[5] = NULL;
  73. argc_test=5;
  74. argv_known=(char **)realloc(argv_known, 6*sizeof(char **));
  75. argv_known[0] = "prog_name";
  76. argv_known[1] = "arg1";
  77. argv_known[2] = "--arg2=val1";
  78. argv_known[3] = "--arg3";
  79. argv_known[4] = "val2";
  80. argv_known[5] = NULL;
  81. argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new);
  82. ok(array_diff(argc_new, argv_test, 5, argv_known), "No extra opts, verbatim copy of argv");
  83. my_free(&argc_new,argv_test);
  84. argv_test=(char **)malloc(3*sizeof(char **));
  85. argv_test[0] = "prog_name";
  86. argv_test[1] = "--extra-opts=@./config-opts.ini";
  87. argv_test[2] = NULL;
  88. argc_test=2;
  89. argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
  90. argv_known[0] = "prog_name";
  91. argv_known[1] = "--foo=Bar";
  92. argv_known[2] = "--this=Your Mother!";
  93. argv_known[3] = "--blank";
  94. argv_known[4] = NULL;
  95. argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new);
  96. ok(array_diff(argc_new, argv_test, 4, argv_known), "Only extra opts using default section");
  97. my_free(&argc_new,argv_test);
  98. argv_test=(char **)malloc(5*sizeof(char **));
  99. argv_test[0] = "prog_name";
  100. argv_test[1] = "--extra-opts=sect1@./config-opts.ini";
  101. argv_test[2] = "--extra-opts";
  102. argv_test[3] = "sect2@./config-opts.ini";
  103. argv_test[4] = NULL;
  104. argc_test=4;
  105. argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
  106. argv_known[0] = "prog_name";
  107. argv_known[1] = "--one=two";
  108. argv_known[2] = "--something else=oops";
  109. argv_known[3] = "--this=that";
  110. argv_known[4] = NULL;
  111. argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new);
  112. ok(array_diff(argc_new, argv_test, 4, argv_known), "Only extra opts specified twice");
  113. my_free(&argc_new,argv_test);
  114. argv_test=(char **)malloc(7*sizeof(char **));
  115. argv_test[0] = "prog_name";
  116. argv_test[1] = "--arg1=val1";
  117. argv_test[2] = "--extra-opts=@./config-opts.ini";
  118. argv_test[3] = "--extra-opts";
  119. argv_test[4] = "sect1@./config-opts.ini";
  120. argv_test[5] = "--arg2";
  121. argv_test[6] = NULL;
  122. argc_test=6;
  123. argv_known=(char **)realloc(argv_known, 8*sizeof(char **));
  124. argv_known[0] = "prog_name";
  125. argv_known[1] = "--foo=Bar";
  126. argv_known[2] = "--this=Your Mother!";
  127. argv_known[3] = "--blank";
  128. argv_known[4] = "--one=two";
  129. argv_known[5] = "--arg1=val1";
  130. argv_known[6] = "--arg2";
  131. argv_known[7] = NULL;
  132. argv_test=np_extra_opts(argc_test, argv_test, "check_disk", &argc_new);
  133. ok(array_diff(argc_new, argv_test, 7, argv_known), "twice extra opts using two sections");
  134. my_free(&argc_new,argv_test);
  135. /* Next three checks should die according to N::P - for now they're useful
  136. * to test code is working properly (i.e. no srash or unexpected behavior)
  137. */
  138. argv_test=(char **)malloc(6*sizeof(char **));
  139. argv_test[0] = "prog_name";
  140. argv_test[1] = "arg1";
  141. argv_test[2] = "--extra-opts=missing@./config-opts.ini";
  142. argv_test[3] = "--arg3";
  143. argv_test[4] = "val2";
  144. argv_test[5] = NULL;
  145. argc_test=5;
  146. argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
  147. argv_known[0] = "prog_name";
  148. argv_known[1] = "arg1";
  149. argv_known[2] = "--arg3";
  150. argv_known[3] = "val2";
  151. argv_known[4] = NULL;
  152. argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new);
  153. ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 1");
  154. my_free(&argc_new,argv_test);
  155. argv_test=(char **)malloc(7*sizeof(char **));
  156. argv_test[0] = "prog_name";
  157. argv_test[1] = "arg1";
  158. argv_test[2] = "--extra-opts";
  159. argv_test[3] = "missing@./config-opts.ini";
  160. argv_test[4] = "--arg3";
  161. argv_test[5] = "val2";
  162. argv_test[6] = NULL;
  163. argc_test=6;
  164. argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
  165. argv_known[0] = "prog_name";
  166. argv_known[1] = "arg1";
  167. argv_known[2] = "--arg3";
  168. argv_known[3] = "val2";
  169. argv_known[4] = NULL;
  170. argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new);
  171. ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 2");
  172. my_free(&argc_new,argv_test);
  173. argv_test=(char **)malloc(6*sizeof(char **));
  174. argv_test[0] = "prog_name";
  175. argv_test[1] = "arg1";
  176. argv_test[2] = "--extra-opts";
  177. argv_test[3] = "--arg3";
  178. argv_test[4] = "val2";
  179. argv_test[5] = NULL;
  180. argc_test=5;
  181. argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
  182. argv_known[0] = "prog_name";
  183. argv_known[1] = "arg1";
  184. argv_known[2] = "--arg3";
  185. argv_known[3] = "val2";
  186. argv_known[4] = NULL;
  187. argv_test=np_extra_opts(argc_test, argv_test, "check_missing", &argc_new);
  188. ok(array_diff(argc_new, argv_test, 4, argv_known), "Missing section 3");
  189. my_free(&argc_new,argv_test);
  190. return exit_status();
  191. }