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 *****************************************************************************/
20 #include "common.h"
21 #include "utils_base.h"
22 #include "extra_opts.h"
24 #include "tap.h"
26 void my_free(int *argc, char **argv) {
27 int i;
28 printf (" Arg(%i): ", *argc);
29 for (i=1; i<*argc; i++) printf ("'%s' ", argv[i]);
30 printf ("\n");
31 free(argv);
32 *argc=0;
33 }
35 int array_diff(int i1, char **a1, int i2, char **a2) {
36 int i;
38 if (i1 != i2) {
39 printf(" Argument count doesn't match!\n");
40 return 0;
41 }
42 for (i=0; i<=i1; i++) {
43 if (a1[i]==NULL && a2[i]==NULL) continue;
44 if (a1[i]==NULL || a2[i]==NULL) {
45 printf(" Argument # %i null in one array!\n", i);
46 return 0;
47 }
48 if (strcmp(a1[i], a2[i])) {
49 printf(" Argument # %i doesn't match!\n", i);
50 return 0;
51 }
52 }
53 return 1;
54 }
56 int
57 main (int argc, char **argv)
58 {
59 char **argv_test=NULL, **argv_known=NULL;
60 int i, argc_test;
62 plan_tests(10);
64 argv_test=(char **)malloc(2*sizeof(char **));
65 argv_test[0] = "prog_name";
66 argv_test[1] = NULL;
67 argc_test=1;
68 argv_known=(char **)realloc(argv_known, 2*sizeof(char **));
69 argv_known[0] = "prog_name";
70 argv_known[1] = NULL;
71 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
72 ok(array_diff(argc_test, argv_test, 1, argv_known), "No opts, returns correct argv/argc");
73 my_free(&argc_test, argv_test);
75 argv_test=(char **)malloc(6*sizeof(char **));
76 argv_test[0] = "prog_name";
77 argv_test[1] = "arg1";
78 argv_test[2] = "--arg2=val1";
79 argv_test[3] = "--arg3";
80 argv_test[4] = "val2";
81 argv_test[5] = NULL;
82 argc_test=5;
83 argv_known=(char **)realloc(argv_known, 6*sizeof(char **));
84 argv_known[0] = "prog_name";
85 argv_known[1] = "arg1";
86 argv_known[2] = "--arg2=val1";
87 argv_known[3] = "--arg3";
88 argv_known[4] = "val2";
89 argv_known[5] = NULL;
90 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
91 ok(array_diff(argc_test, argv_test, 5, argv_known), "No extra opts, verbatim copy of argv");
92 my_free(&argc_test,argv_test);
94 argv_test=(char **)malloc(3*sizeof(char **));
95 argv_test[0] = "prog_name";
96 argv_test[1] = "--extra-opts=@./config-opts.ini";
97 argv_test[2] = NULL;
98 argc_test=2;
99 argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
100 argv_known[0] = "prog_name";
101 argv_known[1] = "--foo=Bar";
102 argv_known[2] = "--this=Your Mother!";
103 argv_known[3] = "--blank";
104 argv_known[4] = NULL;
105 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
106 ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts using default section");
107 my_free(&argc_test,argv_test);
109 argv_test=(char **)malloc(5*sizeof(char **));
110 argv_test[0] = "prog_name";
111 argv_test[1] = "--extra-opts=sect1@./config-opts.ini";
112 argv_test[2] = "--extra-opts";
113 argv_test[3] = "sect2@./config-opts.ini";
114 argv_test[4] = NULL;
115 argc_test=4;
116 argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
117 argv_known[0] = "prog_name";
118 argv_known[1] = "--one=two";
119 argv_known[2] = "--something else=oops";
120 argv_known[3] = "--this=that";
121 argv_known[4] = NULL;
122 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
123 ok(array_diff(argc_test, argv_test, 4, argv_known), "Only extra opts specified twice");
124 my_free(&argc_test,argv_test);
126 argv_test=(char **)malloc(7*sizeof(char **));
127 argv_test[0] = "prog_name";
128 argv_test[1] = "--arg1=val1";
129 argv_test[2] = "--extra-opts=@./config-opts.ini";
130 argv_test[3] = "--extra-opts";
131 argv_test[4] = "sect1@./config-opts.ini";
132 argv_test[5] = "--arg2";
133 argv_test[6] = NULL;
134 argc_test=6;
135 argv_known=(char **)realloc(argv_known, 8*sizeof(char **));
136 argv_known[0] = "prog_name";
137 argv_known[1] = "--foo=Bar";
138 argv_known[2] = "--this=Your Mother!";
139 argv_known[3] = "--blank";
140 argv_known[4] = "--one=two";
141 argv_known[5] = "--arg1=val1";
142 argv_known[6] = "--arg2";
143 argv_known[7] = NULL;
144 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
145 ok(array_diff(argc_test, argv_test, 7, argv_known), "twice extra opts using two sections");
146 my_free(&argc_test,argv_test);
148 /* Next three checks are expected to die. They are commented out as they
149 * could possibly go in a sepatare test checked for return value.
150 */
151 /* argv_test=(char **)malloc(6*sizeof(char **));
152 argv_test[0] = "prog_name";
153 argv_test[1] = "arg1";
154 argv_test[2] = "--extra-opts=missing@./config-opts.ini";
155 argv_test[3] = "--arg3";
156 argv_test[4] = "val2";
157 argv_test[5] = NULL;
158 argc_test=5;
159 argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
160 argv_known[0] = "prog_name";
161 argv_known[1] = "arg1";
162 argv_known[2] = "--arg3";
163 argv_known[3] = "val2";
164 argv_known[4] = NULL;
165 argv_test=np_extra_opts(&argc_test, argv_test, "check_missing");
166 ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 1");
167 my_free(&argc_test,argv_test); */
169 /* argv_test=(char **)malloc(7*sizeof(char **));
170 argv_test[0] = "prog_name";
171 argv_test[1] = "arg1";
172 argv_test[2] = "--extra-opts";
173 argv_test[3] = "missing@./config-opts.ini";
174 argv_test[4] = "--arg3";
175 argv_test[5] = "val2";
176 argv_test[6] = NULL;
177 argc_test=6;
178 argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
179 argv_known[0] = "prog_name";
180 argv_known[1] = "arg1";
181 argv_known[2] = "--arg3";
182 argv_known[3] = "val2";
183 argv_known[4] = NULL;
184 argv_test=np_extra_opts(&argc_test, argv_test, "check_missing");
185 ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 2");
186 my_free(&argc_test,argv_test); */
188 /* argv_test=(char **)malloc(6*sizeof(char **));
189 argv_test[0] = "prog_name";
190 argv_test[1] = "arg1";
191 argv_test[2] = "--extra-opts";
192 argv_test[3] = "--arg3";
193 argv_test[4] = "val2";
194 argv_test[5] = NULL;
195 argc_test=5;
196 argv_known=(char **)realloc(argv_known, 5*sizeof(char **));
197 argv_known[0] = "prog_name";
198 argv_known[1] = "arg1";
199 argv_known[2] = "--arg3";
200 argv_known[3] = "val2";
201 argv_known[4] = NULL;
202 argv_test=np_extra_opts(&argc_test, argv_test, "check_missing");
203 ok(array_diff(argc_test, argv_test, 4, argv_known), "Missing section 3");
204 my_free(&argc_test,argv_test); */
206 setenv("NAGIOS_CONFIG_PATH", ".", 1);
207 argv_test=(char **)malloc(6*sizeof(char **));
208 argv_test[0] = "prog_name";
209 argv_test[1] = "arg1";
210 argv_test[2] = "--extra-opts";
211 argv_test[3] = "--arg3";
212 argv_test[4] = "val2";
213 argv_test[5] = NULL;
214 argc_test=5;
215 argv_known=(char **)realloc(argv_known, 6*sizeof(char **));
216 argv_known[0] = "prog_name";
217 argv_known[1] = "--foo=bar";
218 argv_known[2] = "arg1";
219 argv_known[3] = "--arg3";
220 argv_known[4] = "val2";
221 argv_known[5] = NULL;
222 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
223 ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 1");
225 argv_test=(char **)malloc(3*sizeof(char **));
226 argv_test[0] = "prog_name";
227 argv_test[1] = "--extra-opts";
228 argv_test[2] = NULL;
229 argc_test=2;
230 argv_known=(char **)realloc(argv_known, 3*sizeof(char **));
231 argv_known[0] = "prog_name";
232 argv_known[1] = "--foo=bar";
233 argv_known[2] = NULL;
234 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
235 ok(array_diff(argc_test, argv_test, 2, argv_known), "Default section 2");
236 my_free(&argc_test,argv_test);
238 argv_test=(char **)malloc(6*sizeof(char **));
239 argv_test[0] = "prog_name";
240 argv_test[1] = "arg1";
241 argv_test[2] = "--extra-opts=section1";
242 argv_test[3] = "--arg3";
243 argv_test[4] = "val2";
244 argv_test[5] = NULL;
245 argc_test=5;
246 argv_known=(char **)realloc(argv_known, 6*sizeof(char **));
247 argv_known[0] = "prog_name";
248 argv_known[1] = "--foobar=baz";
249 argv_known[2] = "arg1";
250 argv_known[3] = "--arg3";
251 argv_known[4] = "val2";
252 argv_known[5] = NULL;
253 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
254 ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 3");
255 my_free(&argc_test,argv_test);
257 argv_test=(char **)malloc(6*sizeof(char **));
258 argv_test[0] = "prog_name";
259 argv_test[1] = "arg1";
260 argv_test[2] = "--extra-opts";
261 argv_test[3] = "-arg3";
262 argv_test[4] = "val2";
263 argv_test[5] = NULL;
264 argc_test=5;
265 argv_known=(char **)realloc(argv_known, 6*sizeof(char **));
266 argv_known[0] = "prog_name";
267 argv_known[1] = "--foo=bar";
268 argv_known[2] = "arg1";
269 argv_known[3] = "-arg3";
270 argv_known[4] = "val2";
271 argv_known[5] = NULL;
272 argv_test=np_extra_opts(&argc_test, argv_test, "check_disk");
273 ok(array_diff(argc_test, argv_test, 5, argv_known), "Default section 4");
274 my_free(&argc_test,argv_test);
276 argv_test=(char **)malloc(4*sizeof(char **));
277 argv_test[0] = "check_tcp";
278 argv_test[1] = "--extra-opts";
279 argv_test[2] = "--extra-opts=tcp_long_lines";
280 argv_test[3] = NULL;
281 argc_test=3;
282 argv_known=(char **)realloc(argv_known, 7*sizeof(char **));
283 argv_known[0] = "check_tcp";
284 argv_known[1] = "--timeout=10";
285 argv_known[2] = "--escape";
286 argv_known[3] = "--send=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda";
287 argv_known[4] = "--expect=Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda Foo bar BAZ yadda yadda yadda";
288 argv_known[5] = "--jail";
289 argv_known[6] = NULL;
290 argv_test=np_extra_opts(&argc_test, argv_test, "check_tcp");
291 ok(array_diff(argc_test, argv_test, 6, argv_known), "Long lines test");
292 my_free(&argc_test,argv_test);
294 return exit_status();
295 }