1 #include "common.h"
2 #include "vnstat_tests.h"
3 #include "vnstat_func.h"
4 #include "cfg.h"
5 #include "dbsql.h"
6 #include "parseargs_tests.h"
7 
START_TEST(vnstat_parseargs_does_nothing_without_args)8 START_TEST(vnstat_parseargs_does_nothing_without_args)
9 {
10 	PARAMS p;
11 	char *argv[] = {"vnstat", "-h", NULL};
12 	int argc = sizeof(argv) / sizeof(char *) - 1;
13 
14 	initparams(&p);
15 	parseargs(&p, argc, argv);
16 }
17 END_TEST
18 
START_TEST(vnstat_parseargs_can_help)19 START_TEST(vnstat_parseargs_can_help)
20 {
21 	PARAMS p;
22 	char *argv[] = {"vnstat", "--help", NULL};
23 	int argc = sizeof(argv) / sizeof(char *) - 1;
24 
25 	initparams(&p);
26 	debug = 1;
27 	suppress_output();
28 	parseargs(&p, argc, argv);
29 }
30 END_TEST
31 
START_TEST(vnstat_parseargs_can_longhelp)32 START_TEST(vnstat_parseargs_can_longhelp)
33 {
34 	PARAMS p;
35 	char *argv[] = {"vnstat", "--longhelp", NULL};
36 	int argc = sizeof(argv) / sizeof(char *) - 1;
37 
38 	initparams(&p);
39 	suppress_output();
40 	parseargs(&p, argc, argv);
41 }
42 END_TEST
43 
START_TEST(vnstat_parseargs_can_show_version)44 START_TEST(vnstat_parseargs_can_show_version)
45 {
46 	PARAMS p;
47 	char *argv[] = {"vnstat", "--version", NULL};
48 	int argc = sizeof(argv) / sizeof(char *) - 1;
49 
50 	initparams(&p);
51 	suppress_output();
52 	parseargs(&p, argc, argv);
53 }
54 END_TEST
55 
START_TEST(vnstat_parseargs_detects_unknown_parameters)56 START_TEST(vnstat_parseargs_detects_unknown_parameters)
57 {
58 	PARAMS p;
59 	char *argv[] = {"vnstat", "--something_fishy", NULL};
60 	int argc = sizeof(argv) / sizeof(char *) - 1;
61 
62 	initparams(&p);
63 	suppress_output();
64 	parseargs(&p, argc, argv);
65 }
66 END_TEST
67 
START_TEST(vnstat_parseargs_can_modify_settings)68 START_TEST(vnstat_parseargs_can_modify_settings)
69 {
70 	PARAMS p;
71 	char *argv[] = {"vnstat", "--debug", "--traffic", "12", "--add", "--rename", "aname", "--config",
72 					"does_nothing", "-l", "1", "--remove", "-i", "ethsomething", "--style", "0", "--dbdir",
73 					"dbsomewhere", "-q", "-d", "1", "-m", "2", "-t", "3", "-s", "-y", "4", "-hg", "-h", "5", "-5", "6",
74 					"--oneline", "b", "--xml", "h", "7", "--json", "d", "7", "-ru", "--rateunit", "0",
75 					"--force", "--setalias", "super", "--begin", "2000-01-01",
76 					"--end", "2001-01-01", NULL};
77 	int argc = sizeof(argv) / sizeof(char *) - 1;
78 
79 	initparams(&p);
80 	suppress_output();
81 	parseargs(&p, argc, argv);
82 
83 	ck_assert_str_eq(p.interface, "ethsomething");
84 	ck_assert_int_eq(p.defaultiface, 0);
85 	ck_assert_int_eq(cfg.ostyle, 4);
86 	ck_assert_str_eq(cfg.dbdir, "dbsomewhere");
87 	ck_assert_int_eq(p.query, 1);
88 	ck_assert_int_eq(p.force, 1);
89 	ck_assert_int_eq(cfg.qmode, 10);
90 	ck_assert_int_eq(p.jsonmode, 'd');
91 	ck_assert_int_eq(p.xmlmode, 'h');
92 	ck_assert_int_eq(cfg.rateunit, 0);
93 	ck_assert_int_eq(p.setalias, 1);
94 	ck_assert_str_eq(p.alias, "super");
95 	ck_assert_str_eq(p.newifname, "aname");
96 	ck_assert_int_eq(p.renameiface, 1);
97 	ck_assert_int_eq(p.removeiface, 1);
98 	ck_assert_int_eq(p.traffic, 1);
99 	ck_assert_int_eq(cfg.sampletime, 12);
100 	ck_assert_int_eq(p.livetraffic, 1);
101 	ck_assert_int_eq(p.livemode, 1);
102 	ck_assert_int_eq(cfg.listdays, 1);
103 	ck_assert_int_eq(cfg.listmonths, 2);
104 	ck_assert_int_eq(cfg.listtop, 3);
105 	ck_assert_int_eq(cfg.listyears, 4);
106 	ck_assert_int_eq(cfg.listhours, 5);
107 	ck_assert_int_eq(cfg.listfivemins, 6);
108 	ck_assert_int_eq(cfg.listjsonxml, 7);
109 	ck_assert_str_eq(p.databegin, "2000-01-01");
110 	ck_assert_str_eq(p.dataend, "2001-01-01");
111 }
112 END_TEST
113 
START_TEST(vnstat_parseargs_does_not_allow_too_long_interface_names)114 START_TEST(vnstat_parseargs_does_not_allow_too_long_interface_names)
115 {
116 	PARAMS p;
117 	char *argv[] = {"vnstat", "--iface", "12345678901234567890123456789012", NULL};
118 	int argc = sizeof(argv) / sizeof(char *) - 1;
119 
120 	initparams(&p);
121 	suppress_output();
122 	parseargs(&p, argc, argv);
123 }
124 END_TEST
125 
START_TEST(vnstat_parseargs_style_requires_parameter)126 START_TEST(vnstat_parseargs_style_requires_parameter)
127 {
128 	PARAMS p;
129 	char *argv[] = {"vnstat", "--style", NULL};
130 	int argc = sizeof(argv) / sizeof(char *) - 1;
131 
132 	initparams(&p);
133 	suppress_output();
134 	parseargs(&p, argc, argv);
135 }
136 END_TEST
137 
START_TEST(vnstat_parseargs_style_checks_parameter)138 START_TEST(vnstat_parseargs_style_checks_parameter)
139 {
140 	PARAMS p;
141 	char *argv[] = {"vnstat", "--style", "9001", NULL};
142 	int argc = sizeof(argv) / sizeof(char *) - 1;
143 
144 	initparams(&p);
145 	suppress_output();
146 	parseargs(&p, argc, argv);
147 }
148 END_TEST
149 
START_TEST(vnstat_parseargs_knows_that_update_is_not_supported)150 START_TEST(vnstat_parseargs_knows_that_update_is_not_supported)
151 {
152 	PARAMS p;
153 	char *argv[] = {"vnstat", "-u", NULL};
154 	int argc = sizeof(argv) / sizeof(char *) - 1;
155 
156 	initparams(&p);
157 	suppress_output();
158 	parseargs(&p, argc, argv);
159 }
160 END_TEST
161 
START_TEST(vnstat_parseargs_dbdir_requires_a_directory)162 START_TEST(vnstat_parseargs_dbdir_requires_a_directory)
163 {
164 	PARAMS p;
165 	char *argv[] = {"vnstat", "--dbdir", NULL};
166 	int argc = sizeof(argv) / sizeof(char *) - 1;
167 
168 	initparams(&p);
169 	suppress_output();
170 	parseargs(&p, argc, argv);
171 }
172 END_TEST
173 
START_TEST(vnstat_parseargs_oneline_gives_help)174 START_TEST(vnstat_parseargs_oneline_gives_help)
175 {
176 	PARAMS p;
177 	char *argv[] = {"vnstat", "--oneline", "a", NULL};
178 	int argc = sizeof(argv) / sizeof(char *) - 1;
179 
180 	initparams(&p);
181 	suppress_output();
182 	parseargs(&p, argc, argv);
183 }
184 END_TEST
185 
START_TEST(vnstat_parseargs_xml_gives_help)186 START_TEST(vnstat_parseargs_xml_gives_help)
187 {
188 	PARAMS p;
189 	char *argv[] = {"vnstat", "--xml", "b", NULL};
190 	int argc = sizeof(argv) / sizeof(char *) - 1;
191 
192 	initparams(&p);
193 	suppress_output();
194 	parseargs(&p, argc, argv);
195 }
196 END_TEST
197 
START_TEST(vnstat_parseargs_xml_without_extra_params)198 START_TEST(vnstat_parseargs_xml_without_extra_params)
199 {
200 	PARAMS p;
201 	char *argv[] = {"vnstat", "--xml", NULL};
202 	int argc = sizeof(argv) / sizeof(char *) - 1;
203 
204 	cfg.qmode = 0;
205 	initparams(&p);
206 	suppress_output();
207 	parseargs(&p, argc, argv);
208 	ck_assert_int_eq(cfg.qmode, 8);
209 	ck_assert_int_eq(p.xmlmode, 'a');
210 	ck_assert_int_eq(cfg.listjsonxml, 0);
211 }
212 END_TEST
213 
START_TEST(vnstat_parseargs_xml_with_mode)214 START_TEST(vnstat_parseargs_xml_with_mode)
215 {
216 	PARAMS p;
217 	char *argv[] = {"vnstat", "--xml", "m", NULL};
218 	int argc = sizeof(argv) / sizeof(char *) - 1;
219 
220 	cfg.qmode = 0;
221 	initparams(&p);
222 	suppress_output();
223 	parseargs(&p, argc, argv);
224 	ck_assert_int_eq(cfg.qmode, 8);
225 	ck_assert_int_eq(p.xmlmode, 'm');
226 	ck_assert_int_eq(cfg.listjsonxml, 0);
227 }
228 END_TEST
229 
START_TEST(vnstat_parseargs_xml_with_limit)230 START_TEST(vnstat_parseargs_xml_with_limit)
231 {
232 	PARAMS p;
233 	char *argv[] = {"vnstat", "--xml", "1231", NULL};
234 	int argc = sizeof(argv) / sizeof(char *) - 1;
235 
236 	cfg.qmode = 0;
237 	initparams(&p);
238 	suppress_output();
239 	parseargs(&p, argc, argv);
240 	ck_assert_int_eq(cfg.qmode, 8);
241 	ck_assert_int_eq(p.xmlmode, 'a');
242 	ck_assert_int_eq(cfg.listjsonxml, 1231);
243 }
244 END_TEST
245 
START_TEST(vnstat_parseargs_xml_with_mode_and_limit)246 START_TEST(vnstat_parseargs_xml_with_mode_and_limit)
247 {
248 	PARAMS p;
249 	char *argv[] = {"vnstat", "--xml", "t", "2", NULL};
250 	int argc = sizeof(argv) / sizeof(char *) - 1;
251 
252 	cfg.qmode = 0;
253 	initparams(&p);
254 	suppress_output();
255 	parseargs(&p, argc, argv);
256 	ck_assert_int_eq(cfg.qmode, 8);
257 	ck_assert_int_eq(p.xmlmode, 't');
258 	ck_assert_int_eq(cfg.listjsonxml, 2);
259 }
260 END_TEST
261 
START_TEST(vnstat_parseargs_json_gives_help)262 START_TEST(vnstat_parseargs_json_gives_help)
263 {
264 	PARAMS p;
265 	char *argv[] = {"vnstat", "--json", "b", NULL};
266 	int argc = sizeof(argv) / sizeof(char *) - 1;
267 
268 	initparams(&p);
269 	suppress_output();
270 	parseargs(&p, argc, argv);
271 }
272 END_TEST
273 
START_TEST(vnstat_parseargs_json_without_extra_params)274 START_TEST(vnstat_parseargs_json_without_extra_params)
275 {
276 	PARAMS p;
277 	char *argv[] = {"vnstat", "--json", NULL};
278 	int argc = sizeof(argv) / sizeof(char *) - 1;
279 
280 	cfg.qmode = 0;
281 	initparams(&p);
282 	suppress_output();
283 	parseargs(&p, argc, argv);
284 	ck_assert_int_eq(cfg.qmode, 10);
285 	ck_assert_int_eq(p.jsonmode, 'a');
286 	ck_assert_int_eq(cfg.listjsonxml, 0);
287 }
288 END_TEST
289 
START_TEST(vnstat_parseargs_json_with_mode)290 START_TEST(vnstat_parseargs_json_with_mode)
291 {
292 	PARAMS p;
293 	char *argv[] = {"vnstat", "--json", "m", NULL};
294 	int argc = sizeof(argv) / sizeof(char *) - 1;
295 
296 	cfg.qmode = 0;
297 	initparams(&p);
298 	suppress_output();
299 	parseargs(&p, argc, argv);
300 	ck_assert_int_eq(cfg.qmode, 10);
301 	ck_assert_int_eq(p.jsonmode, 'm');
302 	ck_assert_int_eq(cfg.listjsonxml, 0);
303 }
304 END_TEST
305 
START_TEST(vnstat_parseargs_json_with_limit)306 START_TEST(vnstat_parseargs_json_with_limit)
307 {
308 	PARAMS p;
309 	char *argv[] = {"vnstat", "--json", "1232", NULL};
310 	int argc = sizeof(argv) / sizeof(char *) - 1;
311 
312 	cfg.qmode = 0;
313 	initparams(&p);
314 	suppress_output();
315 	parseargs(&p, argc, argv);
316 	ck_assert_int_eq(cfg.qmode, 10);
317 	ck_assert_int_eq(p.jsonmode, 'a');
318 	ck_assert_int_eq(cfg.listjsonxml, 1232);
319 }
320 END_TEST
321 
START_TEST(vnstat_parseargs_json_with_mode_and_limit)322 START_TEST(vnstat_parseargs_json_with_mode_and_limit)
323 {
324 	PARAMS p;
325 	char *argv[] = {"vnstat", "--json", "d", "3", NULL};
326 	int argc = sizeof(argv) / sizeof(char *) - 1;
327 
328 	cfg.qmode = 0;
329 	initparams(&p);
330 	suppress_output();
331 	parseargs(&p, argc, argv);
332 	ck_assert_int_eq(cfg.qmode, 10);
333 	ck_assert_int_eq(p.jsonmode, 'd');
334 	ck_assert_int_eq(cfg.listjsonxml, 3);
335 }
336 END_TEST
337 
START_TEST(vnstat_parseargs_rateunit_gives_help)338 START_TEST(vnstat_parseargs_rateunit_gives_help)
339 {
340 	PARAMS p;
341 	char *argv[] = {"vnstat", "--rateunit", "2", NULL};
342 	int argc = sizeof(argv) / sizeof(char *) - 1;
343 
344 	initparams(&p);
345 	suppress_output();
346 	parseargs(&p, argc, argv);
347 }
348 END_TEST
349 
START_TEST(vnstat_parseargs_live_gives_help)350 START_TEST(vnstat_parseargs_live_gives_help)
351 {
352 	PARAMS p;
353 	char *argv[] = {"vnstat", "--live", "2", NULL};
354 	int argc = sizeof(argv) / sizeof(char *) - 1;
355 
356 	initparams(&p);
357 	suppress_output();
358 	parseargs(&p, argc, argv);
359 }
360 END_TEST
361 
START_TEST(vnstat_parseargs_begin_gives_help)362 START_TEST(vnstat_parseargs_begin_gives_help)
363 {
364 	PARAMS p;
365 	char *argv[] = {"vnstat", "--begin", NULL};
366 	int argc = sizeof(argv) / sizeof(char *) - 1;
367 
368 	initparams(&p);
369 	suppress_output();
370 	parseargs(&p, argc, argv);
371 }
372 END_TEST
373 
START_TEST(vnstat_parseargs_end_gives_help)374 START_TEST(vnstat_parseargs_end_gives_help)
375 {
376 	PARAMS p;
377 	char *argv[] = {"vnstat", "--end", NULL};
378 	int argc = sizeof(argv) / sizeof(char *) - 1;
379 
380 	initparams(&p);
381 	suppress_output();
382 	parseargs(&p, argc, argv);
383 }
384 END_TEST
385 
START_TEST(vnstat_parseargs_begin_validates_input)386 START_TEST(vnstat_parseargs_begin_validates_input)
387 {
388 	PARAMS p;
389 	char *argv[] = {"vnstat", "--begin", "world_domination", NULL};
390 	int argc = sizeof(argv) / sizeof(char *) - 1;
391 
392 	initparams(&p);
393 	suppress_output();
394 	parseargs(&p, argc, argv);
395 }
396 END_TEST
397 
START_TEST(vnstat_parseargs_end_validates_input)398 START_TEST(vnstat_parseargs_end_validates_input)
399 {
400 	PARAMS p;
401 	char *argv[] = {"vnstat", "--end", "what?", NULL};
402 	int argc = sizeof(argv) / sizeof(char *) - 1;
403 
404 	initparams(&p);
405 	suppress_output();
406 	parseargs(&p, argc, argv);
407 }
408 END_TEST
409 
START_TEST(vnstat_parseargs_can_show_config)410 START_TEST(vnstat_parseargs_can_show_config)
411 {
412 	PARAMS p;
413 	char *argv[] = {"vnstat", "--showconfig", NULL};
414 	int argc = sizeof(argv) / sizeof(char *) - 1;
415 
416 	initparams(&p);
417 	suppress_output();
418 	parseargs(&p, argc, argv);
419 }
420 END_TEST
421 
START_TEST(vnstat_parseargs_iface_requires_parameter)422 START_TEST(vnstat_parseargs_iface_requires_parameter)
423 {
424 	PARAMS p;
425 	char *argv[] = {"vnstat", "--iface", NULL};
426 	int argc = sizeof(argv) / sizeof(char *) - 1;
427 
428 	initparams(&p);
429 	suppress_output();
430 	parseargs(&p, argc, argv);
431 }
432 END_TEST
433 
START_TEST(vnstat_parseargs_locale_requires_parameter)434 START_TEST(vnstat_parseargs_locale_requires_parameter)
435 {
436 	PARAMS p;
437 	char *argv[] = {"vnstat", "--locale", NULL};
438 	int argc = sizeof(argv) / sizeof(char *) - 1;
439 
440 	initparams(&p);
441 	suppress_output();
442 	parseargs(&p, argc, argv);
443 }
444 END_TEST
445 
START_TEST(vnstat_parseargs_setalias_requires_parameter)446 START_TEST(vnstat_parseargs_setalias_requires_parameter)
447 {
448 	PARAMS p;
449 	char *argv[] = {"vnstat", "--setalias", NULL};
450 	int argc = sizeof(argv) / sizeof(char *) - 1;
451 
452 	initparams(&p);
453 	suppress_output();
454 	parseargs(&p, argc, argv);
455 }
456 END_TEST
457 
START_TEST(vnstat_parseargs_setalias_still_supports_nick)458 START_TEST(vnstat_parseargs_setalias_still_supports_nick)
459 {
460 	PARAMS p;
461 	char *argv[] = {"vnstat", "--nick", "Underground", NULL};
462 	int argc = sizeof(argv) / sizeof(char *) - 1;
463 
464 	initparams(&p);
465 	suppress_output();
466 	parseargs(&p, argc, argv);
467 	ck_assert_int_eq(p.setalias, 1);
468 	ck_assert_str_eq(p.alias, "Underground");
469 }
470 END_TEST
471 
START_TEST(vnstat_parseargs_rename_requires_parameter)472 START_TEST(vnstat_parseargs_rename_requires_parameter)
473 {
474 	PARAMS p;
475 	char *argv[] = {"vnstat", "--rename", NULL};
476 	int argc = sizeof(argv) / sizeof(char *) - 1;
477 
478 	initparams(&p);
479 	suppress_output();
480 	parseargs(&p, argc, argv);
481 }
482 END_TEST
483 
START_TEST(vnstat_parseargs_limit_requires_parameter)484 START_TEST(vnstat_parseargs_limit_requires_parameter)
485 {
486 	PARAMS p;
487 	char *argv[] = {"vnstat", "--limit", NULL};
488 	int argc = sizeof(argv) / sizeof(char *) - 1;
489 
490 	initparams(&p);
491 	suppress_output();
492 	parseargs(&p, argc, argv);
493 }
494 END_TEST
495 
START_TEST(vnstat_parseargs_limit_cannot_be_negative)496 START_TEST(vnstat_parseargs_limit_cannot_be_negative)
497 {
498 	PARAMS p;
499 	char *argv[] = {"vnstat", "--limit", "-1", NULL};
500 	int argc = sizeof(argv) / sizeof(char *) - 1;
501 
502 	initparams(&p);
503 	suppress_output();
504 	parseargs(&p, argc, argv);
505 }
506 END_TEST
507 
START_TEST(vnstat_parseargs_limit_changes_defaults)508 START_TEST(vnstat_parseargs_limit_changes_defaults)
509 {
510 	PARAMS p;
511 	char *argv[] = {"vnstat", "--limit", "1234", NULL};
512 	int argc = sizeof(argv) / sizeof(char *) - 1;
513 
514 	initparams(&p);
515 	suppress_output();
516 	parseargs(&p, argc, argv);
517 
518 	ck_assert_int_eq(cfg.listfivemins, 1234);
519 	ck_assert_int_eq(cfg.listhours, 1234);
520 	ck_assert_int_eq(cfg.listdays, 1234);
521 	ck_assert_int_eq(cfg.listmonths, 1234);
522 	ck_assert_int_eq(cfg.listyears, 1234);
523 	ck_assert_int_eq(cfg.listtop, 1234);
524 	ck_assert_int_eq(cfg.listjsonxml, 1234);
525 }
526 END_TEST
527 
START_TEST(vnstat_parseargs_limit_overrides)528 START_TEST(vnstat_parseargs_limit_overrides)
529 {
530 	PARAMS p;
531 	char *argv[] = {"vnstat", "-d", "5", "--limit", "234", NULL};
532 	int argc = sizeof(argv) / sizeof(char *) - 1;
533 
534 	initparams(&p);
535 	suppress_output();
536 	parseargs(&p, argc, argv);
537 
538 	ck_assert_int_eq(cfg.listfivemins, 234);
539 	ck_assert_int_eq(cfg.listhours, 234);
540 	ck_assert_int_eq(cfg.listdays, 234);
541 	ck_assert_int_eq(cfg.listmonths, 234);
542 	ck_assert_int_eq(cfg.listyears, 234);
543 	ck_assert_int_eq(cfg.listtop, 234);
544 	ck_assert_int_eq(cfg.listjsonxml, 234);
545 }
546 END_TEST
547 
START_TEST(vnstat_parseargs_limit_overrides_regardless_of_position)548 START_TEST(vnstat_parseargs_limit_overrides_regardless_of_position)
549 {
550 	PARAMS p;
551 	char *argv[] = {"vnstat", "--limit", "345", "-d", "5", NULL};
552 	int argc = sizeof(argv) / sizeof(char *) - 1;
553 
554 	initparams(&p);
555 	suppress_output();
556 	parseargs(&p, argc, argv);
557 
558 	ck_assert_int_eq(cfg.listfivemins, 345);
559 	ck_assert_int_eq(cfg.listhours, 345);
560 	ck_assert_int_eq(cfg.listdays, 345);
561 	ck_assert_int_eq(cfg.listmonths, 345);
562 	ck_assert_int_eq(cfg.listyears, 345);
563 	ck_assert_int_eq(cfg.listtop, 345);
564 	ck_assert_int_eq(cfg.listjsonxml, 345);
565 }
566 END_TEST
567 
START_TEST(vnstat_parseargs_iflist_gives_help)568 START_TEST(vnstat_parseargs_iflist_gives_help)
569 {
570 	PARAMS p;
571 	char *argv[] = {"vnstat", "--iflist", "--help", NULL};
572 	int argc = sizeof(argv) / sizeof(char *) - 1;
573 
574 	initparams(&p);
575 	suppress_output();
576 	parseargs(&p, argc, argv);
577 }
578 END_TEST
579 
START_TEST(vnstat_parseargs_iflist_without_parameters_and_no_interfaces)580 START_TEST(vnstat_parseargs_iflist_without_parameters_and_no_interfaces)
581 {
582 	PARAMS p;
583 	char *argv[] = {"vnstat", "--iflist", NULL};
584 	int argc = sizeof(argv) / sizeof(char *) - 1;
585 
586 	initparams(&p);
587 	remove_directory(TESTDIR);
588 	suppress_output();
589 	parseargs(&p, argc, argv);
590 }
591 END_TEST
592 
START_TEST(vnstat_parseargs_iflist_without_parameters_and_only_lo)593 START_TEST(vnstat_parseargs_iflist_without_parameters_and_only_lo)
594 {
595 	PARAMS p;
596 	char *argv[] = {"vnstat", "--iflist", NULL};
597 	int argc = sizeof(argv) / sizeof(char *) - 1;
598 
599 	initparams(&p);
600 	fake_proc_net_dev("w", "lo", 0, 0, 0, 0);
601 	suppress_output();
602 	parseargs(&p, argc, argv);
603 }
604 END_TEST
605 
START_TEST(vnstat_parseargs_iflist_without_parameters)606 START_TEST(vnstat_parseargs_iflist_without_parameters)
607 {
608 	PARAMS p;
609 	char *argv[] = {"vnstat", "--iflist", NULL};
610 	int argc = sizeof(argv) / sizeof(char *) - 1;
611 
612 	initparams(&p);
613 	fake_proc_net_dev("w", "ethsomething", 0, 0, 0, 0);
614 	fake_proc_net_dev("a", "ethanything", 0, 0, 0, 0);
615 	suppress_output();
616 	parseargs(&p, argc, argv);
617 }
618 END_TEST
619 
START_TEST(vnstat_parseargs_iflist_with_verbose_mode)620 START_TEST(vnstat_parseargs_iflist_with_verbose_mode)
621 {
622 	PARAMS p;
623 	char *argv[] = {"vnstat", "--iflist", "0", NULL};
624 	int argc = sizeof(argv) / sizeof(char *) - 1;
625 
626 	initparams(&p);
627 	fake_proc_net_dev("w", "ethsomething", 0, 0, 0, 0);
628 	fake_proc_net_dev("a", "ethanything", 0, 0, 0, 0);
629 	suppress_output();
630 	parseargs(&p, argc, argv);
631 }
632 END_TEST
633 
START_TEST(vnstat_parseargs_iflist_with_parseable_mode)634 START_TEST(vnstat_parseargs_iflist_with_parseable_mode)
635 {
636 	PARAMS p;
637 	char *argv[] = {"vnstat", "--iflist", "1", NULL};
638 	int argc = sizeof(argv) / sizeof(char *) - 1;
639 
640 	initparams(&p);
641 	fake_proc_net_dev("w", "ethsomething", 0, 0, 0, 0);
642 	fake_proc_net_dev("a", "ethanything", 0, 0, 0, 0);
643 	suppress_output();
644 	parseargs(&p, argc, argv);
645 }
646 END_TEST
647 
START_TEST(vnstat_parseargs_dbiflist_gives_help)648 START_TEST(vnstat_parseargs_dbiflist_gives_help)
649 {
650 	PARAMS p;
651 	char *argv[] = {"vnstat", "--dbiflist", "unknown", NULL};
652 	int argc = sizeof(argv) / sizeof(char *) - 1;
653 
654 	initparams(&p);
655 	suppress_output();
656 	parseargs(&p, argc, argv);
657 }
658 END_TEST
659 
START_TEST(vnstat_parseargs_dbiflist_with_no_database)660 START_TEST(vnstat_parseargs_dbiflist_with_no_database)
661 {
662 	PARAMS p;
663 	char *argv[] = {"vnstat", "--dbiflist", NULL};
664 	int argc = sizeof(argv) / sizeof(char *) - 1;
665 
666 	initparams(&p);
667 	suppress_output();
668 	parseargs(&p, argc, argv);
669 }
670 END_TEST
671 
START_TEST(vnstat_parseargs_dbiflist_without_parameters_and_no_interfaces)672 START_TEST(vnstat_parseargs_dbiflist_without_parameters_and_no_interfaces)
673 {
674 	int ret;
675 	PARAMS p;
676 	char *argv[] = {"vnstat", "--dbiflist", NULL};
677 	int argc = sizeof(argv) / sizeof(char *) - 1;
678 
679 	initparams(&p);
680 	ret = db_open_rw(1);
681 	ck_assert_int_eq(ret, 1);
682 	suppress_output();
683 	parseargs(&p, argc, argv);
684 	ret = db_close();
685 	ck_assert_int_eq(ret, 1);
686 }
687 END_TEST
688 
START_TEST(vnstat_parseargs_dbiflist_without_parameters)689 START_TEST(vnstat_parseargs_dbiflist_without_parameters)
690 {
691 	int ret;
692 	PARAMS p;
693 	char *argv[] = {"vnstat", "--dbiflist", NULL};
694 	int argc = sizeof(argv) / sizeof(char *) - 1;
695 
696 	initparams(&p);
697 	ret = db_open_rw(1);
698 	ck_assert_int_eq(ret, 1);
699 	ret = db_addinterface("etheverything");
700 	ck_assert_int_eq(ret, 1);
701 	ret = db_addinterface("ethnothing");
702 	ck_assert_int_eq(ret, 1);
703 	suppress_output();
704 	parseargs(&p, argc, argv);
705 	ret = db_close();
706 	ck_assert_int_eq(ret, 1);
707 }
708 END_TEST
709 
START_TEST(vnstat_parseargs_dbiflist_with_verbose_mode)710 START_TEST(vnstat_parseargs_dbiflist_with_verbose_mode)
711 {
712 	int ret;
713 	PARAMS p;
714 	char *argv[] = {"vnstat", "--dbiflist", "0", NULL};
715 	int argc = sizeof(argv) / sizeof(char *) - 1;
716 
717 	initparams(&p);
718 	ret = db_open_rw(1);
719 	ck_assert_int_eq(ret, 1);
720 	ret = db_addinterface("etheverything");
721 	ck_assert_int_eq(ret, 1);
722 	ret = db_addinterface("ethnothing");
723 	ck_assert_int_eq(ret, 1);
724 	suppress_output();
725 	parseargs(&p, argc, argv);
726 	ret = db_close();
727 	ck_assert_int_eq(ret, 1);
728 }
729 END_TEST
730 
START_TEST(vnstat_parseargs_dbiflist_with_parseable_mode)731 START_TEST(vnstat_parseargs_dbiflist_with_parseable_mode)
732 {
733 	int ret;
734 	PARAMS p;
735 	char *argv[] = {"vnstat", "--dbiflist", "1", NULL};
736 	int argc = sizeof(argv) / sizeof(char *) - 1;
737 
738 	initparams(&p);
739 	ret = db_open_rw(1);
740 	ck_assert_int_eq(ret, 1);
741 	ret = db_addinterface("etheverything");
742 	ck_assert_int_eq(ret, 1);
743 	ret = db_addinterface("ethnothing");
744 	ck_assert_int_eq(ret, 1);
745 	suppress_output();
746 	parseargs(&p, argc, argv);
747 	ret = db_close();
748 	ck_assert_int_eq(ret, 1);
749 }
750 END_TEST
751 
START_TEST(vnstat_parseargs_can_select_interface_without_parameter)752 START_TEST(vnstat_parseargs_can_select_interface_without_parameter)
753 {
754 	PARAMS p;
755 	char *argv[] = {"vnstat", "ethsomething", NULL};
756 	int argc = sizeof(argv) / sizeof(char *) - 1;
757 
758 	defaultcfg();
759 	initparams(&p);
760 	suppress_output();
761 	parseargs(&p, argc, argv);
762 	ck_assert_str_eq(p.interface, "ethsomething");
763 	ck_assert_int_eq(p.defaultiface, 0);
764 }
765 END_TEST
766 
START_TEST(vnstat_parseargs_can_select_interface_without_parameter_even_if_there_are_other_parameters)767 START_TEST(vnstat_parseargs_can_select_interface_without_parameter_even_if_there_are_other_parameters)
768 {
769 	PARAMS p;
770 	char *argv[] = {"vnstat", "-d", "ethsomethingtoo", NULL};
771 	int argc = sizeof(argv) / sizeof(char *) - 1;
772 
773 	defaultcfg();
774 	initparams(&p);
775 	suppress_output();
776 	ck_assert_int_ne(cfg.qmode, 1);
777 	parseargs(&p, argc, argv);
778 	ck_assert_str_eq(p.interface, "ethsomethingtoo");
779 	ck_assert_int_eq(p.defaultiface, 0);
780 	ck_assert_int_eq(cfg.qmode, 1);
781 }
782 END_TEST
783 
START_TEST(vnstat_parseargs_can_select_interface_without_parameter_from_the_middle_of_the_parameter_list)784 START_TEST(vnstat_parseargs_can_select_interface_without_parameter_from_the_middle_of_the_parameter_list)
785 {
786 	PARAMS p;
787 	char *argv[] = {"vnstat", "-m", "ethsomethings", "-ru", NULL};
788 	int argc = sizeof(argv) / sizeof(char *) - 1;
789 
790 	defaultcfg();
791 	initparams(&p);
792 	suppress_output();
793 	debug = 1;
794 	ck_assert_int_ne(cfg.qmode, 2);
795 	parseargs(&p, argc, argv);
796 	ck_assert_str_eq(p.interface, "ethsomethings");
797 	ck_assert_int_eq(p.defaultiface, 0);
798 	ck_assert_int_eq(cfg.qmode, 2);
799 }
800 END_TEST
801 
START_TEST(vnstat_parseargs_knows_when_interface_name_is_too_long_even_without_parameter)802 START_TEST(vnstat_parseargs_knows_when_interface_name_is_too_long_even_without_parameter)
803 {
804 	PARAMS p;
805 	char *argv[] = {"vnstat", "ethethethethethethethethethetheth", NULL};
806 	int argc = sizeof(argv) / sizeof(char *) - 1;
807 
808 	defaultcfg();
809 	initparams(&p);
810 	suppress_output();
811 	parseargs(&p, argc, argv);
812 	ck_assert_int_eq(p.defaultiface, 1);
813 }
814 END_TEST
815 
add_parseargs_tests(Suite * s)816 void add_parseargs_tests(Suite *s)
817 {
818 	TCase *tc_pa = tcase_create("ParseArgs");
819 	tcase_add_checked_fixture(tc_pa, setup, teardown);
820 	tcase_add_unchecked_fixture(tc_pa, setup, teardown);
821 	tcase_add_test(tc_pa, vnstat_parseargs_does_nothing_without_args);
822 	tcase_add_exit_test(tc_pa, vnstat_parseargs_can_help, 0);
823 	tcase_add_exit_test(tc_pa, vnstat_parseargs_can_longhelp, 0);
824 	tcase_add_exit_test(tc_pa, vnstat_parseargs_can_show_version, 0);
825 	tcase_add_exit_test(tc_pa, vnstat_parseargs_detects_unknown_parameters, 1);
826 	tcase_add_test(tc_pa, vnstat_parseargs_can_modify_settings);
827 	tcase_add_exit_test(tc_pa, vnstat_parseargs_does_not_allow_too_long_interface_names, 1);
828 	tcase_add_exit_test(tc_pa, vnstat_parseargs_style_requires_parameter, 1);
829 	tcase_add_exit_test(tc_pa, vnstat_parseargs_style_checks_parameter, 1);
830 	tcase_add_exit_test(tc_pa, vnstat_parseargs_knows_that_update_is_not_supported, 1);
831 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbdir_requires_a_directory, 1);
832 	tcase_add_exit_test(tc_pa, vnstat_parseargs_oneline_gives_help, 1);
833 	tcase_add_exit_test(tc_pa, vnstat_parseargs_xml_gives_help, 1);
834 	tcase_add_test(tc_pa, vnstat_parseargs_xml_without_extra_params);
835 	tcase_add_test(tc_pa, vnstat_parseargs_xml_with_mode);
836 	tcase_add_test(tc_pa, vnstat_parseargs_xml_with_limit);
837 	tcase_add_test(tc_pa, vnstat_parseargs_xml_with_mode_and_limit);
838 	tcase_add_exit_test(tc_pa, vnstat_parseargs_json_gives_help, 1);
839 	tcase_add_test(tc_pa, vnstat_parseargs_json_without_extra_params);
840 	tcase_add_test(tc_pa, vnstat_parseargs_json_with_mode);
841 	tcase_add_test(tc_pa, vnstat_parseargs_json_with_limit);
842 	tcase_add_test(tc_pa, vnstat_parseargs_json_with_mode_and_limit);
843 	tcase_add_exit_test(tc_pa, vnstat_parseargs_rateunit_gives_help, 1);
844 	tcase_add_exit_test(tc_pa, vnstat_parseargs_live_gives_help, 1);
845 	tcase_add_exit_test(tc_pa, vnstat_parseargs_begin_gives_help, 1);
846 	tcase_add_exit_test(tc_pa, vnstat_parseargs_end_gives_help, 1);
847 	tcase_add_exit_test(tc_pa, vnstat_parseargs_begin_validates_input, 1);
848 	tcase_add_exit_test(tc_pa, vnstat_parseargs_end_validates_input, 1);
849 	tcase_add_exit_test(tc_pa, vnstat_parseargs_can_show_config, 0);
850 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iface_requires_parameter, 1);
851 	tcase_add_exit_test(tc_pa, vnstat_parseargs_locale_requires_parameter, 1);
852 	tcase_add_exit_test(tc_pa, vnstat_parseargs_setalias_requires_parameter, 1);
853 	tcase_add_test(tc_pa, vnstat_parseargs_setalias_still_supports_nick);
854 	tcase_add_exit_test(tc_pa, vnstat_parseargs_rename_requires_parameter, 1);
855 	tcase_add_exit_test(tc_pa, vnstat_parseargs_limit_requires_parameter, 1);
856 	tcase_add_exit_test(tc_pa, vnstat_parseargs_limit_cannot_be_negative, 1);
857 	tcase_add_test(tc_pa, vnstat_parseargs_limit_changes_defaults);
858 	tcase_add_test(tc_pa, vnstat_parseargs_limit_overrides);
859 	tcase_add_test(tc_pa, vnstat_parseargs_limit_overrides_regardless_of_position);
860 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_gives_help, 1);
861 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_without_parameters_and_no_interfaces, 1);
862 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_without_parameters_and_only_lo, 0);
863 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_without_parameters, 0);
864 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_with_verbose_mode, 0);
865 	tcase_add_exit_test(tc_pa, vnstat_parseargs_iflist_with_parseable_mode, 0);
866 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_gives_help, 1);
867 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_with_no_database, 1);
868 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_without_parameters_and_no_interfaces, 0);
869 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_without_parameters, 0);
870 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_with_verbose_mode, 0);
871 	tcase_add_exit_test(tc_pa, vnstat_parseargs_dbiflist_with_parseable_mode, 0);
872 	tcase_add_test(tc_pa, vnstat_parseargs_can_select_interface_without_parameter);
873 	tcase_add_test(tc_pa, vnstat_parseargs_can_select_interface_without_parameter_even_if_there_are_other_parameters);
874 	tcase_add_test(tc_pa, vnstat_parseargs_can_select_interface_without_parameter_from_the_middle_of_the_parameter_list);
875 	tcase_add_exit_test(tc_pa, vnstat_parseargs_knows_when_interface_name_is_too_long_even_without_parameter, 1);
876 	suite_add_tcase(s, tc_pa);
877 }
878