1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington/* test-main.c  main() for make check
3d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
4d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * Copyright (C) 2003 Red Hat, Inc.
5d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
7d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
8d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * This program is free software; you can redistribute it and/or modify
9d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * it under the terms of the GNU General Public License as published by
10d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
11d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * (at your option) any later version.
12d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
13d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * This program is distributed in the hope that it will be useful,
14d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
15d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * GNU General Public License for more details.
17d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
18d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * You should have received a copy of the GNU General Public License
19d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington * along with this program; if not, write to the Free Software
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington *
22d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington */
23d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
25d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington#include "test.h"
263bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include <stdio.h>
273bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include <stdlib.h>
283bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include <dbus/dbus-string.h>
293bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include <dbus/dbus-sysdeps.h>
30c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#include <dbus/dbus-internals.h>
314299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat#include <dbus/dbus-message-internal.h>
321e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington#include "selinux.h"
333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
3477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#ifdef DBUS_BUILD_TESTS
353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtondie (const char *failure)
373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  fprintf (stderr, "Unit test failed: %s\n", failure);
393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  exit (1);
403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
41d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington
42269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtonstatic void
43269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtoncheck_memleaks (const char *name)
44269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington{
45269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington  dbus_shutdown ();
46269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington
47269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington  printf ("%s: checking for memleaks\n", name);
48269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington  if (_dbus_get_malloc_blocks_outstanding () != 0)
49269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington    {
50269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington      _dbus_warn ("%d dbus_malloc blocks were not freed\n",
51269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington                  _dbus_get_malloc_blocks_outstanding ());
52269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington      die ("memleaks");
53269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington    }
54269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington}
5577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#endif /* DBUS_BUILD_TESTS */
56269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington
574299eb3c0907100fe95d2986984b48d40cc52841Daniel Eratstatic DBusInitialFDs *initial_fds = NULL;
584299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
59ee78f2800f2642b4fff962b736296d87a7f12a17Colin Waltersstatic void
60ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walterstest_pre_hook (void)
61ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters{
62ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters
6373ffe59d87864d61b9d22f199fc6375840bf39bbColin Walters  if (_dbus_getenv ("DBUS_TEST_SELINUX")
649b6814a59b359d237ec5b59d7983ddfd443c89d9Colin Walters      && (!bus_selinux_pre_init ()
659b6814a59b359d237ec5b59d7983ddfd443c89d9Colin Walters	  || !bus_selinux_full_init ()))
66ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters    die ("could not init selinux support");
674299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
684299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  initial_fds = _dbus_check_fdleaks_enter ();
69ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters}
70ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters
71ee78f2800f2642b4fff962b736296d87a7f12a17Colin Waltersstatic char *progname = "";
724299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
73ee78f2800f2642b4fff962b736296d87a7f12a17Colin Waltersstatic void
74ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walterstest_post_hook (void)
75ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters{
76ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters  if (_dbus_getenv ("DBUS_TEST_SELINUX"))
77ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters    bus_selinux_shutdown ();
78ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters  check_memleaks (progname);
794299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
804299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  _dbus_check_fdleaks_leave (initial_fds);
814299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  initial_fds = NULL;
82ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters}
83ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters
84d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Penningtonint
85d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Penningtonmain (int argc, char **argv)
86d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington{
87d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington#ifdef DBUS_BUILD_TESTS
883bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  const char *dir;
894299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  const char *only;
903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  DBusString test_data_dir;
913bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
92ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters  progname = argv[0];
93ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters
943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (argc > 1)
953bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    dir = argv[1];
963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  else
973bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    dir = _dbus_getenv ("DBUS_TEST_DATA");
983bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
994299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (argc > 2)
1004299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    only = argv[2];
1014299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  else
1024299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    only = NULL;
1034299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1043bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (dir == NULL)
10529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
10629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      fprintf (stderr, "Must specify test data directory as argv[1] or in DBUS_TEST_DATA env variable\n");
10729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return 1;
10829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
109d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington
1103bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  _dbus_string_init_const (&test_data_dir, dir);
111bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington
112bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington  if (!_dbus_threads_init_debug ())
113bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington    die ("initializing debug threads");
1144299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1154299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "expire-list") == 0)
1164299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1174299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1184299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running expire list test\n", argv[0]);
1194299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_expire_list_test (&test_data_dir))
1204299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("expire list");
1214299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1224299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
1234299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1244299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "config-parser") == 0)
1254299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1264299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1274299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running config file parser test\n", argv[0]);
1284299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_config_parser_test (&test_data_dir))
1294299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("parser");
1304299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1314299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
1324299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1334299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "signals") == 0)
1344299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1354299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1364299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running signals test\n", argv[0]);
1374299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_signals_test (&test_data_dir))
1384299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("signals");
1394299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1404299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
1414299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1424299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "dispatch-sha1") == 0)
1434299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1444299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1454299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running SHA1 connection test\n", argv[0]);
1464299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_dispatch_sha1_test (&test_data_dir))
1474299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("sha1");
1484299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1494299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
1504299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1514299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "dispatch") == 0)
1524299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1534299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1544299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running message dispatch test\n", argv[0]);
1554299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_dispatch_test (&test_data_dir))
1564299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("dispatch");
1574299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1584299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
1594299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat
1604299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "activation-service-reload") == 0)
1614299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1624299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1634299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running service files reloading test\n", argv[0]);
1644299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_activation_service_reload_test (&test_data_dir))
1654299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("service reload");
1664299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1674299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
168dd79fc73f08574698c18c6a35dc309d5ef33fde0Mikael Hallendal
169004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#ifdef HAVE_UNIX_FD_PASSING
1704299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat  if (only == NULL || strcmp (only, "unix-fds-passing") == 0)
1714299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    {
1724299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_pre_hook ();
1734299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      printf ("%s: Running unix fd passing test\n", argv[0]);
1744299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      if (!bus_unix_fds_passing_test (&test_data_dir))
1754299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat        die ("unix fd passing");
1764299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat      test_post_hook ();
1774299eb3c0907100fe95d2986984b48d40cc52841Daniel Erat    }
178004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#endif
179004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
1801fbf6fa49c90010f3f255f60944920ef8908701cHavoc Pennington  printf ("%s: Success\n", argv[0]);
1811e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
182d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington
183d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington  return 0;
184d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington#else /* DBUS_BUILD_TESTS */
1854c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
1864c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  printf ("Not compiled with test support\n");
1874c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
188d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington  return 0;
189d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington#endif
190d65b73884cb876276b6bd73f4b1dfcd920984a8aHavoc Pennington}
191