1 #include "common.h"
2 #include "vnstat_tests.h"
3 #include "vnstat_func.h"
4 #include "cfg.h"
5 #include "dbsql.h"
6 #include "cli_tests.h"
7 
START_TEST(vnstat_can_init_params)8 START_TEST(vnstat_can_init_params)
9 {
10 	PARAMS p;
11 
12 	initparams(&p);
13 }
14 END_TEST
15 
START_TEST(vnstat_showhelp_does_not_crash)16 START_TEST(vnstat_showhelp_does_not_crash)
17 {
18 	PARAMS p;
19 
20 	initparams(&p);
21 	strncpy_nt(p.definterface, "ethgone", 32);
22 	suppress_output();
23 	showhelp(&p);
24 }
25 END_TEST
26 
START_TEST(vnstat_showlonghelp_does_not_crash)27 START_TEST(vnstat_showlonghelp_does_not_crash)
28 {
29 	PARAMS p;
30 
31 	initparams(&p);
32 	strncpy_nt(p.definterface, "ethgone", 32);
33 	suppress_output();
34 	showlonghelp(&p);
35 }
36 END_TEST
37 
START_TEST(vnstat_handlers_do_nothing_by_default)38 START_TEST(vnstat_handlers_do_nothing_by_default)
39 {
40 	PARAMS p, b;
41 
42 	initparams(&p);
43 	memcpy(&b, &p, sizeof(PARAMS));
44 	handleremoveinterface(&p);
45 	handlerenameinterface(&p);
46 	handleaddinterface(&p);
47 	handlesetalias(&p);
48 	handletrafficmeters(&p);
49 	ck_assert_int_eq(memcmp(&p, &b, sizeof(PARAMS)), 0);
50 }
51 END_TEST
52 
START_TEST(vnstat_handletrafficmeters_exists_when_interface_is_not_available)53 START_TEST(vnstat_handletrafficmeters_exists_when_interface_is_not_available)
54 {
55 	PARAMS p;
56 
57 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
58 	initparams(&p);
59 	strncpy_nt(cfg.iface, "ethfoo", 32);
60 	strncpy_nt(p.interface, "default", 32);
61 	strncpy_nt(p.definterface, cfg.iface, 32);
62 	p.livetraffic = 1;
63 	suppress_output();
64 
65 	handletrafficmeters(&p);
66 }
67 END_TEST
68 
START_TEST(vnstat_handleremoveinterface_exits_if_no_interface_has_been_specified)69 START_TEST(vnstat_handleremoveinterface_exits_if_no_interface_has_been_specified)
70 {
71 	PARAMS p;
72 	initparams(&p);
73 	p.removeiface = 1;
74 
75 	suppress_output();
76 	handleremoveinterface(&p);
77 }
78 END_TEST
79 
START_TEST(vnstat_handleremoveinterface_exits_if_given_interface_does_not_exist)80 START_TEST(vnstat_handleremoveinterface_exits_if_given_interface_does_not_exist)
81 {
82 	int ret;
83 	PARAMS p;
84 
85 	initparams(&p);
86 	p.removeiface = 1;
87 	p.defaultiface = 0;
88 	strncpy_nt(p.interface, "unknown", 32);
89 
90 	ret = db_open_rw(1);
91 	ck_assert_int_eq(ret, 1);
92 
93 	ret = db_addinterface("known");
94 	ck_assert_int_eq(ret, 1);
95 
96 	suppress_output();
97 	handleremoveinterface(&p);
98 }
99 END_TEST
100 
START_TEST(vnstat_handleremoveinterface_exits_if_force_is_not_used)101 START_TEST(vnstat_handleremoveinterface_exits_if_force_is_not_used)
102 {
103 	int ret;
104 	PARAMS p;
105 
106 	initparams(&p);
107 	p.removeiface = 1;
108 	p.defaultiface = 0;
109 	p.force = 0;
110 	strncpy_nt(p.interface, "known", 32);
111 
112 	ret = db_open_rw(1);
113 	ck_assert_int_eq(ret, 1);
114 
115 	ret = db_addinterface("known");
116 	ck_assert_int_eq(ret, 1);
117 
118 	suppress_output();
119 	handleremoveinterface(&p);
120 }
121 END_TEST
122 
START_TEST(vnstat_handleremoveinterface_removes_interface)123 START_TEST(vnstat_handleremoveinterface_removes_interface)
124 {
125 	int ret;
126 	PARAMS p;
127 
128 	initparams(&p);
129 	p.removeiface = 1;
130 	p.defaultiface = 0;
131 	p.force = 1;
132 	strncpy_nt(p.interface, "known", 32);
133 
134 	ret = db_open_rw(1);
135 	ck_assert_int_eq(ret, 1);
136 
137 	ret = db_addinterface("known");
138 	ck_assert_int_eq(ret, 1);
139 
140 	ret = (int)db_getinterfacecountbyname("known");
141 	ck_assert_int_eq(ret, 1);
142 
143 	suppress_output();
144 	handleremoveinterface(&p);
145 
146 	ret = (int)db_getinterfacecountbyname("known");
147 	ck_assert_int_eq(ret, 0);
148 }
149 END_TEST
150 
START_TEST(vnstat_handlerenameinterface_exits_if_no_interface_has_been_specified)151 START_TEST(vnstat_handlerenameinterface_exits_if_no_interface_has_been_specified)
152 {
153 	PARAMS p;
154 	initparams(&p);
155 	p.renameiface = 1;
156 
157 	suppress_output();
158 	handlerenameinterface(&p);
159 }
160 END_TEST
161 
START_TEST(vnstat_handlerenameinterface_exits_if_new_interface_name_is_not_given)162 START_TEST(vnstat_handlerenameinterface_exits_if_new_interface_name_is_not_given)
163 {
164 	PARAMS p;
165 	initparams(&p);
166 	p.renameiface = 1;
167 	p.defaultiface = 0;
168 
169 	suppress_output();
170 	handlerenameinterface(&p);
171 }
172 END_TEST
173 
START_TEST(vnstat_handlerenameinterface_exits_if_given_interface_does_not_exist)174 START_TEST(vnstat_handlerenameinterface_exits_if_given_interface_does_not_exist)
175 {
176 	int ret;
177 	PARAMS p;
178 
179 	initparams(&p);
180 	p.renameiface = 1;
181 	p.defaultiface = 0;
182 	strncpy_nt(p.interface, "oldname", 32);
183 	strncpy_nt(p.newifname, "newname", 32);
184 
185 	ret = db_open_rw(1);
186 	ck_assert_int_eq(ret, 1);
187 
188 	ret = db_addinterface("somename");
189 	ck_assert_int_eq(ret, 1);
190 
191 	suppress_output();
192 	handlerenameinterface(&p);
193 }
194 END_TEST
195 
START_TEST(vnstat_handlerenameinterface_exits_if_new_interface_name_already_exist)196 START_TEST(vnstat_handlerenameinterface_exits_if_new_interface_name_already_exist)
197 {
198 	int ret;
199 	PARAMS p;
200 
201 	initparams(&p);
202 	p.renameiface = 1;
203 	p.defaultiface = 0;
204 	strncpy_nt(p.interface, "oldname", 32);
205 	strncpy_nt(p.newifname, "newname", 32);
206 
207 	ret = db_open_rw(1);
208 	ck_assert_int_eq(ret, 1);
209 
210 	ret = db_addinterface("oldname");
211 	ck_assert_int_eq(ret, 1);
212 
213 	ret = db_addinterface("newname");
214 	ck_assert_int_eq(ret, 1);
215 
216 	suppress_output();
217 	handlerenameinterface(&p);
218 }
219 END_TEST
220 
START_TEST(vnstat_handlerenameinterface_exits_if_force_is_not_used)221 START_TEST(vnstat_handlerenameinterface_exits_if_force_is_not_used)
222 {
223 	int ret;
224 	PARAMS p;
225 
226 	initparams(&p);
227 
228 	p.renameiface = 1;
229 	p.defaultiface = 0;
230 	p.force = 0;
231 	strncpy_nt(p.interface, "oldname", 32);
232 	strncpy_nt(p.newifname, "newname", 32);
233 
234 	ret = db_open_rw(1);
235 	ck_assert_int_eq(ret, 1);
236 
237 	ret = db_addinterface("oldname");
238 	ck_assert_int_eq(ret, 1);
239 
240 	suppress_output();
241 	handlerenameinterface(&p);
242 }
243 END_TEST
244 
START_TEST(vnstat_handlerenameinterface_renames_interface)245 START_TEST(vnstat_handlerenameinterface_renames_interface)
246 {
247 	int ret;
248 	PARAMS p;
249 
250 	initparams(&p);
251 	p.renameiface = 1;
252 	p.defaultiface = 0;
253 	p.force = 1;
254 	strncpy_nt(p.interface, "oldname", 32);
255 	strncpy_nt(p.newifname, "newname", 32);
256 
257 	ret = db_open_rw(1);
258 	ck_assert_int_eq(ret, 1);
259 
260 	ret = db_addinterface("oldname");
261 	ck_assert_int_eq(ret, 1);
262 
263 	ret = (int)db_getinterfacecountbyname("oldname");
264 	ck_assert_int_eq(ret, 1);
265 
266 	ret = (int)db_getinterfacecountbyname("newname");
267 	ck_assert_int_eq(ret, 0);
268 
269 	suppress_output();
270 	handlerenameinterface(&p);
271 
272 	ret = (int)db_getinterfacecountbyname("oldname");
273 	ck_assert_int_eq(ret, 0);
274 
275 	ret = (int)db_getinterfacecountbyname("newname");
276 	ck_assert_int_eq(ret, 1);
277 }
278 END_TEST
279 
START_TEST(vnstat_handleaddinterface_exits_if_no_interface_has_been_specified)280 START_TEST(vnstat_handleaddinterface_exits_if_no_interface_has_been_specified)
281 {
282 	PARAMS p;
283 	initparams(&p);
284 	p.addiface = 1;
285 
286 	suppress_output();
287 	handleaddinterface(&p);
288 }
289 END_TEST
290 
START_TEST(vnstat_handleaddinterface_exits_if_interface_already_exist_in_database)291 START_TEST(vnstat_handleaddinterface_exits_if_interface_already_exist_in_database)
292 {
293 	int ret;
294 	PARAMS p;
295 
296 	initparams(&p);
297 	p.addiface = 1;
298 	p.defaultiface = 0;
299 	strncpy_nt(p.interface, "newiface", 32);
300 
301 	ret = db_open_rw(1);
302 	ck_assert_int_eq(ret, 1);
303 
304 	ret = db_addinterface("newiface");
305 	ck_assert_int_eq(ret, 1);
306 
307 	suppress_output();
308 	handleaddinterface(&p);
309 }
310 END_TEST
311 
START_TEST(vnstat_handleaddinterface_exits_if_interface_does_not_exist)312 START_TEST(vnstat_handleaddinterface_exits_if_interface_does_not_exist)
313 {
314 	int ret;
315 	PARAMS p;
316 
317 	initparams(&p);
318 	p.addiface = 1;
319 	p.defaultiface = 0;
320 	strncpy_nt(p.interface, "newiface", 32);
321 
322 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
323 	fake_proc_net_dev("w", "notnewiface", 0, 0, 0, 0);
324 
325 	ret = db_open_rw(1);
326 	ck_assert_int_eq(ret, 1);
327 
328 	suppress_output();
329 	handleaddinterface(&p);
330 }
331 END_TEST
332 
START_TEST(vnstat_handleaddinterface_adds_interface)333 START_TEST(vnstat_handleaddinterface_adds_interface)
334 {
335 	int ret;
336 	PARAMS p;
337 
338 	initparams(&p);
339 	p.addiface = 1;
340 	p.defaultiface = 0;
341 	cfg.spacecheck = 0;
342 	strncpy_nt(p.interface, "newiface", 32);
343 
344 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
345 	fake_proc_net_dev("w", "newiface", 0, 0, 0, 0);
346 
347 	ret = db_open_rw(1);
348 	ck_assert_int_eq(ret, 1);
349 
350 	ret = (int)db_getinterfacecountbyname("newiface");
351 	ck_assert_int_eq(ret, 0);
352 
353 	suppress_output();
354 	handleaddinterface(&p);
355 
356 	ret = (int)db_getinterfacecountbyname("newiface");
357 	ck_assert_int_eq(ret, 1);
358 }
359 END_TEST
360 
START_TEST(vnstat_handleaddinterface_can_be_forced_to_add_interface_that_does_not_exist)361 START_TEST(vnstat_handleaddinterface_can_be_forced_to_add_interface_that_does_not_exist)
362 {
363 	int ret;
364 	PARAMS p;
365 
366 	initparams(&p);
367 	p.addiface = 1;
368 	p.defaultiface = 0;
369 	p.force = 1;
370 	cfg.spacecheck = 0;
371 	strncpy_nt(p.interface, "newiface", 32);
372 
373 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
374 	fake_proc_net_dev("w", "notnewiface", 0, 0, 0, 0);
375 
376 	ret = db_open_rw(1);
377 	ck_assert_int_eq(ret, 1);
378 
379 	ret = (int)db_getinterfacecountbyname("newiface");
380 	ck_assert_int_eq(ret, 0);
381 
382 	suppress_output();
383 	handleaddinterface(&p);
384 
385 	ret = (int)db_getinterfacecountbyname("newiface");
386 	ck_assert_int_eq(ret, 1);
387 }
388 END_TEST
389 
START_TEST(vnstat_handlesetalias_exits_if_no_interface_has_been_specified)390 START_TEST(vnstat_handlesetalias_exits_if_no_interface_has_been_specified)
391 {
392 	PARAMS p;
393 	initparams(&p);
394 	p.setalias = 1;
395 
396 	suppress_output();
397 	handlesetalias(&p);
398 }
399 END_TEST
400 
START_TEST(vnstat_handlesetalias_exits_if_given_interface_does_not_exist)401 START_TEST(vnstat_handlesetalias_exits_if_given_interface_does_not_exist)
402 {
403 	int ret;
404 	PARAMS p;
405 	initparams(&p);
406 	p.setalias = 1;
407 	p.defaultiface = 0;
408 	strncpy_nt(p.interface, "ethiface", 32);
409 
410 	ret = db_open_rw(1);
411 	ck_assert_int_eq(ret, 1);
412 
413 	ret = db_addinterface("somename");
414 	ck_assert_int_eq(ret, 1);
415 
416 	suppress_output();
417 	handlesetalias(&p);
418 }
419 END_TEST
420 
START_TEST(vnstat_handlesetalias_sets_alias)421 START_TEST(vnstat_handlesetalias_sets_alias)
422 {
423 	int ret;
424 	PARAMS p;
425 	interfaceinfo info;
426 	initparams(&p);
427 	p.setalias = 1;
428 	p.defaultiface = 0;
429 	strncpy_nt(p.interface, "ethiface", 32);
430 	strncpy_nt(p.alias, "The Internet", 32);
431 
432 	ret = db_open_rw(1);
433 	ck_assert_int_eq(ret, 1);
434 
435 	ret = db_addinterface("ethiface");
436 	ck_assert_int_eq(ret, 1);
437 
438 	ret = db_getinterfaceinfo("ethiface", &info);
439 	ck_assert_int_eq(ret, 1);
440 	ck_assert_str_eq(info.alias, "");
441 
442 	suppress_output();
443 	handlesetalias(&p);
444 
445 	ret = db_getinterfaceinfo("ethiface", &info);
446 	ck_assert_int_eq(ret, 1);
447 	ck_assert_str_eq(info.alias, "The Internet");
448 }
449 END_TEST
450 
START_TEST(vnstat_handlesetalias_clears_alias)451 START_TEST(vnstat_handlesetalias_clears_alias)
452 {
453 	int ret;
454 	PARAMS p;
455 	interfaceinfo info;
456 	initparams(&p);
457 	p.setalias = 1;
458 	p.defaultiface = 0;
459 	strncpy_nt(p.interface, "ethiface", 32);
460 	strncpy_nt(p.alias, "", 32);
461 
462 	ret = db_open_rw(1);
463 	ck_assert_int_eq(ret, 1);
464 
465 	ret = db_addinterface("ethiface");
466 	ck_assert_int_eq(ret, 1);
467 
468 	ret = db_setalias("ethiface", "Local network");
469 	ck_assert_int_eq(ret, 1);
470 
471 	ret = db_getinterfaceinfo("ethiface", &info);
472 	ck_assert_int_eq(ret, 1);
473 	ck_assert_str_eq(info.alias, "Local network");
474 
475 	suppress_output();
476 	handlesetalias(&p);
477 
478 	ret = db_getinterfaceinfo("ethiface", &info);
479 	ck_assert_int_eq(ret, 1);
480 	ck_assert_str_eq(info.alias, "");
481 }
482 END_TEST
483 
START_TEST(vnstat_handleaddinterface_can_also_set_alias_after_adding_interface)484 START_TEST(vnstat_handleaddinterface_can_also_set_alias_after_adding_interface)
485 {
486 	int ret;
487 	PARAMS p;
488 	interfaceinfo info;
489 
490 	initparams(&p);
491 	p.addiface = 1;
492 	p.setalias = 1;
493 	p.defaultiface = 0;
494 	cfg.spacecheck = 0;
495 	strncpy_nt(p.interface, "newiface", 32);
496 	strncpy_nt(p.alias, "The Interface", 32);
497 
498 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
499 	fake_proc_net_dev("w", "newiface", 0, 0, 0, 0);
500 
501 	ret = db_open_rw(1);
502 	ck_assert_int_eq(ret, 1);
503 
504 	ret = (int)db_getinterfacecountbyname("newiface");
505 	ck_assert_int_eq(ret, 0);
506 
507 	suppress_output();
508 	handleaddinterface(&p);
509 
510 	ret = (int)db_getinterfacecountbyname("newiface");
511 	ck_assert_int_eq(ret, 1);
512 
513 	ret = db_getinterfaceinfo("newiface", &info);
514 	ck_assert_int_eq(ret, 1);
515 	ck_assert_str_eq(info.alias, "The Interface");
516 }
517 END_TEST
518 
START_TEST(vnstat_handletrafficmeters_exits_when_interface_is_not_available)519 START_TEST(vnstat_handletrafficmeters_exits_when_interface_is_not_available)
520 {
521 	PARAMS p;
522 	initparams(&p);
523 	p.traffic = 1;
524 	p.defaultiface = 1;
525 	strncpy_nt(p.interface, "someiface", 32);
526 
527 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
528 	fake_proc_net_dev("w", "otheriface", 0, 0, 0, 0);
529 
530 	suppress_output();
531 	handletrafficmeters(&p);
532 }
533 END_TEST
534 
START_TEST(vnstat_handletrafficmeters_exits_when_interface_is_not_available_with_configuration_tips)535 START_TEST(vnstat_handletrafficmeters_exits_when_interface_is_not_available_with_configuration_tips)
536 {
537 	PARAMS p;
538 	initparams(&p);
539 	p.traffic = 1;
540 	p.defaultiface = 1;
541 	strncpy_nt(p.interface, "someiface", 32);
542 	strncpy_nt(cfg.cfgfile, "I_do_not_have_a_config_file_here.something", 512);
543 
544 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
545 	fake_proc_net_dev("w", "otheriface", 0, 0, 0, 0);
546 
547 	suppress_output();
548 	handletrafficmeters(&p);
549 }
550 END_TEST
551 
START_TEST(vnstat_handletrafficmeters_exits_when_specific_interface_is_not_available)552 START_TEST(vnstat_handletrafficmeters_exits_when_specific_interface_is_not_available)
553 {
554 	PARAMS p;
555 	initparams(&p);
556 	p.traffic = 1;
557 	p.defaultiface = 0;
558 	strncpy_nt(p.interface, "someiface", 32);
559 
560 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
561 	fake_proc_net_dev("w", "otheriface", 0, 0, 0, 0);
562 
563 	suppress_output();
564 	handletrafficmeters(&p);
565 }
566 END_TEST
567 
START_TEST(vnstat_handletrafficmeters_can_calculate_traffic)568 START_TEST(vnstat_handletrafficmeters_can_calculate_traffic)
569 {
570 	PARAMS p;
571 	initparams(&p);
572 	p.traffic = 1;
573 	p.defaultiface = 0;
574 	cfg.qmode = 1;
575 	cfg.sampletime = 0;
576 	strncpy_nt(p.interface, "someiface", 32);
577 
578 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
579 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
580 
581 	suppress_output();
582 	handletrafficmeters(&p);
583 }
584 END_TEST
585 
START_TEST(vnstat_handletrafficmeters_can_handle_interface_merge_using_first_interface)586 START_TEST(vnstat_handletrafficmeters_can_handle_interface_merge_using_first_interface)
587 {
588 	PARAMS p;
589 	initparams(&p);
590 	p.traffic = 1;
591 	p.defaultiface = 0;
592 	cfg.qmode = 1;
593 	cfg.sampletime = 0;
594 	strncpy_nt(p.interface, "someiface+anotherinterface", 32);
595 
596 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
597 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
598 
599 	suppress_output();
600 	handletrafficmeters(&p);
601 }
602 END_TEST
603 
START_TEST(vnstat_handletrafficmeters_can_calculate_traffic_and_output_json)604 START_TEST(vnstat_handletrafficmeters_can_calculate_traffic_and_output_json)
605 {
606 	PARAMS p;
607 	initparams(&p);
608 	p.traffic = 1;
609 	p.defaultiface = 0;
610 	cfg.qmode = 10;
611 	cfg.sampletime = 0;
612 	strncpy_nt(p.interface, "someiface", 32);
613 
614 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
615 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
616 
617 	suppress_output();
618 	handletrafficmeters(&p);
619 }
620 END_TEST
621 
START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash)622 START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash)
623 {
624 	PARAMS p;
625 	initparams(&p);
626 	p.livetraffic = 1;
627 	p.defaultiface = 0;
628 	cfg.qmode = 1;
629 	cfg.ostyle = 0;
630 	cfg.sampletime = 0;
631 	strncpy_nt(p.interface, "someiface", 32);
632 
633 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
634 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
635 
636 	suppress_output();
637 	handletrafficmeters(&p);
638 }
639 END_TEST
640 
START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash_with_interface_merge)641 START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash_with_interface_merge)
642 {
643 	PARAMS p;
644 	initparams(&p);
645 	p.livetraffic = 1;
646 	p.defaultiface = 0;
647 	cfg.qmode = 1;
648 	cfg.ostyle = 0;
649 	cfg.sampletime = 0;
650 	strncpy_nt(p.interface, "someiface+anotherinterface", 32);
651 
652 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
653 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
654 
655 	suppress_output();
656 	handletrafficmeters(&p);
657 }
658 END_TEST
659 
START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash_with_json)660 START_TEST(vnstat_handletrafficmeters_livetraffic_does_not_crash_with_json)
661 {
662 	PARAMS p;
663 	initparams(&p);
664 	p.livetraffic = 1;
665 	p.defaultiface = 0;
666 	cfg.qmode = 10;
667 	cfg.sampletime = 0;
668 	strncpy_nt(p.interface, "someiface", 32);
669 
670 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
671 	fake_proc_net_dev("w", "someiface", 0, 0, 0, 0);
672 
673 	suppress_output();
674 	handletrafficmeters(&p);
675 }
676 END_TEST
677 
START_TEST(handleifselection_does_nothing_when_interface_has_already_been_selected)678 START_TEST(handleifselection_does_nothing_when_interface_has_already_been_selected)
679 {
680 	PARAMS p;
681 	initparams(&p);
682 
683 	p.defaultiface = 0;
684 	strncpy_nt(p.interface, "myiface", 32);
685 
686 	handleifselection(&p);
687 
688 	ck_assert_str_eq(p.interface, "myiface");
689 }
690 END_TEST
691 
START_TEST(handleifselection_selects_default_interface_if_field_is_filled)692 START_TEST(handleifselection_selects_default_interface_if_field_is_filled)
693 {
694 	PARAMS p;
695 	initparams(&p);
696 
697 	p.defaultiface = 1;
698 	strncpy_nt(p.interface, "default", 32);
699 	strncpy_nt(p.definterface, "myiface", 32);
700 
701 	handleifselection(&p);
702 
703 	ck_assert_str_eq(p.interface, "myiface");
704 	ck_assert_str_eq(p.definterface, "myiface");
705 }
706 END_TEST
707 
START_TEST(handleifselection_exits_when_no_suitable_interface_is_available_for_query)708 START_TEST(handleifselection_exits_when_no_suitable_interface_is_available_for_query)
709 {
710 	int ret;
711 	PARAMS p;
712 	initparams(&p);
713 
714 	p.defaultiface = 1;
715 	p.query = 1;
716 	strncpy_nt(p.interface, "default", 32);
717 
718 	ret = db_open_rw(1);
719 	ck_assert_int_eq(ret, 1);
720 
721 	/* no interfaces added to database */
722 
723 	suppress_output();
724 	handleifselection(&p);
725 }
726 END_TEST
727 
START_TEST(handleifselection_selects_only_interface_from_database_for_query)728 START_TEST(handleifselection_selects_only_interface_from_database_for_query)
729 {
730 	int ret;
731 	PARAMS p;
732 	initparams(&p);
733 
734 	p.defaultiface = 1;
735 	p.query = 1;
736 	strncpy_nt(p.interface, "default", 32);
737 
738 	ret = db_open_rw(1);
739 	ck_assert_int_eq(ret, 1);
740 
741 	ret = db_addinterface("lettherebemagic");
742 	ck_assert_int_eq(ret, 1);
743 
744 	handleifselection(&p);
745 
746 	ck_assert_str_eq(p.interface, "lettherebemagic");
747 }
748 END_TEST
749 
START_TEST(handleifselection_selects_highest_traffic_interface_from_database_for_query)750 START_TEST(handleifselection_selects_highest_traffic_interface_from_database_for_query)
751 {
752 	int ret;
753 	PARAMS p;
754 	initparams(&p);
755 
756 	p.defaultiface = 1;
757 	p.query = 1;
758 	strncpy_nt(p.interface, "default", 32);
759 
760 	ret = db_open_rw(1);
761 	ck_assert_int_eq(ret, 1);
762 
763 	ret = db_addinterface("ethslow");
764 	ck_assert_int_eq(ret, 1);
765 
766 	ret = db_addinterface("ethfast");
767 	ck_assert_int_eq(ret, 1);
768 
769 	ret = db_addinterface("ethone");
770 	ck_assert_int_eq(ret, 1);
771 
772 	ret = db_settotal("ethslow", 100, 200);
773 	ck_assert_int_eq(ret, 1);
774 
775 	ret = db_settotal("ethfast", 80, 9001);
776 	ck_assert_int_eq(ret, 1);
777 
778 	ret = db_settotal("ethone", 1, 1);
779 	ck_assert_int_eq(ret, 1);
780 
781 	handleifselection(&p);
782 
783 	/* interface with most traffic in database is selected */
784 	ck_assert_str_eq(p.interface, "ethfast");
785 }
786 END_TEST
787 
START_TEST(handleifselection_exits_when_no_suitable_interface_is_available_for_traffic)788 START_TEST(handleifselection_exits_when_no_suitable_interface_is_available_for_traffic)
789 {
790 	PARAMS p;
791 	initparams(&p);
792 
793 	p.defaultiface = 1;
794 	p.query = 0;
795 	p.traffic = 1;
796 	strncpy_nt(p.interface, "default", 32);
797 
798 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
799 
800 	/* database not available and interface listing provides nothing */
801 
802 	suppress_output();
803 	handleifselection(&p);
804 }
805 END_TEST
806 
START_TEST(handleifselection_can_select_interface_without_database_for_traffic)807 START_TEST(handleifselection_can_select_interface_without_database_for_traffic)
808 {
809 	PARAMS p;
810 	initparams(&p);
811 
812 	p.defaultiface = 1;
813 	p.query = 0;
814 	p.traffic = 1;
815 	strncpy_nt(p.interface, "default", 32);
816 
817 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
818 	fake_proc_net_dev("w", "firstinterface", 0, 0, 0, 0);
819 	fake_proc_net_dev("a", "secondinterface", 0, 0, 0, 0);
820 
821 	suppress_output();
822 	handleifselection(&p);
823 
824 	/* first available interface is selected */
825 	ck_assert_str_eq(p.interface, "firstinterface");
826 }
827 END_TEST
828 
START_TEST(handleifselection_exits_if_only_database_shows_interfaces_for_traffic)829 START_TEST(handleifselection_exits_if_only_database_shows_interfaces_for_traffic)
830 {
831 	int ret;
832 	PARAMS p;
833 	initparams(&p);
834 
835 	p.defaultiface = 1;
836 	p.query = 0;
837 	p.traffic = 1;
838 	strncpy_nt(p.interface, "default", 32);
839 
840 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
841 
842 	ret = db_open_rw(1);
843 	ck_assert_int_eq(ret, 1);
844 
845 	ret = db_addinterface("ethsomething");
846 	ck_assert_int_eq(ret, 1);
847 
848 	ret = db_addinterface("ethnothing");
849 	ck_assert_int_eq(ret, 1);
850 
851 	suppress_output();
852 	handleifselection(&p);
853 }
854 END_TEST
855 
START_TEST(handleifselection_selects_only_available_interfaces_for_traffic)856 START_TEST(handleifselection_selects_only_available_interfaces_for_traffic)
857 {
858 	int ret;
859 	PARAMS p;
860 	initparams(&p);
861 
862 	p.defaultiface = 1;
863 	p.query = 0;
864 	p.traffic = 1;
865 	strncpy_nt(p.interface, "default", 32);
866 
867 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
868 	fake_proc_net_dev("w", "ethnone", 0, 0, 0, 0);
869 	fake_proc_net_dev("a", "ethslow", 0, 0, 0, 0);
870 
871 	ret = db_open_rw(1);
872 	ck_assert_int_eq(ret, 1);
873 
874 	ret = db_addinterface("ethslow");
875 	ck_assert_int_eq(ret, 1);
876 
877 	ret = db_addinterface("ethfast");
878 	ck_assert_int_eq(ret, 1);
879 
880 	ret = db_settotal("ethslow", 100, 200);
881 	ck_assert_int_eq(ret, 1);
882 
883 	ret = db_settotal("ethfast", 80, 9001);
884 	ck_assert_int_eq(ret, 1);
885 
886 	handleifselection(&p);
887 
888 	/* interface with most traffic in database the is also available is selected */
889 	ck_assert_str_eq(p.interface, "ethslow");
890 }
891 END_TEST
892 
START_TEST(handleifselection_selects_only_available_interfaces_and_can_ignore_database_for_traffic)893 START_TEST(handleifselection_selects_only_available_interfaces_and_can_ignore_database_for_traffic)
894 {
895 	int ret;
896 	PARAMS p;
897 	initparams(&p);
898 
899 	p.defaultiface = 1;
900 	p.query = 0;
901 	p.traffic = 1;
902 	strncpy_nt(p.interface, "default", 32);
903 
904 	ck_assert_int_eq(remove_directory(TESTDIR), 1);
905 	fake_proc_net_dev("w", "ethnone", 0, 0, 0, 0);
906 	fake_proc_net_dev("a", "ethall", 0, 0, 0, 0);
907 
908 	ret = db_open_rw(1);
909 	ck_assert_int_eq(ret, 1);
910 
911 	ret = db_addinterface("ethslow");
912 	ck_assert_int_eq(ret, 1);
913 
914 	ret = db_addinterface("ethfast");
915 	ck_assert_int_eq(ret, 1);
916 
917 	ret = db_settotal("ethslow", 100, 200);
918 	ck_assert_int_eq(ret, 1);
919 
920 	ret = db_settotal("ethfast", 80, 9001);
921 	ck_assert_int_eq(ret, 1);
922 
923 	handleifselection(&p);
924 
925 	/* first available interface is selected if none of the interfaces in database are available */
926 	ck_assert_str_eq(p.interface, "ethnone");
927 }
928 END_TEST
929 
add_cli_tests(Suite * s)930 void add_cli_tests(Suite *s)
931 {
932 	TCase *tc_cli = tcase_create("CLI");
933 	tcase_add_checked_fixture(tc_cli, setup, teardown);
934 	tcase_add_unchecked_fixture(tc_cli, setup, teardown);
935 	tcase_add_test(tc_cli, vnstat_can_init_params);
936 	tcase_add_test(tc_cli, vnstat_showhelp_does_not_crash);
937 	tcase_add_test(tc_cli, vnstat_showlonghelp_does_not_crash);
938 	tcase_add_test(tc_cli, vnstat_handlers_do_nothing_by_default);
939 	tcase_add_exit_test(tc_cli, vnstat_handletrafficmeters_exists_when_interface_is_not_available, 1);
940 	tcase_add_exit_test(tc_cli, vnstat_handleremoveinterface_exits_if_no_interface_has_been_specified, 1);
941 	tcase_add_exit_test(tc_cli, vnstat_handleremoveinterface_exits_if_given_interface_does_not_exist, 1);
942 	tcase_add_exit_test(tc_cli, vnstat_handleremoveinterface_exits_if_force_is_not_used, 1);
943 	tcase_add_test(tc_cli, vnstat_handleremoveinterface_removes_interface);
944 	tcase_add_exit_test(tc_cli, vnstat_handlerenameinterface_exits_if_no_interface_has_been_specified, 1);
945 	tcase_add_exit_test(tc_cli, vnstat_handlerenameinterface_exits_if_new_interface_name_is_not_given, 1);
946 	tcase_add_exit_test(tc_cli, vnstat_handlerenameinterface_exits_if_given_interface_does_not_exist, 1);
947 	tcase_add_exit_test(tc_cli, vnstat_handlerenameinterface_exits_if_new_interface_name_already_exist, 1);
948 	tcase_add_exit_test(tc_cli, vnstat_handlerenameinterface_exits_if_force_is_not_used, 1);
949 	tcase_add_test(tc_cli, vnstat_handlerenameinterface_renames_interface);
950 	tcase_add_exit_test(tc_cli, vnstat_handleaddinterface_exits_if_no_interface_has_been_specified, 1);
951 	tcase_add_exit_test(tc_cli, vnstat_handleaddinterface_exits_if_interface_already_exist_in_database, 1);
952 	tcase_add_exit_test(tc_cli, vnstat_handleaddinterface_exits_if_interface_does_not_exist, 1);
953 	tcase_add_test(tc_cli, vnstat_handleaddinterface_adds_interface);
954 	tcase_add_test(tc_cli, vnstat_handleaddinterface_can_be_forced_to_add_interface_that_does_not_exist);
955 	tcase_add_exit_test(tc_cli, vnstat_handlesetalias_exits_if_no_interface_has_been_specified, 1);
956 	tcase_add_exit_test(tc_cli, vnstat_handlesetalias_exits_if_given_interface_does_not_exist, 1);
957 	tcase_add_test(tc_cli, vnstat_handlesetalias_sets_alias);
958 	tcase_add_test(tc_cli, vnstat_handlesetalias_clears_alias);
959 	tcase_add_test(tc_cli, vnstat_handleaddinterface_can_also_set_alias_after_adding_interface);
960 	tcase_add_exit_test(tc_cli, vnstat_handletrafficmeters_exits_when_interface_is_not_available, 1);
961 	tcase_add_exit_test(tc_cli, vnstat_handletrafficmeters_exits_when_interface_is_not_available_with_configuration_tips, 1);
962 	tcase_add_exit_test(tc_cli, vnstat_handletrafficmeters_exits_when_specific_interface_is_not_available, 1);
963 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_can_calculate_traffic);
964 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_can_handle_interface_merge_using_first_interface);
965 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_can_calculate_traffic_and_output_json);
966 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_livetraffic_does_not_crash);
967 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_livetraffic_does_not_crash_with_interface_merge);
968 	tcase_add_test(tc_cli, vnstat_handletrafficmeters_livetraffic_does_not_crash_with_json);
969 	tcase_add_test(tc_cli, handleifselection_does_nothing_when_interface_has_already_been_selected);
970 	tcase_add_test(tc_cli, handleifselection_selects_default_interface_if_field_is_filled);
971 	tcase_add_exit_test(tc_cli, handleifselection_exits_when_no_suitable_interface_is_available_for_query, 1);
972 	tcase_add_test(tc_cli, handleifselection_selects_only_interface_from_database_for_query);
973 	tcase_add_test(tc_cli, handleifselection_selects_highest_traffic_interface_from_database_for_query);
974 	tcase_add_exit_test(tc_cli, handleifselection_exits_when_no_suitable_interface_is_available_for_traffic, 1);
975 	tcase_add_test(tc_cli, handleifselection_can_select_interface_without_database_for_traffic);
976 	tcase_add_exit_test(tc_cli, handleifselection_exits_if_only_database_shows_interfaces_for_traffic, 1);
977 	tcase_add_test(tc_cli, handleifselection_selects_only_available_interfaces_for_traffic);
978 	tcase_add_test(tc_cli, handleifselection_selects_only_available_interfaces_and_can_ignore_database_for_traffic);
979 	suite_add_tcase(s, tc_cli);
980 }
981