bus: Assign a serial number for messages from the driver
[platform/upstream/dbus.git] / bus / test-main.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* test-main.c  main() for make check
3  *
4  * Copyright (C) 2003 Red Hat, Inc.
5  *
6  * Licensed under the Academic Free License version 2.1
7  * 
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  */
23
24 #include <config.h>
25 #include "test.h"
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <dbus/dbus-string.h>
29 #include <dbus/dbus-sysdeps.h>
30 #include <dbus/dbus-internals.h>
31 #include <dbus/dbus-message-internal.h>
32 #include "selinux.h"
33
34 #ifndef DBUS_ENABLE_EMBEDDED_TESTS
35 #error This file is only relevant for the embedded tests
36 #endif
37
38 #ifdef DBUS_UNIX
39 # include <dbus/dbus-sysdeps-unix.h>
40 #endif
41
42 static void die (const char *failure) _DBUS_GNUC_NORETURN;
43
44 static void
45 die (const char *failure)
46 {
47   fprintf (stderr, "Unit test failed: %s\n", failure);
48   exit (1);
49 }
50
51 static void
52 check_memleaks (const char *name)
53 {
54   dbus_shutdown ();
55   
56   printf ("%s: checking for memleaks\n", name);
57   if (_dbus_get_malloc_blocks_outstanding () != 0)
58     {
59       _dbus_warn ("%d dbus_malloc blocks were not freed",
60                   _dbus_get_malloc_blocks_outstanding ());
61       die ("memleaks");
62     }
63 }
64
65 static DBusInitialFDs *initial_fds = NULL;
66
67 static void
68 test_pre_hook (void)
69 {
70   
71   if (_dbus_getenv ("DBUS_TEST_SELINUX")
72       && (!bus_selinux_pre_init ()
73           || !bus_selinux_full_init ()))
74     die ("could not init selinux support");
75
76   initial_fds = _dbus_check_fdleaks_enter ();
77 }
78
79 static const char *progname = "";
80
81 static void
82 test_post_hook (void)
83 {
84   if (_dbus_getenv ("DBUS_TEST_SELINUX"))
85     bus_selinux_shutdown ();
86   check_memleaks (progname);
87
88   _dbus_check_fdleaks_leave (initial_fds);
89   initial_fds = NULL;
90 }
91
92 int
93 main (int argc, char **argv)
94 {
95   const char *dir;
96   const char *only;
97   DBusString test_data_dir;
98
99   progname = argv[0];
100
101   if (argc > 1 && strcmp (argv[1], "--tap") != 0)
102     dir = argv[1];
103   else
104     dir = _dbus_getenv ("DBUS_TEST_DATA");
105
106   if (argc > 2)
107     only = argv[2];
108   else
109     only = NULL;
110
111   if (dir == NULL)
112     {
113       fprintf (stderr, "Must specify test data directory as argv[1] or in DBUS_TEST_DATA env variable\n");
114       return 1;
115     }
116
117   _dbus_string_init_const (&test_data_dir, dir);
118
119 #ifdef DBUS_UNIX
120   /* close any inherited fds so dbus-spawn's check for close-on-exec works */
121   _dbus_close_all ();
122 #endif
123
124   if (!_dbus_threads_init_debug ())
125     die ("initializing debug threads");
126
127   if (only == NULL || strcmp (only, "expire-list") == 0)
128     {
129       test_pre_hook ();
130       printf ("%s: Running expire list test\n", argv[0]);
131       if (!bus_expire_list_test (&test_data_dir))
132         die ("expire list");
133       test_post_hook ();
134     }
135
136   if (only == NULL || strcmp (only, "config-parser") == 0)
137     {
138       test_pre_hook ();
139       printf ("%s: Running config file parser test\n", argv[0]);
140       if (!bus_config_parser_test (&test_data_dir))
141         die ("parser");
142       test_post_hook ();
143     }
144
145   if (only == NULL || strcmp (only, "signals") == 0)
146     {
147       test_pre_hook ();
148       printf ("%s: Running signals test\n", argv[0]);
149       if (!bus_signals_test (&test_data_dir))
150         die ("signals");
151       test_post_hook ();
152     }
153
154   if (only == NULL || strcmp (only, "dispatch-sha1") == 0)
155     {
156       test_pre_hook ();
157       printf ("%s: Running SHA1 connection test\n", argv[0]);
158       if (!bus_dispatch_sha1_test (&test_data_dir))
159         die ("sha1");
160       test_post_hook ();
161     }
162
163   if (only == NULL || strcmp (only, "dispatch") == 0)
164     {
165       test_pre_hook ();
166       printf ("%s: Running message dispatch test\n", argv[0]);
167       if (!bus_dispatch_test (&test_data_dir)) 
168         die ("dispatch");
169       test_post_hook ();
170     }
171
172   if (only == NULL || strcmp (only, "activation-service-reload") == 0)
173     {
174       test_pre_hook ();
175       printf ("%s: Running service files reloading test\n", argv[0]);
176       if (!bus_activation_service_reload_test (&test_data_dir))
177         die ("service reload");
178       test_post_hook ();
179     }
180
181 #ifdef HAVE_UNIX_FD_PASSING
182   if (only == NULL || strcmp (only, "unix-fds-passing") == 0)
183     {
184       test_pre_hook ();
185       printf ("%s: Running unix fd passing test\n", argv[0]);
186       if (!bus_unix_fds_passing_test (&test_data_dir))
187         die ("unix fd passing");
188       test_post_hook ();
189     }
190 #endif
191
192   printf ("%s: Success\n", argv[0]);
193
194   
195   return 0;
196 }