1 #include <stdlib.h>
2 #include <glib.h>
3 #include <gmodule.h>
4 #include <check.h>
5 #include <locale.h>
6 #include <sys/time.h>
7 #include "bitlbee.h"
8 #include "testsuite.h"
9 
10 global_t global;        /* Against global namespace pollution */
11 
g_io_channel_pair(GIOChannel ** ch1,GIOChannel ** ch2)12 gboolean g_io_channel_pair(GIOChannel **ch1, GIOChannel **ch2)
13 {
14 	int sock[2];
15 
16 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sock) < 0) {
17 		perror("socketpair");
18 		return FALSE;
19 	}
20 
21 	*ch1 = g_io_channel_unix_new(sock[0]);
22 	*ch2 = g_io_channel_unix_new(sock[1]);
23 	return TRUE;
24 }
25 
torture_irc(void)26 irc_t *torture_irc(void)
27 {
28 	irc_t *irc;
29 	GIOChannel *ch1, *ch2;
30 
31 	if (!g_io_channel_pair(&ch1, &ch2)) {
32 		return NULL;
33 	}
34 	irc = irc_new(g_io_channel_unix_get_fd(ch1));
35 	return irc;
36 }
37 
gettime()38 double gettime()
39 {
40 	struct timeval time[1];
41 
42 	gettimeofday(time, 0);
43 	return((double) time->tv_sec + (double) time->tv_usec / 1000000);
44 }
45 
sighandler_shutdown_setup()46 void sighandler_shutdown_setup()
47 {
48 	/* no-op. originally defined in unix.c, needed by bitlbee.c */
49 }
50 
51 /* From check_util.c */
52 Suite *util_suite(void);
53 
54 /* From check_nick.c */
55 Suite *nick_suite(void);
56 
57 /* From check_md5.c */
58 Suite *md5_suite(void);
59 
60 /* From check_arc.c */
61 Suite *arc_suite(void);
62 
63 /* From check_irc.c */
64 Suite *irc_suite(void);
65 
66 /* From check_help.c */
67 Suite *help_suite(void);
68 
69 /* From check_user.c */
70 Suite *user_suite(void);
71 
72 /* From check_set.c */
73 Suite *set_suite(void);
74 
75 /* From check_jabber_sasl.c */
76 Suite *jabber_sasl_suite(void);
77 
78 /* From check_jabber_sasl.c */
79 Suite *jabber_util_suite(void);
80 
main(int argc,char ** argv)81 int main(int argc, char **argv)
82 {
83 	int nf;
84 	SRunner *sr;
85 	GOptionContext *pc;
86 	gboolean no_fork = FALSE;
87 	gboolean verbose = FALSE;
88 	GOptionEntry options[] = {
89 		{ "no-fork", 'n', 0, G_OPTION_ARG_NONE, &no_fork, "Don't fork" },
90 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL },
91 		{ NULL }
92 	};
93 
94 	pc = g_option_context_new("");
95 	g_option_context_add_main_entries(pc, options, NULL);
96 
97 	if (!g_option_context_parse(pc, &argc, &argv, NULL)) {
98 		return 1;
99 	}
100 
101 	g_option_context_free(pc);
102 
103 	log_init();
104 	b_main_init();
105 	setlocale(LC_CTYPE, "");
106 
107 	if (verbose) {
108 		log_link(LOGLVL_ERROR, LOGOUTPUT_CONSOLE);
109 #ifdef DEBUG
110 		log_link(LOGLVL_DEBUG, LOGOUTPUT_CONSOLE);
111 #endif
112 		log_link(LOGLVL_INFO, LOGOUTPUT_CONSOLE);
113 		log_link(LOGLVL_WARNING, LOGOUTPUT_CONSOLE);
114 	}
115 
116 	global.conf = conf_load(0, NULL);
117 	global.conf->runmode = RUNMODE_DAEMON;
118 
119 	sr = srunner_create(util_suite());
120 	srunner_add_suite(sr, nick_suite());
121 	srunner_add_suite(sr, md5_suite());
122 	srunner_add_suite(sr, arc_suite());
123 	srunner_add_suite(sr, irc_suite());
124 	srunner_add_suite(sr, help_suite());
125 	srunner_add_suite(sr, user_suite());
126 	srunner_add_suite(sr, set_suite());
127 	srunner_add_suite(sr, jabber_sasl_suite());
128 	srunner_add_suite(sr, jabber_util_suite());
129 	if (no_fork) {
130 		srunner_set_fork_status(sr, CK_NOFORK);
131 	}
132 	srunner_run_all(sr, verbose ? CK_VERBOSE : CK_NORMAL);
133 	nf = srunner_ntests_failed(sr);
134 	srunner_free(sr);
135 	return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
136 }
137