1 /* vi: set sw=4 ts=4: */
2 /*
3  * bbunit: Simple unit-testing framework for Busybox.
4  *
5  * Copyright (C) 2014 by Bartosz Golaszewski <bartekgola@gmail.com>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9 //applet:IF_UNIT_TEST(APPLET(unit, BB_DIR_USR_BIN, BB_SUID_DROP))
10 
11 //kbuild:lib-$(CONFIG_UNIT_TEST) += bbunit.o
12 
13 //usage:#define unit_trivial_usage
14 //usage:       ""
15 //usage:#define unit_full_usage "\n\n"
16 //usage:       "Run the unit-test suite"
17 
18 #include "libbb.h"
19 
20 static llist_t *tests = NULL;
21 static unsigned tests_registered = 0;
22 static int test_retval;
23 
bbunit_registertest(struct bbunit_listelem * test)24 void bbunit_registertest(struct bbunit_listelem *test)
25 {
26 	llist_add_to_end(&tests, test);
27 	tests_registered++;
28 }
29 
bbunit_settestfailed(void)30 void bbunit_settestfailed(void)
31 {
32 	test_retval = -1;
33 }
34 
35 int unit_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) MAIN_EXTERNALLY_VISIBLE;
unit_main(int argc UNUSED_PARAM,char ** argv UNUSED_PARAM)36 int unit_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
37 {
38 	unsigned tests_run = 0;
39 	unsigned tests_failed = 0;
40 
41 	bb_error_msg("Running %d test(s)...", tests_registered);
42 	for (;;) {
43 		struct bbunit_listelem* el = llist_pop(&tests);
44 		if (!el)
45 			break;
46 
47 		bb_error_msg("Case: [%s]", el->name);
48 		test_retval = 0;
49 		el->testfunc();
50 
51 		if (test_retval < 0) {
52 			bb_error_msg("[ERROR] [%s]: TEST FAILED", el->name);
53 			tests_failed++;
54 		}
55 		tests_run++;
56 	}
57 
58 	if (tests_failed > 0) {
59 		bb_error_msg("[ERROR] %u test(s) FAILED", tests_failed);
60 		return EXIT_FAILURE;
61 	}
62 
63 	bb_simple_error_msg("All tests passed");
64 	return EXIT_SUCCESS;
65 }
66