1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson/* dispatch.c  Message dispatcher
339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson *
439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * Copyright (C) 2003  CodeFactory AB
59c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Copyright (C) 2003, 2004, 2005  Red Hat, Inc.
693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * Copyright (C) 2004  Imendio HB
739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson *
843605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
9b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering *
1039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * This program is free software; you can redistribute it and/or modify
1139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * it under the terms of the GNU General Public License as published by
1239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * the Free Software Foundation; either version 2 of the License, or
1339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * (at your option) any later version.
1439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson *
1539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * This program is distributed in the hope that it will be useful,
1639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
1739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * GNU General Public License for more details.
19b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering *
2039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * You should have received a copy of the GNU General Public License
2139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson * along with this program; if not, write to the Free Software
225baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
2339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson *
2439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson */
2539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
26dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
2739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "dispatch.h"
2839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "connection.h"
2939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include "driver.h"
306ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "services.h"
3193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#include "activation.h"
3202dfd4fb3427a6afef6b9b99d39de6248a20e0cbAnders Carlsson#include "utils.h"
336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "bus.h"
34a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
353bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#include "test.h"
3639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <dbus/dbus-internals.h>
3739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson#include <string.h>
3839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
39004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#ifdef HAVE_UNIX_FD_PASSING
40004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#include <dbus/dbus-sysdeps-unix.h>
41004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#include <unistd.h>
42004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#endif
43004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
440ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker#ifndef TEST_CONNECTION
450ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker/*
460ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker TODO autotools:
470ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker  move to build system as already done for cmake
480ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker*/
4973b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#ifdef DBUS_UNIX
5073b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#define TEST_CONNECTION "debug-pipe:name=test-server"
5173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#else
5273b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#define TEST_CONNECTION "tcp:host=localhost,port=1234"
5373b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#endif
540ed7d779b784f30ff9781c0ad47a03af199531a6Ralf Habacker#endif
5573b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker
5629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonstatic dbus_bool_t
57a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonsend_one_message (DBusConnection *connection,
58a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  BusContext     *context,
59a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  DBusConnection *sender,
60a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  DBusConnection *addressed_recipient,
61a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  DBusMessage    *message,
62a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  BusTransaction *transaction,
63a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  DBusError      *error)
6439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
6564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  if (!bus_context_check_security_policy (context, transaction,
66a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                          sender,
67a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                          addressed_recipient,
68777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                          connection,
69a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                          message,
70777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                          NULL))
71777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    return TRUE; /* silently don't send it */
7289f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering
7389f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering  if (dbus_message_contains_unix_fds(message) &&
7489f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering      !dbus_connection_can_send_type(connection, DBUS_TYPE_UNIX_FD))
7589f70b19495e9c3dadbbb7b51ce1629fa22ea3afLennart Poettering    return TRUE; /* silently don't send it */
76b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
77a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_transaction_send (transaction,
78777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                             connection,
79a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             message))
8029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
81a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
8229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
8329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
8429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
8529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  return TRUE;
8639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
8739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
8829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_bool_t
89a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_dispatch_matches (BusTransaction *transaction,
90a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      DBusConnection *sender,
91a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      DBusConnection *addressed_recipient,
92a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      DBusMessage    *message,
93a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      DBusError      *error)
9439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
9529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusError tmp_error;
966ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
97a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusList *recipients;
98a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
99a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusList *link;
100a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusContext *context;
10190ed1d84588a84697051e643175452c50d682eceHavoc Pennington
10290ed1d84588a84697051e643175452c50d682eceHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
103a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
104a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* sender and recipient can both be NULL for the bus driver,
105a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   * or for signals with no particular recipient
106a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
107a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
108a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert (sender == NULL || bus_connection_is_active (sender));
10929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  _dbus_assert (dbus_message_get_sender (message) != NULL);
11029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1113a2753e667e565f18f124b632fe720b70b018d05Will Thompson  context = bus_transaction_get_context (transaction);
1123a2753e667e565f18f124b632fe720b70b018d05Will Thompson
1133a2753e667e565f18f124b632fe720b70b018d05Will Thompson  /* First, send the message to the addressed_recipient, if there is one. */
1143a2753e667e565f18f124b632fe720b70b018d05Will Thompson  if (addressed_recipient != NULL)
1153a2753e667e565f18f124b632fe720b70b018d05Will Thompson    {
1163a2753e667e565f18f124b632fe720b70b018d05Will Thompson      if (!bus_context_check_security_policy (context, transaction,
1173a2753e667e565f18f124b632fe720b70b018d05Will Thompson                                              sender, addressed_recipient,
1183a2753e667e565f18f124b632fe720b70b018d05Will Thompson                                              addressed_recipient,
1193a2753e667e565f18f124b632fe720b70b018d05Will Thompson                                              message, error))
1203a2753e667e565f18f124b632fe720b70b018d05Will Thompson        return FALSE;
1213a2753e667e565f18f124b632fe720b70b018d05Will Thompson
1223a2753e667e565f18f124b632fe720b70b018d05Will Thompson      if (dbus_message_contains_unix_fds (message) &&
1233a2753e667e565f18f124b632fe720b70b018d05Will Thompson          !dbus_connection_can_send_type (addressed_recipient,
1243a2753e667e565f18f124b632fe720b70b018d05Will Thompson                                          DBUS_TYPE_UNIX_FD))
1253a2753e667e565f18f124b632fe720b70b018d05Will Thompson        {
1263a2753e667e565f18f124b632fe720b70b018d05Will Thompson          dbus_set_error (error,
1273a2753e667e565f18f124b632fe720b70b018d05Will Thompson                          DBUS_ERROR_NOT_SUPPORTED,
1283a2753e667e565f18f124b632fe720b70b018d05Will Thompson                          "Tried to send message with Unix file descriptors"
1293a2753e667e565f18f124b632fe720b70b018d05Will Thompson                          "to a client that doesn't support that.");
1303a2753e667e565f18f124b632fe720b70b018d05Will Thompson          return FALSE;
1313a2753e667e565f18f124b632fe720b70b018d05Will Thompson      }
1323a2753e667e565f18f124b632fe720b70b018d05Will Thompson
1333a2753e667e565f18f124b632fe720b70b018d05Will Thompson      /* Dispatch the message */
1343a2753e667e565f18f124b632fe720b70b018d05Will Thompson      if (!bus_transaction_send (transaction, addressed_recipient, message))
1353a2753e667e565f18f124b632fe720b70b018d05Will Thompson        {
1363a2753e667e565f18f124b632fe720b70b018d05Will Thompson          BUS_SET_OOM (error);
1373a2753e667e565f18f124b632fe720b70b018d05Will Thompson          return FALSE;
1383a2753e667e565f18f124b632fe720b70b018d05Will Thompson        }
1393a2753e667e565f18f124b632fe720b70b018d05Will Thompson    }
1403a2753e667e565f18f124b632fe720b70b018d05Will Thompson
1413a2753e667e565f18f124b632fe720b70b018d05Will Thompson  /* Now dispatch to others who look interested in this message */
1426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  connections = bus_transaction_get_connections (transaction);
14329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_error_init (&tmp_error);
144a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  matchmaker = bus_context_get_matchmaker (context);
145a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
146a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  recipients = NULL;
14785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (!bus_matchmaker_get_recipients (matchmaker, connections,
148a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                      sender, addressed_recipient, message,
149a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                      &recipients))
150a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
151a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
152a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return FALSE;
153a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
154a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
155a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  link = _dbus_list_get_first_link (&recipients);
156a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  while (link != NULL)
157a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
158a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      DBusConnection *dest;
159a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
160a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dest = link->data;
161a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
162a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (!send_one_message (dest, context, sender, addressed_recipient,
163a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                             message, transaction, &tmp_error))
164a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        break;
165a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
166a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      link = _dbus_list_get_next_link (&recipients, link);
167a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
169a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_list_clear (&recipients);
170b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
17129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (dbus_error_is_set (&tmp_error))
17229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
17329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_move_error (&tmp_error, error);
17429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      return FALSE;
17529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
17629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
17729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    return TRUE;
17829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
17929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
1801d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Penningtonstatic DBusHandlerResult
1813bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonbus_dispatch (DBusConnection *connection,
1823bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington              DBusMessage    *message)
18339dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
18495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington  const char *sender, *service_name;
18529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  DBusError error;
18629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  BusTransaction *transaction;
1876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context;
1881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  DBusHandlerResult result;
189a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusConnection *addressed_recipient;
190b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1911d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  result = DBUS_HANDLER_RESULT_HANDLED;
192b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  transaction = NULL;
194a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  addressed_recipient = NULL;
19529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_error_init (&error);
196b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context = bus_connection_get_context (connection);
1986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (context != NULL);
199b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* If we can't even allocate an OOM error, we just go to sleep
20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   * until we can.
20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  while (!bus_connection_preallocate_oom_error (connection))
204df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington    _dbus_wait_for_memory ();
205b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
20629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Ref connection in case we disconnect it at some point in here */
20729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_connection_ref (connection);
208b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
209e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington  service_name = dbus_message_get_destination (message);
21029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
21195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE
21295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington  {
21395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington    const char *interface_name, *member_name, *error_name;
21495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington
21595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington    interface_name = dbus_message_get_interface (message);
21695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington    member_name = dbus_message_get_member (message);
21795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington    error_name = dbus_message_get_error_name (message);
218b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
21995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington    _dbus_verbose ("DISPATCH: %s %s %s to %s\n",
22095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                   interface_name ? interface_name : "(no interface)",
22195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                   member_name ? member_name : "(no member)",
22295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                   error_name ? error_name : "(no error name)",
22395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                   service_name ? service_name : "peer");
22495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington  }
22595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington#endif /* DBUS_ENABLE_VERBOSE_MODE */
226b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
227a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* If service_name is NULL, if it's a signal we send it to all
22875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   * connections with a match rule. If it's not a signal, there
22975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   * are some special cases here but mostly we just bail out.
23029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington   */
23129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (service_name == NULL)
232a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
23368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_signal (message,
234248895207dc15914ac7970a6d1431308075dca1dColin Walters                                  DBUS_INTERFACE_LOCAL,
23568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                  "Disconnected"))
236a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
237a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          bus_connection_disconnected (connection);
238a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          goto out;
239a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
24029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
241a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL)
242a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
243a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          /* DBusConnection also handles some of these automatically, we leave
244a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington           * it to do so.
245a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington           */
246a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
247a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          goto out;
248a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
24929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
250b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
25129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Create our transaction */
2526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  transaction = bus_transaction_new (context);
25329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (transaction == NULL)
25429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
25529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      BUS_SET_OOM (&error);
25629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      goto out;
25729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
258b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
25929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  /* Assign a sender to the message */
26029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (bus_connection_is_active (connection))
261fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson    {
26229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      sender = bus_connection_get_name (connection);
26329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      _dbus_assert (sender != NULL);
26473d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson
26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!dbus_message_set_sender (message, sender))
26629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          BUS_SET_OOM (&error);
26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          goto out;
26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
27073d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson
27173d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson      /* We need to refetch the service name here, because
27273d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson       * dbus_message_set_sender can cause the header to be
27373d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson       * reallocated, and thus the service_name pointer will become
27473d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson       * invalid.
27573d7ba1d1339ede5f638e2962e187555aa8c7aa3Anders Carlsson       */
276e8bf15b23a2a9c5b19ef25fb553006a41379bf7cHavoc Pennington      service_name = dbus_message_get_destination (message);
277fe4018941190f8bf020e4a8ed2999c212e0e113dAlexander Larsson    }
278b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
279a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (service_name &&
280248895207dc15914ac7970a6d1431308075dca1dColin Walters      strcmp (service_name, DBUS_SERVICE_DBUS) == 0) /* to bus driver */
28139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    {
28264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington      if (!bus_context_check_security_policy (context, transaction,
283a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                              connection, NULL, NULL, message, &error))
284e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
285e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_verbose ("Security policy rejected message\n");
286e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          goto out;
287e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
288e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
289248895207dc15914ac7970a6d1431308075dca1dColin Walters      _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!bus_driver_handle_message (connection, transaction, message, &error))
291e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        goto out;
29239dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    }
29329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
29439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    {
29539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson      _dbus_verbose ("Received message from non-registered client. Disconnecting.\n");
29611fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J      dbus_connection_close (connection);
297a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto out;
29839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    }
299a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  else if (service_name != NULL) /* route to named service */
30039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    {
301ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson      DBusString service_string;
302ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson      BusService *service;
3036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      BusRegistry *registry;
304ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
305a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_assert (service_name != NULL);
306b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      registry = bus_connection_get_registry (connection);
308b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
309ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson      _dbus_string_init_const (&service_string, service_name);
3106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      service = bus_registry_lookup (registry, &service_string);
311ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
3128873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      if (service == NULL && dbus_message_get_auto_start (message))
31393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
314075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          BusActivation *activation;
315075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          /* We can't do the security policy check here, since the addressed
316075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           * recipient service doesn't exist yet. We do it before sending the
317075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           * message after the service has been created.
318075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           */
319075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          activation = bus_connection_get_activation (connection);
320075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
321075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (!bus_activation_activate_service (activation, connection, transaction, TRUE,
322075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                                message, service_name, &error))
323075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
3240d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu              _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&error);
3255e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin              _dbus_verbose ("bus_activation_activate_service() failed: %s\n", error.name);
326075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
327075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
328b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
329075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
330075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
33193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      else if (service == NULL)
33229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
333777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington          dbus_set_error (&error,
3348873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                          DBUS_ERROR_NAME_HAS_NO_OWNER,
3358873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                          "Name \"%s\" does not exist",
336777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                          service_name);
337777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington          goto out;
33829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
33929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      else
340075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3411a163e765c0d6a86d2aa2ffb18a1d7e29a052e7aJohn (J          addressed_recipient = bus_service_get_primary_owners_connection (service);
342a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          _dbus_assert (addressed_recipient != NULL);
34329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
34429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
345a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
3463a2753e667e565f18f124b632fe720b70b018d05Will Thompson  /* Now send the message to its destination (or not, if
3473a2753e667e565f18f124b632fe720b70b018d05Will Thompson   * addressed_recipient == NULL), and match it against other connections'
3483a2753e667e565f18f124b632fe720b70b018d05Will Thompson   * match rules.
349a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington   */
350a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error))
351a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto out;
352b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
35329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington out:
35429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (dbus_error_is_set (&error))
35529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
35629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      if (!dbus_connection_get_is_connected (connection))
35729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
35829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          /* If we disconnected it, we won't bother to send it any error
35929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington           * messages.
36029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington           */
361e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_verbose ("Not sending error to connection we disconnected\n");
36229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
36329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      else if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
36429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
36529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          bus_connection_send_oom_error (connection, message);
36650137daea3b57a6f862691dad4f412bcc041e9bbAnders Carlsson
36729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          /* cancel transaction due to OOM */
36829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if (transaction != NULL)
36929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            {
37029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington              bus_transaction_cancel_and_free (transaction);
37129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington              transaction = NULL;
37229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            }
37329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
37450137daea3b57a6f862691dad4f412bcc041e9bbAnders Carlsson      else
37529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        {
37629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          /* Try to send the real error, if no mem to do that, send
37729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington           * the OOM error
37829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington           */
37929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          _dbus_assert (transaction != NULL);
38029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington          if (!bus_transaction_send_error_reply (transaction, connection,
38129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                                                 &error, message))
38229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            {
38329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington              bus_connection_send_oom_error (connection, message);
384b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
38529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington              /* cancel transaction due to OOM */
38629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington              if (transaction != NULL)
38729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                {
38829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  bus_transaction_cancel_and_free (transaction);
38929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                  transaction = NULL;
39029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                }
39129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington            }
39229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington        }
393b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
394b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
39529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_free (&error);
39639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson    }
39739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
39829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (transaction != NULL)
39929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
40029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      bus_transaction_execute_and_free (transaction);
40129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
40229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
40329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_connection_unref (connection);
4041d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
4051d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  return result;
4063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
4073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
4083bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic DBusHandlerResult
4091dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Penningtonbus_dispatch_message_filter (DBusConnection     *connection,
4101dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                             DBusMessage        *message,
4111dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                             void               *user_data)
4123bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  return bus_dispatch (connection, message);
41439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
41539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
416ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtondbus_bool_t
417ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonbus_dispatch_add_connection (DBusConnection *connection)
418b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering{
4191dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington  if (!dbus_connection_add_filter (connection,
4201dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                                   bus_dispatch_message_filter,
4211dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                                   NULL, NULL))
422ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    return FALSE;
423b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
42439dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  return TRUE;
42539dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson}
42639dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson
42739dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonvoid
42839dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlssonbus_dispatch_remove_connection (DBusConnection *connection)
42939dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson{
43039dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  /* Here we tell the bus driver that we want to get off. */
43139dd1fcee640b4a5a9abb453a9ccd5b7e099ba1cAnders Carlsson  bus_driver_remove_connection (connection);
432ee1133de4dc5e181be5d09f084d8823388d5f693Anders Carlsson
4331dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington  dbus_connection_remove_filter (connection,
4341dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                                 bus_dispatch_message_filter,
4351dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                                 NULL);
436ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington}
4373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
4383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#ifdef DBUS_BUILD_TESTS
4393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
44093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#include <stdio.h>
44193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
442dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington/* This is used to know whether we need to block in order to finish
443dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington * sending a message, or whether the initial dbus_connection_send()
444dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington * already flushed the queue.
445dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington */
446dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington#define SEND_PENDING(connection) (dbus_connection_has_messages_to_send (connection))
447dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
448f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtontypedef dbus_bool_t (* Check1Func) (BusContext     *context);
449f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtontypedef dbus_bool_t (* Check2Func) (BusContext     *context,
450f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington                                    DBusConnection *connection);
451f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
452ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t check_no_leftovers (BusContext *context);
453ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
45451781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic void
45551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonblock_connection_until_message_from_bus (BusContext     *context,
456dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington                                         DBusConnection *connection,
457dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington                                         const char     *what_is_expected)
45851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{
459dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_verbose ("expecting: %s\n", what_is_expected);
460b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
46151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  while (dbus_connection_get_dispatch_status (connection) ==
46251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington         DBUS_DISPATCH_COMPLETE &&
46351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington         dbus_connection_get_is_connected (connection))
46451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
46551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      bus_test_run_bus_loop (context, TRUE);
46651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      bus_test_run_clients_loop (FALSE);
46751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
46851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington}
46951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
470dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Penningtonstatic void
471dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Penningtonspin_connection_until_authenticated (BusContext     *context,
472dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington                                     DBusConnection *connection)
473dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington{
474dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_verbose ("Spinning to auth connection %p\n", connection);
475dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  while (!dbus_connection_get_is_authenticated (connection) &&
476dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington         dbus_connection_get_is_connected (connection))
477dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    {
478dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      bus_test_run_bus_loop (context, FALSE);
479dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      bus_test_run_clients_loop (FALSE);
480dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    }
481dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_verbose (" ... done spinning to auth connection %p\n", connection);
482dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington}
483dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
48451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington/* compensate for fact that pop_message() can return #NULL due to OOM */
48551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic DBusMessage*
48651781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonpop_message_waiting_for_memory (DBusConnection *connection)
48751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{
48851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  while (dbus_connection_get_dispatch_status (connection) ==
48951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington         DBUS_DISPATCH_NEED_MEMORY)
49051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    _dbus_wait_for_memory ();
49151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
49251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  return dbus_connection_pop_message (connection);
49351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington}
49451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
495fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieustatic DBusMessage*
496fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieuborrow_message_waiting_for_memory (DBusConnection *connection)
497fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu{
498fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  while (dbus_connection_get_dispatch_status (connection) ==
499fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu         DBUS_DISPATCH_NEED_MEMORY)
500fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu    _dbus_wait_for_memory ();
501fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu
502fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  return dbus_connection_borrow_message (connection);
503fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu}
504fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu
50568a3c593b9e77b33614726363c7b6fd85d113021Havoc Penningtonstatic void
506d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonwarn_unexpected_real (DBusConnection *connection,
507d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                      DBusMessage    *message,
508d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                      const char     *expected,
509d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                      const char     *function,
510d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                      int             line)
51168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington{
512bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington  if (message)
513bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington    _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n",
514bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                function, line,
515bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_interface (message) ?
516bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_interface (message) : "(unset)",
517bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_member (message) ?
518bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_member (message) : "(unset)",
519bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_error_name (message) ?
520bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                dbus_message_get_error_name (message) : "(unset)",
521bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                connection,
522bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                expected);
523bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington  else
524bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington    _dbus_warn ("%s:%d received no message on %p, expecting %s\n",
525bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                function, line, connection, expected);
52668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington}
52768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
528d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington#define warn_unexpected(connection, message, expected) \
529d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  warn_unexpected_real (connection, message, expected, _DBUS_FUNCTION_NAME, __LINE__)
530d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington
531d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonstatic void
532d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Penningtonverbose_message_received (DBusConnection *connection,
533d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                          DBusMessage    *message)
534d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington{
535d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  _dbus_verbose ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p\n",
536d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_interface (message) ?
537d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_interface (message) : "(unset)",
538d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_member (message) ?
539d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_member (message) : "(unset)",
540d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_error_name (message) ?
541d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 dbus_message_get_error_name (message) : "(unset)",
542d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington                 connection);
543d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington}
544d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington
54585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieutypedef enum
54685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu{
54785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  SERVICE_CREATED,
54885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  OWNER_CHANGED,
54985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  SERVICE_DELETED
55085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} ServiceInfoKind;
55185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
552ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtontypedef struct
553ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{
55485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  ServiceInfoKind expected_kind;
555ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  const char *expected_service_name;
556ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_bool_t failed;
55785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  DBusConnection *skip_connection;
55885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} CheckServiceOwnerChangedData;
559ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
560ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t
56185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieucheck_service_owner_changed_foreach (DBusConnection *connection,
562075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                     void           *data)
563ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{
56485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  CheckServiceOwnerChangedData *d = data;
565ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  DBusMessage *message;
566ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  DBusError error;
5679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *service_name, *old_owner, *new_owner;
56885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
569b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (d->expected_kind == SERVICE_CREATED
57085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      && connection == d->skip_connection)
57185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    return TRUE;
572ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
573ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_error_init (&error);
574ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  d->failed = TRUE;
575b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
57651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = pop_message_waiting_for_memory (connection);
577ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (message == NULL)
578ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
579ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_warn ("Did not receive a message on %p, expecting %s\n",
5808873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                  connection, "NameOwnerChanged");
581ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      goto out;
582ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
58368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  else if (!dbus_message_is_signal (message,
584248895207dc15914ac7970a6d1431308075dca1dColin Walters                                    DBUS_INTERFACE_DBUS,
5858873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                    "NameOwnerChanged"))
586ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
5878873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      warn_unexpected (connection, message, "NameOwnerChanged");
58868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
589ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      goto out;
590ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
591ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  else
592ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
59385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    reget_service_info_data:
59485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      service_name = NULL;
59585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      old_owner = NULL;
59685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      new_owner = NULL;
59785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
59885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      dbus_message_get_args (message, &error,
59985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &service_name,
60085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &old_owner,
60185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &new_owner,
60285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_INVALID);
60385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
60485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (dbus_error_is_set (&error))
605075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
606075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
607075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
60885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              dbus_error_free (&error);
609b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering              _dbus_wait_for_memory ();
61085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              goto reget_service_info_data;
611075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
612075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          else
613075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
614075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              _dbus_warn ("Did not get the expected arguments\n");
615075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
616075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
617075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
61885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
61985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if ((d->expected_kind == SERVICE_CREATED    && ( old_owner[0] || !new_owner[0]))
62085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          || (d->expected_kind == OWNER_CHANGED   && (!old_owner[0] || !new_owner[0]))
62185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          || (d->expected_kind == SERVICE_DELETED && (!old_owner[0] ||  new_owner[0])))
622ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
623cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen          _dbus_warn ("inconsistent NameOwnerChanged arguments\n");
62485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
625ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
62685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
62785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (strcmp (service_name, d->expected_service_name) != 0)
628ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
62985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("expected info on service %s, got info on %s\n",
630ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                      d->expected_service_name,
631ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                      service_name);
632ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          goto out;
633ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
63485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
635b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      if (*service_name == ':' && new_owner[0]
63685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          && strcmp (service_name, new_owner) != 0)
63785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
63885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("inconsistent ServiceOwnedChanged message (\"%s\" [ %s -> %s ])\n",
63985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      service_name, old_owner, new_owner);
64085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
64185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
642ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
643ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
644ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  d->failed = FALSE;
645b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
646ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington out:
647ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_error_free (&error);
648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
649ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (message)
650ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    dbus_message_unref (message);
651ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
652ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  return !d->failed;
653ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington}
654ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
65585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
656f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic void
657ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonkill_client_connection (BusContext     *context,
658ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                        DBusConnection *connection)
659f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{
660ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  char *base_service;
661ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  const char *s;
66285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  CheckServiceOwnerChangedData socd;
663ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
664ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_verbose ("killing connection %p\n", connection);
665b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
6668873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  s = dbus_bus_get_unique_name (connection);
667ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_assert (s != NULL);
668ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
669ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  while ((base_service = _dbus_strdup (s)) == NULL)
670df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington    _dbus_wait_for_memory ();
671ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
672ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_connection_ref (connection);
673b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
674f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  /* kick in the disconnect handler that unrefs the connection */
67511fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J  dbus_connection_close (connection);
676ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
6771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bus_test_run_everything (context);
678b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
679ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_assert (bus_test_client_listed (connection));
680b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
681ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  /* Run disconnect handler in test.c */
682ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  if (bus_connection_dispatch_one_message (connection))
683ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("something received on connection being killed other than the disconnect");
684b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
685ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_assert (!dbus_connection_get_is_connected (connection));
686ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_connection_unref (connection);
687ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  connection = NULL;
688ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  _dbus_assert (!bus_test_client_listed (connection));
689b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
69085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_kind = SERVICE_DELETED;
69185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_service_name = base_service;
69285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.failed = FALSE;
69385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.skip_connection = NULL;
694b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
69585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  bus_test_clients_foreach (check_service_owner_changed_foreach,
69685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                            &socd);
697ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
698ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_free (base_service);
699b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
70085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (socd.failed)
7018873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington    _dbus_assert_not_reached ("didn't get the expected NameOwnerChanged (deletion) messages");
702b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
703ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!check_no_leftovers (context))
704ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("stuff left in message queues after disconnecting a client");
705ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington}
706ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
707f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonstatic void
708f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Penningtonkill_client_connection_unchecked (DBusConnection *connection)
709f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington{
710f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  /* This kills the connection without expecting it to affect
711f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington   * the rest of the bus.
712b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering   */
713f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_verbose ("Unchecked kill of connection %p\n", connection);
714f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
715f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  dbus_connection_ref (connection);
71611fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J  dbus_connection_close (connection);
717f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  /* dispatching disconnect handler will unref once */
718f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  if (bus_connection_dispatch_one_message (connection))
719f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    _dbus_assert_not_reached ("message other than disconnect dispatched after failure to register");
720777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
721f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_assert (!bus_test_client_listed (connection));
722777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  dbus_connection_unref (connection);
723f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington}
724f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
725ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtontypedef struct
726ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{
727ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  dbus_bool_t failed;
728ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington} CheckNoMessagesData;
729ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
730ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t
731ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtoncheck_no_messages_foreach (DBusConnection *connection,
732ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                           void           *data)
733ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{
734ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  CheckNoMessagesData *d = data;
735ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  DBusMessage *message;
736ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
73751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = pop_message_waiting_for_memory (connection);
738ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (message != NULL)
739ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
74068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      warn_unexpected (connection, message, "no messages");
74168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
742ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      d->failed = TRUE;
743ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
744ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
745ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (message)
746ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    dbus_message_unref (message);
747ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  return !d->failed;
748ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington}
749ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
750ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtonstatic dbus_bool_t
751ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtoncheck_no_leftovers (BusContext *context)
752ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington{
753ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  CheckNoMessagesData nmd;
754ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
755ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  nmd.failed = FALSE;
756ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  bus_test_clients_foreach (check_no_messages_foreach,
757ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                            &nmd);
758b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
759ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (nmd.failed)
7609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
761d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("leftover message found\n");
7629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      return FALSE;
7639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
764ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  else
765ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    return TRUE;
766f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington}
767f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
7684c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington/* returns TRUE if the correct thing happens,
7694c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington * but the correct thing may include OOM errors.
7704c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington */
7713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
7723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtoncheck_hello_message (BusContext     *context,
7733bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                     DBusConnection *connection)
7743bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
7753bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  DBusMessage *message;
7769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessage *name_message;
777a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
778f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  dbus_bool_t retval;
779f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  DBusError error;
7809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *name;
7819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *acquired;
782777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
783777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  retval = FALSE;
784f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  dbus_error_init (&error);
785ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  name = NULL;
786ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  acquired = NULL;
787777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  message = NULL;
7889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  name_message = NULL;
789a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
790a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_verbose ("check_hello_message for %p\n", connection);
791b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
792248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
793248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
794248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
7955fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                          "Hello");
7963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
7973bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (message == NULL)
7984c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington    return TRUE;
7993bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
800dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  dbus_connection_ref (connection); /* because we may get disconnected */
801b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
8023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (!dbus_connection_send (connection, message, &serial))
803f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    {
804f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      dbus_message_unref (message);
805dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      dbus_connection_unref (connection);
806f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      return TRUE;
807f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington    }
8084c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
809dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  _dbus_assert (dbus_message_has_signature (message, ""));
810b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
8114c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  dbus_message_unref (message);
812f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  message = NULL;
8131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
814dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
815dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    {
816dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
817b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
818dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      dbus_connection_unref (connection);
819b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
820dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      return TRUE;
821dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    }
822b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
823777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  /* send our message */
824dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
825777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
826dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
827dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    {
828dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
829b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
830dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      dbus_connection_unref (connection);
831b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
832dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      return TRUE;
833dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    }
834b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
835dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to Hello");
8363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
837f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
838f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
839dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      _dbus_verbose ("connection was disconnected (presumably auth failed)\n");
840b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
841777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      dbus_connection_unref (connection);
842b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
843f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      return TRUE;
844f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    }
845777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
846777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  dbus_connection_unref (connection);
847b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
84851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = pop_message_waiting_for_memory (connection);
8494c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  if (message == NULL)
8504c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington    {
8514c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
85268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                  "Hello", serial, connection);
853f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      goto out;
8544c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington    }
8554c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
856d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  verbose_message_received (connection, message);
857f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
858248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
859e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
860e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      _dbus_warn ("Message has wrong sender %s\n",
861e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                  dbus_message_get_sender (message) ?
862e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                  dbus_message_get_sender (message) : "(none)");
863e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      goto out;
864e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
865b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
866b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
867f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
86868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_error (message,
8691820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington                                 DBUS_ERROR_NO_MEMORY))
870f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        {
871f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington          ; /* good, this is a valid response */
872f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        }
873f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      else
874f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        {
87568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          warn_unexpected (connection, message, "not this error");
87668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
877f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington          goto out;
878f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        }
879f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    }
880f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  else
881f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
88285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      CheckServiceOwnerChangedData socd;
883b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
88468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
885f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        {
886f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington          ; /* good, expected */
887f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        }
888f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      else
889f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        {
89068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          warn_unexpected (connection, message, "method return for Hello");
89168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
892f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington          goto out;
893f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        }
894f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
895ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    retry_get_hello_name:
896f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      if (!dbus_message_get_args (message, &error,
897ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                  DBUS_TYPE_STRING, &name,
898f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington                                  DBUS_TYPE_INVALID))
899f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        {
900ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
901ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
902ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_verbose ("no memory to get service name arg from hello\n");
903ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              dbus_error_free (&error);
904df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington              _dbus_wait_for_memory ();
905ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto retry_get_hello_name;
906ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
907ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          else
908ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
909ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_assert (dbus_error_is_set (&error));
910ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_warn ("Did not get the expected single string argument to hello\n");
911ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto out;
912ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
913ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
914ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
915ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("Got hello name: %s\n", name);
916ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
9178873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      while (!dbus_bus_set_unique_name (connection, name))
918df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington        _dbus_wait_for_memory ();
919b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
92085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_kind = SERVICE_CREATED;
92185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_service_name = name;
92285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.failed = FALSE;
92385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */
92485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      bus_test_clients_foreach (check_service_owner_changed_foreach,
92585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                &socd);
926b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
92785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (socd.failed)
928ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        goto out;
9299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
9309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      name_message = message;
931ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* Client should also have gotten ServiceAcquired */
9329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
93351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      message = pop_message_waiting_for_memory (connection);
934ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (message == NULL)
935ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
936ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          _dbus_warn ("Expecting %s, got nothing\n",
9378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "NameAcquired");
938f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington          goto out;
939f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington        }
940248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (! dbus_message_is_signal (message, DBUS_INTERFACE_DBUS,
941075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                    "NameAcquired"))
94285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
94385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("Expecting %s, got smthg else\n",
9448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "NameAcquired");
94585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
94685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
947b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
948ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    retry_get_acquired_name:
949ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (!dbus_message_get_args (message, &error,
950ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                  DBUS_TYPE_STRING, &acquired,
951ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                  DBUS_TYPE_INVALID))
952ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
953ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
954ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
955ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_verbose ("no memory to get service name arg from acquired\n");
956ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              dbus_error_free (&error);
957df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington              _dbus_wait_for_memory ();
958ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto retry_get_acquired_name;
959ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
960ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          else
961ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
962ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_assert (dbus_error_is_set (&error));
963ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_warn ("Did not get the expected single string argument to ServiceAcquired\n");
964ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              goto out;
965ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
966ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
967ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
968ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("Got acquired name: %s\n", acquired);
969f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
970ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (strcmp (acquired, name) != 0)
971ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
972ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          _dbus_warn ("Acquired name is %s but expected %s\n",
973ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                      acquired, name);
974ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          goto out;
975ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
9769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      acquired = NULL;
977f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    }
978ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
979ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!check_no_leftovers (context))
980ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    goto out;
981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
982f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  retval = TRUE;
983b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
984f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington out:
985d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker  _dbus_verbose ("ending - retval = %d\n", retval);
986b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
9879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_error_free (&error);
988b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
989f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  if (message)
990f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    dbus_message_unref (message);
9919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
9929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (name_message)
9939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    dbus_message_unref (name_message);
994b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
995f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  return retval;
996f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington}
997f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
998f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington/* returns TRUE if the correct thing happens,
999f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington * but the correct thing may include OOM errors.
1000f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington */
1001f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtonstatic dbus_bool_t
10021658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieucheck_double_hello_message (BusContext     *context,
10031658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                            DBusConnection *connection)
10041658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu{
10051658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  DBusMessage *message;
10061658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_uint32_t serial;
10071658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_bool_t retval;
10081658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  DBusError error;
10091658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10101658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  retval = FALSE;
10111658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_error_init (&error);
10121658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  message = NULL;
10131658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10141658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  _dbus_verbose ("check_double_hello_message for %p\n", connection);
1015b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1016248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
1017248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
1018248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
10191658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                                          "Hello");
10201658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10211658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (message == NULL)
10221658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    return TRUE;
1023b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10241658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (!dbus_connection_send (connection, message, &serial))
10251658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
10261658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_message_unref (message);
10271658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return TRUE;
10281658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
10291658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10301658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_message_unref (message);
10311658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  message = NULL;
10321658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10331658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  /* send our message */
1034dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
10351658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10361658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_connection_ref (connection); /* because we may get disconnected */
1037dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to Hello");
10381658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10391658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (!dbus_connection_get_is_connected (connection))
10401658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
1041d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1042b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10431658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      dbus_connection_unref (connection);
1044b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10451658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      return TRUE;
10461658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
10471658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10481658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_connection_unref (connection);
1049b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10501658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  message = pop_message_waiting_for_memory (connection);
10511658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (message == NULL)
10521658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
10531658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
10541658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                  "Hello", serial, connection);
10551658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      goto out;
10561658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
10571658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10581658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  verbose_message_received (connection, message);
10591658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
1060248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
10611658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
10621658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      _dbus_warn ("Message has wrong sender %s\n",
10631658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                  dbus_message_get_sender (message) ?
10641658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                  dbus_message_get_sender (message) : "(none)");
10651658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      goto out;
10661658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
1067b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10681658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
10691658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    {
10701658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      warn_unexpected (connection, message, "method return for Hello");
10711658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu      goto out;
10721658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    }
10731658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10741658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (!check_no_leftovers (context))
10751658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    goto out;
1076b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10771658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  retval = TRUE;
1078b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10791658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu out:
10801658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  dbus_error_free (&error);
1081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10821658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (message)
10831658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    dbus_message_unref (message);
1084b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
10851658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  return retval;
10861658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu}
10871658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
10881658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu/* returns TRUE if the correct thing happens,
10891658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu * but the correct thing may include OOM errors.
10901658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu */
10911658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieustatic dbus_bool_t
10922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieucheck_get_connection_unix_user (BusContext     *context,
10932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                DBusConnection *connection)
10942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu{
10952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusMessage *message;
10962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_uint32_t serial;
10972779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_bool_t retval;
10982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  DBusError error;
10992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  const char *base_service_name;
11002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_uint32_t uid;
11012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  retval = FALSE;
11032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_error_init (&error);
11042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  message = NULL;
11052779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  _dbus_verbose ("check_get_connection_unix_user for %p\n", connection);
1107b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1108248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
1109248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
1110248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
11112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                          "GetConnectionUnixUser");
11122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (message == NULL)
11142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    return TRUE;
11152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11168873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  base_service_name = dbus_bus_get_unique_name (connection);
11172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
1118b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (!dbus_message_append_args (message,
11199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &base_service_name,
11202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                 DBUS_TYPE_INVALID))
11212779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
11222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_message_unref (message);
11232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      return TRUE;
11242779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
11252779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11262779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_send (connection, message, &serial))
11272779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
11282779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_message_unref (message);
11292779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      return TRUE;
11302779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
11312779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11322779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  /* send our message */
1133dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
11342779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11352779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_message_unref (message);
11362779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  message = NULL;
11372779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11382779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_connection_ref (connection); /* because we may get disconnected */
1139dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixUser");
11402779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11412779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!dbus_connection_get_is_connected (connection))
11422779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
1143d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1144b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
11452779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      dbus_connection_unref (connection);
1146b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
11472779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      return TRUE;
11482779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
11492779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11502779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_connection_unref (connection);
11512779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11522779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  message = pop_message_waiting_for_memory (connection);
11532779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (message == NULL)
11542779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
11552779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
11562779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                  "GetConnectionUnixUser", serial, connection);
11572779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      goto out;
11582779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
11592779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11602779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  verbose_message_received (connection, message);
11612779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11622779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
11632779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
11642779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
11652779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        {
11662779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          ; /* good, this is a valid response */
11672779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        }
11682779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      else
11692779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        {
11702779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          warn_unexpected (connection, message, "not this error");
11712779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11722779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          goto out;
11732779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        }
11742779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
11752779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  else
11762779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    {
11772779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
11782779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        {
11792779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          ; /* good, expected */
11802779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        }
11812779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      else
11822779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        {
11832779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          warn_unexpected (connection, message,
1184075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                           "method_return for GetConnectionUnixUser");
11852779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11862779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          goto out;
11872779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        }
11882779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11892779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    retry_get_property:
11902779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
11912779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu      if (!dbus_message_get_args (message, &error,
11922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_UINT32, &uid,
11932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu                                  DBUS_TYPE_INVALID))
11942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        {
11952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
11962779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu            {
1197c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_verbose ("no memory to get uid by GetConnectionUnixUser\n");
11982779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu              dbus_error_free (&error);
11992779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu              _dbus_wait_for_memory ();
12002779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu              goto retry_get_property;
12012779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu            }
12022779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu          else
12032779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu            {
12042779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu              _dbus_assert (dbus_error_is_set (&error));
1205c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixUser\n");
12062779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu              goto out;
12072779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu            }
12082779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu        }
12092779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    }
12102779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12112779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (!check_no_leftovers (context))
12122779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    goto out;
12132779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12142779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  retval = TRUE;
12152779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu
12162779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu out:
12172779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  dbus_error_free (&error);
1218b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
12192779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  if (message)
12202779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu    dbus_message_unref (message);
1221b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
12222779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu  return retval;
12232779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu}
1224c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1225c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen/* returns TRUE if the correct thing happens,
1226c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen * but the correct thing may include OOM errors.
1227c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen */
1228c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthenstatic dbus_bool_t
1229c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthencheck_get_connection_unix_process_id (BusContext     *context,
1230075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      DBusConnection *connection)
1231c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen{
1232c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusMessage *message;
1233c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_uint32_t serial;
1234c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_bool_t retval;
1235c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  DBusError error;
1236c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  const char *base_service_name;
1237c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_uint32_t pid;
1238c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1239c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  retval = FALSE;
1240c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_error_init (&error);
1241c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  message = NULL;
1242c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1243c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  _dbus_verbose ("check_get_connection_unix_process_id for %p\n", connection);
1244b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1245248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
1246248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
1247248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
1248c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                          "GetConnectionUnixProcessID");
1249c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1250c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (message == NULL)
1251c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    return TRUE;
1252c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
12538873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  base_service_name = dbus_bus_get_unique_name (connection);
1254c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1255b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (!dbus_message_append_args (message,
12569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &base_service_name,
1257c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                 DBUS_TYPE_INVALID))
1258c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1259c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_message_unref (message);
1260c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      return TRUE;
1261c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1262c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1263c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_send (connection, message, &serial))
1264c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1265c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_message_unref (message);
1266c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      return TRUE;
1267c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1268c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1269c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  /* send our message */
1270dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
1271c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1272c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_message_unref (message);
1273c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  message = NULL;
1274c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1275c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_connection_ref (connection); /* because we may get disconnected */
1276dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to GetConnectionUnixProcessID");
1277c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1278c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!dbus_connection_get_is_connected (connection))
1279c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1280d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1281b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1282c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      dbus_connection_unref (connection);
1283b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1284c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      return TRUE;
1285c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1286c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1287c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_connection_unref (connection);
1288c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1289c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  message = pop_message_waiting_for_memory (connection);
1290c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (message == NULL)
1291c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1292c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
1293c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                  "GetConnectionUnixProcessID", serial, connection);
1294c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      goto out;
1295c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1296c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1297c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  verbose_message_received (connection, message);
1298c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1299c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1300c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1301c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
1302c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        {
1303c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          ; /* good, this is a valid response */
1304c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        }
1305bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#ifdef DBUS_WIN
1306bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington      else if (dbus_message_is_error (message, DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN))
1307bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington        {
1308bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington          /* We are expecting this error, since we know in the test suite we aren't
1309bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington           * talking to a client running on UNIX
1310bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington           */
1311bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington          _dbus_verbose ("Windows correctly does not support GetConnectionUnixProcessID\n");
1312bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington        }
1313b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#endif
1314c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      else
1315c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        {
1316c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          warn_unexpected (connection, message, "not this error");
1317b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1318c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          goto out;
1319c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        }
1320c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1321c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  else
1322c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    {
1323bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#ifdef DBUS_WIN
1324bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington      warn_unexpected (connection, message, "GetConnectionUnixProcessID to fail on Windows");
1325bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington      goto out;
1326b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#else
1327c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
1328c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        {
1329c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          ; /* good, expected */
1330c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        }
1331c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      else
1332c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        {
1333c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          warn_unexpected (connection, message,
1334075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                           "method_return for GetConnectionUnixProcessID");
1335c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1336c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          goto out;
1337c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        }
1338c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1339c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    retry_get_property:
1340c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1341c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen      if (!dbus_message_get_args (message, &error,
1342c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_UINT32, &pid,
1343c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen                                  DBUS_TYPE_INVALID))
1344c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen        {
1345c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1346c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen            {
1347c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_verbose ("no memory to get pid by GetConnectionUnixProcessID\n");
1348c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              dbus_error_free (&error);
1349c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_wait_for_memory ();
1350c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              goto retry_get_property;
1351c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen            }
1352c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen          else
1353c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen            {
1354c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_assert (dbus_error_is_set (&error));
1355c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_warn ("Did not get the expected DBUS_TYPE_UINT32 from GetConnectionUnixProcessID\n");
1356c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              goto out;
1357c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen            }
1358bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington        }
1359bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington      else
1360bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington        {
1361075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          /* test if returned pid is the same as our own pid
1362075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           *
1363075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           * @todo It would probably be good to restructure the tests
1364075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           *       in a way so our parent is the bus that we're testing
1365075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           *       cause then we can test that the pid returned matches
1366075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           *       getppid()
1367075945f611290f2b9db9a4ed6cf5433f2fd85785John (J           */
1368bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington          if (pid != (dbus_uint32_t) _dbus_getpid ())
1369075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
1370c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_assert (dbus_error_is_set (&error));
1371c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              _dbus_warn ("Result from GetConnectionUnixProcessID is not our own pid\n");
1372c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen              goto out;
1373075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
1374075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
1375bfd6be8555945c01da8772643f71ba511c52cc34Havoc Pennington#endif /* !DBUS_WIN */
1376c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    }
1377c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1378c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!check_no_leftovers (context))
1379c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    goto out;
1380c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1381c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  retval = TRUE;
1382c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
1383c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen out:
1384c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  dbus_error_free (&error);
1385b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1386c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (message)
1387c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    dbus_message_unref (message);
1388b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1389c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  return retval;
1390c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen}
1391c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
13922779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu/* returns TRUE if the correct thing happens,
13932779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu * but the correct thing may include OOM errors.
13942779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieu */
13952779cbf9766859d9fa6f693eb75732d226c496cdOlivier Andrieustatic dbus_bool_t
1396a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtoncheck_add_match_all (BusContext     *context,
1397a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                     DBusConnection *connection)
1398a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
1399a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusMessage *message;
1400a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_bool_t retval;
1401a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
1402a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  DBusError error;
14039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *empty = "";
1404a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1405a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = FALSE;
1406a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_error_init (&error);
1407a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  message = NULL;
1408a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1409a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_verbose ("check_add_match_all for %p\n", connection);
1410b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1411248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
1412248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
1413248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
1414a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                          "AddMatch");
1415a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1416a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (message == NULL)
1417a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    return TRUE;
1418a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
14196a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington  /* empty string match rule matches everything */
14209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &empty,
1421a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                 DBUS_TYPE_INVALID))
1422a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1423a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (message);
1424a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return TRUE;
1425a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1426b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1427a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_connection_send (connection, message, &serial))
1428a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1429a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_message_unref (message);
1430a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return TRUE;
1431a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1432a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1433a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_message_unref (message);
1434a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  message = NULL;
1435a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1436dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  dbus_connection_ref (connection); /* because we may get disconnected */
1437b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1438a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  /* send our message */
1439dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
1440a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1441dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
1442dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    {
1443d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1444b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1445dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      dbus_connection_unref (connection);
1446b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1447dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      return TRUE;
1448dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    }
1449b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1450dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to AddMatch");
1451a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1452a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
1453a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1454d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1455b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1456a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_connection_unref (connection);
1457b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1458a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      return TRUE;
1459a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1460a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1461a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_connection_unref (connection);
1462b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1463a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  message = pop_message_waiting_for_memory (connection);
1464a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (message == NULL)
1465a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1466a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
1467a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  "AddMatch", serial, connection);
1468a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto out;
1469a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1470a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1471a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  verbose_message_received (connection, message);
1472a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1473248895207dc15914ac7970a6d1431308075dca1dColin Walters  if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
1474a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1475a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      _dbus_warn ("Message has wrong sender %s\n",
1476a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  dbus_message_get_sender (message) ?
1477a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                  dbus_message_get_sender (message) : "(none)");
1478a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto out;
1479a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1480b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1481a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1482a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1483a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (dbus_message_is_error (message,
1484a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                 DBUS_ERROR_NO_MEMORY))
1485a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
1486a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          ; /* good, this is a valid response */
1487a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
1488a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      else
1489a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
1490a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          warn_unexpected (connection, message, "not this error");
1491a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1492a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          goto out;
1493a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
1494a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1495a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  else
1496a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
1497a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
1498a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
1499a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          ; /* good, expected */
1500a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          _dbus_assert (dbus_message_get_reply_serial (message) == serial);
1501a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
1502a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      else
1503a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
1504a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          warn_unexpected (connection, message, "method return for AddMatch");
1505a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1506a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          goto out;
1507a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
1508a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
1509a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1510a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!check_no_leftovers (context))
1511a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    goto out;
1512b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1513a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  retval = TRUE;
1514b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1515a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington out:
1516a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_error_free (&error);
1517b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1518a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (message)
1519a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    dbus_message_unref (message);
1520b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1521a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return retval;
1522a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1523a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1524a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington/* returns TRUE if the correct thing happens,
1525a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * but the correct thing may include OOM errors.
1526a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington */
1527a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonstatic dbus_bool_t
1528f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Penningtoncheck_hello_connection (BusContext *context)
1529f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{
1530f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  DBusConnection *connection;
1531ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  DBusError error;
1532f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
1533ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  dbus_error_init (&error);
1534ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
153573b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  connection = dbus_connection_open_private (TEST_CONNECTION, &error);
1536f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  if (connection == NULL)
1537f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
1538ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington      _DBUS_ASSERT_ERROR_IS_SET (&error);
1539ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington      dbus_error_free (&error);
1540f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      return TRUE;
1541f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    }
1542f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
1543f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  if (!bus_setup_debug_client (connection))
1544f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
154511fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J      dbus_connection_close (connection);
1546f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      dbus_connection_unref (connection);
1547f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington      return TRUE;
1548f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    }
1549f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
1550dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  spin_connection_until_authenticated (context, connection);
1551b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1552f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington  if (!check_hello_message (context, connection))
1553f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    return FALSE;
1554b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
15558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  if (dbus_bus_get_unique_name (connection) == NULL)
1556ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
1557ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* We didn't successfully register, so we can't
1558ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * do the usual kill_client_connection() checks
1559ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       */
1560f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington      kill_client_connection_unchecked (connection);
1561ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
1562ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  else
1563ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
1564a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (!check_add_match_all (context, connection))
1565a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        return FALSE;
1566b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1567ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      kill_client_connection (context, connection);
1568ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
1569f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
15703bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  return TRUE;
15713bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
15723bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1573e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington#define NONEXISTENT_SERVICE_NAME "test.this.service.does.not.exist.ewuoiurjdfxcvn"
1574e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1575e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington/* returns TRUE if the correct thing happens,
1576e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington * but the correct thing may include OOM errors.
1577e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington */
1578e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic dbus_bool_t
1579f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_nonexistent_service_no_auto_start (BusContext     *context,
1580f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                         DBusConnection *connection)
1581e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{
1582e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  DBusMessage *message;
1583a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
1584e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  dbus_bool_t retval;
15859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *nonexistent = NONEXISTENT_SERVICE_NAME;
15869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t flags;
1587b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1588248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
1589248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
1590248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
15918873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                          "StartServiceByName");
1592b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1593e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (message == NULL)
1594e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    return TRUE;
1595e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1596f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  dbus_message_set_auto_start (message, FALSE);
1597b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
15989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  flags = 0;
1599e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!dbus_message_append_args (message,
16009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &nonexistent,
16019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_UINT32, &flags,
1602e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                 DBUS_TYPE_INVALID))
1603e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1604e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      dbus_message_unref (message);
1605e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      return TRUE;
1606e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1607b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1608e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!dbus_connection_send (connection, message, &serial))
1609e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1610e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      dbus_message_unref (message);
1611e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      return TRUE;
1612e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1613e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1614e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  dbus_message_unref (message);
1615e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  message = NULL;
16161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
16171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bus_test_run_everything (context);
1618dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to ActivateService on nonexistent");
161951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  bus_test_run_everything (context);
1620e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1621e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!dbus_connection_get_is_connected (connection))
1622e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1623d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
1624e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      return TRUE;
1625e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1626b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1627e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  retval = FALSE;
1628b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
162951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = pop_message_waiting_for_memory (connection);
1630e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (message == NULL)
1631e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1632e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
16338873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                  "StartServiceByName", serial, connection);
1634e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      goto out;
1635e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1636e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1637d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  verbose_message_received (connection, message);
1638e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1639b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
1640e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1641248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
1642e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        {
1643e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington          _dbus_warn ("Message has wrong sender %s\n",
1644e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                      dbus_message_get_sender (message) ?
1645e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                      dbus_message_get_sender (message) : "(none)");
1646e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington          goto out;
1647e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        }
1648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
164968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_error (message,
16501820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington                                 DBUS_ERROR_NO_MEMORY))
1651e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        {
1652e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington          ; /* good, this is a valid response */
1653e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        }
165468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      else if (dbus_message_is_error (message,
16558873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                      DBUS_ERROR_SERVICE_UNKNOWN))
1656e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        {
1657e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington          ; /* good, this is expected also */
1658e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        }
1659e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      else
1660e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        {
166168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          warn_unexpected (connection, message, "not this error");
1662e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington          goto out;
1663e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington        }
1664e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1665e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  else
1666e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
1667e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      _dbus_warn ("Did not expect to successfully activate %s\n",
1668e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                  NONEXISTENT_SERVICE_NAME);
1669e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      goto out;
1670e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
1671e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
1672e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  retval = TRUE;
1673b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1674e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington out:
1675e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (message)
1676e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    dbus_message_unref (message);
1677b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1678e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  return retval;
1679e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington}
1680e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
168193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens,
168293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors.
168393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */
168493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t
1685f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_nonexistent_service_auto_start (BusContext     *context,
1686f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                      DBusConnection *connection)
168793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{
168893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  DBusMessage *message;
168993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_uint32_t serial;
169093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_bool_t retval;
1691b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
169293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = dbus_message_new_method_call (NONEXISTENT_SERVICE_NAME,
169393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "/org/freedesktop/TestSuite",
169493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "org.freedesktop.TestSuite",
169593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "Echo");
1696b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
169793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
169893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    return TRUE;
1699b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
170093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_send (connection, message, &serial))
170193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
170293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_message_unref (message);
170393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
170493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
170593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
170693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_message_unref (message);
170793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = NULL;
170893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
170993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
1710dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to Echo");
171193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
171293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
171393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_get_is_connected (connection))
171493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
1715d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
171693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
171793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
1718b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
171993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = FALSE;
1720b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
172193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = pop_message_waiting_for_memory (connection);
172293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
172393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
172493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
172593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
172693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                  "Echo message (auto activation)", serial, connection);
172793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
172893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
172993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
173093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  verbose_message_received (connection, message);
173193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
173293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
173393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
1734248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
173593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
173693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          _dbus_warn ("Message has wrong sender %s\n",
173793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                      dbus_message_get_sender (message) ?
173893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                      dbus_message_get_sender (message) : "(none)");
173993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
174093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
1741b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
174293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (dbus_message_is_error (message,
174393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                 DBUS_ERROR_NO_MEMORY))
174493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
174593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          ; /* good, this is a valid response */
174693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
174793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      else if (dbus_message_is_error (message,
17488873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                      DBUS_ERROR_SERVICE_UNKNOWN))
174993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
175093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          ; /* good, this is expected also */
175193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
175293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      else
175393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
175493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          warn_unexpected (connection, message, "not this error");
175593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
175693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
175793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
175893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  else
175993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
176093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      _dbus_warn ("Did not expect to successfully activate %s\n",
176193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                  NONEXISTENT_SERVICE_NAME);
176293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
176393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
176493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
176593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = TRUE;
1766b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
176793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out:
176893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message)
176993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    dbus_message_unref (message);
1770b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
177193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  return retval;
177293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult}
177393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
1774fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic dbus_bool_t
1775231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtoncheck_base_service_activated (BusContext     *context,
1776231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                              DBusConnection *connection,
1777231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                              DBusMessage    *initial_message,
17789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                              const char    **base_service_p)
1779fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{
1780fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  DBusMessage *message;
1781fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  dbus_bool_t retval;
1782fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  DBusError error;
17839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *base_service, *base_service_from_bus, *old_owner;
1784b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1785fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  retval = FALSE;
1786b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1787fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  dbus_error_init (&error);
178885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  base_service = NULL;
178985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  old_owner = NULL;
179085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  base_service_from_bus = NULL;
1791fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
1792fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  message = initial_message;
1793b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  dbus_message_ref (message);
1794fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
179568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_is_signal (message,
1796248895207dc15914ac7970a6d1431308075dca1dColin Walters                              DBUS_INTERFACE_DBUS,
17978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                              "NameOwnerChanged"))
1798fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
179985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      CheckServiceOwnerChangedData socd;
180051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
180151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    reget_service_name_arg:
180285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      base_service = NULL;
180385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      old_owner = NULL;
180485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      base_service_from_bus = NULL;
180585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
1806fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      if (!dbus_message_get_args (message, &error,
180785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                  DBUS_TYPE_STRING, &base_service,
1808075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                  DBUS_TYPE_STRING, &old_owner,
180985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                  DBUS_TYPE_STRING, &base_service_from_bus,
1810fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                                  DBUS_TYPE_INVALID))
1811fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
181251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
181351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            {
181451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              dbus_error_free (&error);
181551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              _dbus_wait_for_memory ();
181651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              goto reget_service_name_arg;
181751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            }
181851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          else
181951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            {
182051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              _dbus_warn ("Message %s doesn't have a service name: %s\n",
18218873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                          "NameOwnerChanged (creation)",
182251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                          error.message);
182351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              goto out;
182451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            }
1825fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
1826fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
182785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (*base_service != ':')
1828fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
1829231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          _dbus_warn ("Expected base service activation, got \"%s\" instead\n",
183085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      base_service);
1831231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          goto out;
1832231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington        }
1833b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
183485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (strcmp (base_service, base_service_from_bus) != 0)
1835075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
183685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("Expected base service activation, got \"%s\" instead with owner \"%s\"\n",
183785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      base_service, base_service_from_bus);
183885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
183985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
184085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
184185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (old_owner[0])
184285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
184385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("Received an old_owner argument during base service activation, \"%s\"\n",
184485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      old_owner);
184585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
184685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
1847b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
184885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_kind = SERVICE_CREATED;
184985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_service_name = base_service;
185085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.failed = FALSE;
185185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.skip_connection = connection;
185285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      bus_test_clients_foreach (check_service_owner_changed_foreach,
185385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                &socd);
1854b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
185585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (socd.failed)
1856231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington        goto out;
1857231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington    }
185851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  else
185951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
18608873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      warn_unexpected (connection, message, "NameOwnerChanged (creation) for base service");
186168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
186251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      goto out;
186351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
1864fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
1865231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  if (base_service_p)
18669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    *base_service_p = base_service;
18679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
18689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  retval = TRUE;
1869b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1870231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington out:
1871231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  if (message)
1872231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington    dbus_message_unref (message);
187385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  dbus_error_free (&error);
1874231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
1875231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  return retval;
1876231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington}
1877231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
1878231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtonstatic dbus_bool_t
1879231fc084cf418150a9e484429c4152d5a0b35051Havoc Penningtoncheck_service_activated (BusContext     *context,
1880231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                         DBusConnection *connection,
1881231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                         const char     *activated_name,
1882231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                         const char     *base_service_name,
1883231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                         DBusMessage    *initial_message)
1884231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington{
1885231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  DBusMessage *message;
1886231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  dbus_bool_t retval;
1887231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  DBusError error;
1888231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  dbus_uint32_t activation_result;
1889b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1890231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  retval = FALSE;
1891b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1892231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  dbus_error_init (&error);
1893231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
1894231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  message = initial_message;
1895231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington  dbus_message_ref (message);
1896231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
189768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_is_signal (message,
1898248895207dc15914ac7970a6d1431308075dca1dColin Walters                              DBUS_INTERFACE_DBUS,
18998873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                              "NameOwnerChanged"))
1900231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington    {
190185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      CheckServiceOwnerChangedData socd;
19029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      const char *service_name, *base_service_from_bus, *old_owner;
190351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
190451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    reget_service_name_arg:
190585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      service_name = NULL;
190685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      old_owner = NULL;
190785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      base_service_from_bus = NULL;
190885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
1909231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      if (!dbus_message_get_args (message, &error,
1910231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                                  DBUS_TYPE_STRING, &service_name,
1911075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                   DBUS_TYPE_STRING, &old_owner,
191285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                  DBUS_TYPE_STRING, &base_service_from_bus,
1913231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                                  DBUS_TYPE_INVALID))
1914fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
191551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
191651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            {
191751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              dbus_error_free (&error);
191851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              _dbus_wait_for_memory ();
191951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              goto reget_service_name_arg;
192051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            }
192151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          else
192251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            {
192351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              _dbus_warn ("Message %s doesn't have a service name: %s\n",
19248873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                          "NameOwnerChanged (creation)",
192551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                          error.message);
192651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              goto out;
192751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington            }
1928fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
1929fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
1930fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      if (strcmp (service_name, activated_name) != 0)
1931fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
1932fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          _dbus_warn ("Expected to see service %s created, saw %s instead\n",
1933fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                      activated_name, service_name);
1934fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          goto out;
1935fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
1936fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
193785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (strcmp (base_service_name, base_service_from_bus) != 0)
193885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
19398873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington          _dbus_warn ("NameOwnerChanged reports wrong base service: %s owner, expected %s instead\n",
194085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      base_service_from_bus, base_service_name);
194185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
194285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
194385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
194485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (old_owner[0])
194585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
194685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("expected a %s, got a %s\n",
19478873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "NameOwnerChanged (creation)",
19488873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "NameOwnerChanged (change)");
194985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          goto out;
195085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
195185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
195285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_kind = SERVICE_CREATED;
195385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.skip_connection = connection;
195485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.failed = FALSE;
195585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_service_name = service_name;
195685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      bus_test_clients_foreach (check_service_owner_changed_foreach,
195785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                                &socd);
1958b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
195985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (socd.failed)
1960fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        goto out;
1961b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
1962fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      dbus_message_unref (message);
19639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      service_name = NULL;
19649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      old_owner = NULL;
19659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      base_service_from_bus = NULL;
1966b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
196751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      message = pop_message_waiting_for_memory (connection);
1968fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      if (message == NULL)
1969fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
1970fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          _dbus_warn ("Expected a reply to %s, got nothing\n",
19718873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "StartServiceByName");
1972fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          goto out;
1973fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
1974fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
197551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  else
197651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
19778873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      warn_unexpected (connection, message, "NameOwnerChanged for the activated name");
1978b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
197951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      goto out;
198051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
1981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
198268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
1983fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
19848873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      warn_unexpected (connection, message, "reply to StartServiceByName");
198568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
1986fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      goto out;
1987fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
1988fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
1989fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  activation_result = 0;
1990fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  if (!dbus_message_get_args (message, &error,
1991fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                              DBUS_TYPE_UINT32, &activation_result,
1992fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                              DBUS_TYPE_INVALID))
1993fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
1994fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
1995fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
1996fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          _dbus_warn ("Did not have activation result first argument to %s: %s\n",
19978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                      "StartServiceByName", error.message);
1998fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          goto out;
1999fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
2000fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2001fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      dbus_error_free (&error);
2002fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
2003fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  else
2004fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
20058873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      if (activation_result == DBUS_START_REPLY_SUCCESS)
2006fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        ; /* Good */
20078873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      else if (activation_result == DBUS_START_REPLY_ALREADY_RUNNING)
2008fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        ; /* Good also */
2009fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      else
2010fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
20118873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington          _dbus_warn ("Activation result was %u, no good.\n",
2012fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                      activation_result);
2013fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington          goto out;
2014fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
2015fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
2016fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2017fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  dbus_message_unref (message);
2018fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  message = NULL;
2019b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2020fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  if (!check_no_leftovers (context))
2021fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
2022fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      _dbus_warn ("Messages were left over after verifying existent activation results\n");
2023fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      goto out;
2024fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
2025fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2026fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  retval = TRUE;
2027b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2028fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington out:
2029fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  if (message)
2030fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    dbus_message_unref (message);
203185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  dbus_error_free (&error);
2032b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2033fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  return retval;
2034fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington}
2035fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2036fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic dbus_bool_t
203793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultcheck_service_auto_activated (BusContext     *context,
2038075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                              DBusConnection *connection,
2039075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                              const char     *activated_name,
2040075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                              const char     *base_service_name,
2041075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                              DBusMessage    *initial_message)
204293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{
204393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  DBusMessage *message;
204493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_bool_t retval;
204593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  DBusError error;
2046b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
204793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = FALSE;
2048b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
204993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_error_init (&error);
205093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
205193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = initial_message;
205293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_message_ref (message);
205393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
205493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (dbus_message_is_signal (message,
2055248895207dc15914ac7970a6d1431308075dca1dColin Walters                              DBUS_INTERFACE_DBUS,
20568873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                              "NameOwnerChanged"))
205793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
20589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      const char *service_name;
205985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      CheckServiceOwnerChangedData socd;
2060b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
206193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    reget_service_name_arg:
206293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (!dbus_message_get_args (message, &error,
206393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                  DBUS_TYPE_STRING, &service_name,
206493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                  DBUS_TYPE_INVALID))
206593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
206693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
206793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult            {
206893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              dbus_error_free (&error);
206993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              _dbus_wait_for_memory ();
207093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              goto reget_service_name_arg;
207193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult            }
207293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          else
207393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult            {
207493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              _dbus_warn ("Message %s doesn't have a service name: %s\n",
20758873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                          "NameOwnerChanged",
207693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                          error.message);
207793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              dbus_error_free (&error);
207893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult              goto out;
207993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult            }
208093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
2081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
208293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (strcmp (service_name, activated_name) != 0)
208393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
208493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          _dbus_warn ("Expected to see service %s created, saw %s instead\n",
208593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                      activated_name, service_name);
208693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
208793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
2088b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
208985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_kind = SERVICE_CREATED;
209085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.expected_service_name = service_name;
209185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      socd.failed = FALSE;
2092b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      socd.skip_connection = connection;
209385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      bus_test_clients_foreach (check_service_owner_changed_foreach,
2094075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                &socd);
2095b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
209685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (socd.failed)
209793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        goto out;
2098b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
209993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      /* Note that this differs from regular activation in that we don't get a
210093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult       * reply to ActivateService here.
210193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult       */
2102b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
210393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_message_unref (message);
210493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      message = NULL;
21059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      service_name = NULL;
210693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
210793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  else
210893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
21098873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      warn_unexpected (connection, message, "NameOwnerChanged for the activated name");
2110b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
211193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
211293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
2113b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
211493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = TRUE;
2115b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
211693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out:
211793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message)
211893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    dbus_message_unref (message);
2119b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
212093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  return retval;
212193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult}
212293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
212393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t
2124fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtoncheck_service_deactivated (BusContext     *context,
2125fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                           DBusConnection *connection,
2126fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                           const char     *activated_name,
2127fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington                           const char     *base_service)
2128fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{
2129fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  dbus_bool_t retval;
213085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  CheckServiceOwnerChangedData socd;
2131fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2132fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  retval = FALSE;
2133b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
213485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  /* Now we are expecting ServiceOwnerChanged (deletion) messages for the base
2135fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington   * service and the activated_name.  The base service
21361708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington   * notification is required to come last.
2137fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington   */
213885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_kind = SERVICE_DELETED;
213985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_service_name = activated_name;
214085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.failed = FALSE;
214185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.skip_connection = NULL;
214285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  bus_test_clients_foreach (check_service_owner_changed_foreach,
2143b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                            &socd);
214485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
214585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (socd.failed)
2146fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    goto out;
2147b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
214885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_kind = SERVICE_DELETED;
214985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.expected_service_name = base_service;
215085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.failed = FALSE;
215185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  socd.skip_connection = NULL;
215285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  bus_test_clients_foreach (check_service_owner_changed_foreach,
215385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                            &socd);
215485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
215585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (socd.failed)
2156fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    goto out;
21571708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington
21581708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington  retval = TRUE;
2159b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2160fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington out:
2161fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  return retval;
2162fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington}
2163fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
216451781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic dbus_bool_t
216551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtoncheck_send_exit_to_service (BusContext     *context,
216651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                            DBusConnection *connection,
216751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                            const char     *service_name,
216851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                            const char     *base_service)
216951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington{
217051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  dbus_bool_t got_error;
217151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  DBusMessage *message;
2172a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
217351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  dbus_bool_t retval;
2174b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
217551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("Sending exit message to the test service\n");
217651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
217751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  retval = FALSE;
2178b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
217951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  /* Kill off the test service by sending it a quit message */
21805fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington  message = dbus_message_new_method_call (service_name,
21815fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                          "/org/freedesktop/TestSuite",
21825fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                          "org.freedesktop.TestSuite",
21835fd1e389e1c1c12ad4a55c2af6abdc8e7a2f6d41Havoc Pennington                                          "Exit");
2184b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
218551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (message == NULL)
218651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
218751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      /* Do this again; we still need the service to exit... */
218851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      if (!check_send_exit_to_service (context, connection,
218951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                                       service_name, base_service))
219051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        goto out;
2191b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
219251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      return TRUE;
219351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
2194b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
219551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (!dbus_connection_send (connection, message, &serial))
219651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
219751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      dbus_message_unref (message);
219851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
219951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      /* Do this again; we still need the service to exit... */
220051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      if (!check_send_exit_to_service (context, connection,
220151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                                       service_name, base_service))
220251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        goto out;
2203b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
220451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      return TRUE;
220551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
220651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
220751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  dbus_message_unref (message);
220851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = NULL;
220951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
221051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  /* send message */
2211dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  bus_test_run_clients_loop (SEND_PENDING (connection));
221251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
221351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  /* read it in and write it out to test service */
221451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  bus_test_run_bus_loop (context, FALSE);
221551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
221651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  /* see if we got an error during message bus dispatching */
221751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  bus_test_run_clients_loop (FALSE);
2218fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  message = borrow_message_waiting_for_memory (connection);
2219b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  got_error = message != NULL && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;
222051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (message)
2221777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
2222777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      dbus_connection_return_message (connection, message);
2223777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      message = NULL;
2224777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
2225b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
222651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (!got_error)
222751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
222851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      /* If no error, wait for the test service to exit */
2229dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      block_connection_until_message_from_bus (context, connection, "test service to exit");
2230b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
223151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      bus_test_run_everything (context);
223251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
223351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
223451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (got_error)
223551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
223651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      message = pop_message_waiting_for_memory (connection);
223751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      _dbus_assert (message != NULL);
223851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
2239bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      if (dbus_message_get_reply_serial (message) != serial)
2240bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        {
2241bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          warn_unexpected (connection, message,
2242bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                           "error with the correct reply serial");
2243bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          goto out;
2244bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        }
2245b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
224668a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (!dbus_message_is_error (message,
224768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                  DBUS_ERROR_NO_MEMORY))
224851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        {
224968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          warn_unexpected (connection, message,
225068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                           "a no memory error from asking test service to exit");
225151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          goto out;
225251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        }
225351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
225451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      _dbus_verbose ("Got error %s when asking test service to exit\n",
225568a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                     dbus_message_get_error_name (message));
225651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
225751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      /* Do this again; we still need the service to exit... */
225851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      if (!check_send_exit_to_service (context, connection,
225951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                                       service_name, base_service))
226051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        goto out;
226151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    }
226251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  else
226351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    {
226451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington      if (!check_service_deactivated (context, connection,
226551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                                      service_name, base_service))
226651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington        goto out;
226751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
2268bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      /* Should now have a NoReply error from the Exit() method
2269bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington       * call; it should have come after all the deactivation
2270bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington       * stuff.
2271bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington       */
2272bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      message = pop_message_waiting_for_memory (connection);
2273b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2274bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      if (message == NULL)
2275bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        {
2276bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          warn_unexpected (connection, NULL,
2277bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                           "reply to Exit() method call");
2278bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          goto out;
2279bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        }
2280bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      if (!dbus_message_is_error (message,
2281bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                                  DBUS_ERROR_NO_REPLY))
2282bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        {
22839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          warn_unexpected (connection, message,
2284bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                           "NoReply error from Exit() method call");
2285bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          goto out;
2286bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        }
2287bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington
2288bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      if (dbus_message_get_reply_serial (message) != serial)
2289bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        {
2290bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          warn_unexpected (connection, message,
2291bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                           "error with the correct reply serial");
2292bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          goto out;
2293bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        }
2294b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2295bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      _dbus_verbose ("Got error %s after test service exited\n",
2296bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                     dbus_message_get_error_name (message));
2297b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2298bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington      if (!check_no_leftovers (context))
2299bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        {
2300bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          _dbus_warn ("Messages were left over after %s\n",
2301bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington                      _DBUS_FUNCTION_NAME);
2302bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington          goto out;
2303bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington        }
2304bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington    }
2305b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
230651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  retval = TRUE;
2307b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
230851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington out:
230951781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  if (message)
231051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington    dbus_message_unref (message);
2311b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
231251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  return retval;
231351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington}
231451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
23156be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtonstatic dbus_bool_t
23166be547d32f018c23ba56426a0bccd08baa2cf440Havoc Penningtoncheck_got_error (BusContext     *context,
23176be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington                 DBusConnection *connection,
2318a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                 const char     *first_error_name,
2319a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                 ...)
23206be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington{
23216be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  DBusMessage *message;
23226be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  dbus_bool_t retval;
2323a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  va_list ap;
2324a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  dbus_bool_t error_found;
2325a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  const char *error_name;
2326b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
23276be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  retval = FALSE;
2328b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
23296be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  message = pop_message_waiting_for_memory (connection);
23306be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (message == NULL)
23316be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    {
23326be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      _dbus_warn ("Did not get an expected error\n");
23336be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      goto out;
23346be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    }
23356be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
2336b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)
23376be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    {
233868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      warn_unexpected (connection, message, "an error");
233968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
23406be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      goto out;
23416be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    }
23426be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
2343a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  error_found = FALSE;
2344a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington
2345a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  va_start (ap, first_error_name);
2346a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  error_name = first_error_name;
2347a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  while (error_name != NULL)
2348a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington    {
234968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_error (message, error_name))
2350a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington        {
2351a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington          error_found = TRUE;
2352a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington          break;
2353a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington        }
2354a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington      error_name = va_arg (ap, char*);
2355a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington    }
2356a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  va_end (ap);
2357a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington
2358a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington  if (!error_found)
23596be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    {
2360a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington      _dbus_warn ("Expected error %s or other, got %s instead\n",
2361a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                  first_error_name,
236268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                  dbus_message_get_error_name (message));
23636be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington      goto out;
23646be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    }
23656be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
23666be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  retval = TRUE;
2367b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
23686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington out:
23696be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  if (message)
23706be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington    dbus_message_unref (message);
2371b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
23726be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington  return retval;
23736be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington}
2374b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
237585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieutypedef enum
2376b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering{
237785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  GOT_SERVICE_CREATED,
237885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  GOT_SERVICE_DELETED,
237985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  GOT_ERROR,
2380b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  GOT_SOMETHING_ELSE
238185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu} GotServiceInfo;
238285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
238385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieustatic GotServiceInfo
238485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieucheck_got_service_info (DBusMessage *message)
238585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu{
238685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  GotServiceInfo message_kind;
238785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
238885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (dbus_message_is_signal (message,
2389248895207dc15914ac7970a6d1431308075dca1dColin Walters                              DBUS_INTERFACE_DBUS,
23908873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                              "NameOwnerChanged"))
239185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    {
239285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      DBusError error;
23939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      const char *service_name, *old_owner, *new_owner;
239485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      dbus_error_init (&error);
239585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
239685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    reget_service_info_data:
239785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      service_name = NULL;
239885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      old_owner = NULL;
239985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      new_owner = NULL;
240085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
240185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      dbus_message_get_args (message, &error,
240285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &service_name,
240385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &old_owner,
240485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_STRING, &new_owner,
240585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                             DBUS_TYPE_INVALID);
240685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      if (dbus_error_is_set (&error))
240785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        {
240885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
240985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu            {
241085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              dbus_error_free (&error);
241185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              goto reget_service_info_data;
241285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu            }
241385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          else
241485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu            {
2415cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen              _dbus_warn ("unexpected arguments for NameOwnerChanged message\n");
241685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              message_kind = GOT_SOMETHING_ELSE;
241785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu            }
241885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        }
241985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      else if (!old_owner[0])
242085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        message_kind = GOT_SERVICE_CREATED;
242185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      else if (!new_owner[0])
242285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        message_kind = GOT_SERVICE_DELETED;
242385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      else
242485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        message_kind = GOT_SOMETHING_ELSE;
242585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
242685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      dbus_error_free (&error);
242785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    }
242885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  else if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
242985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    message_kind = GOT_ERROR;
243085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  else
243185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    message_kind = GOT_SOMETHING_ELSE;
243285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
243385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  return message_kind;
243485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu}
243585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
24361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington#define EXISTENT_SERVICE_NAME "org.freedesktop.DBus.TestSuiteEchoService"
24371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
24381b08036103a70159e7a67b2349306710edcd6654Havoc Pennington/* returns TRUE if the correct thing happens,
24391b08036103a70159e7a67b2349306710edcd6654Havoc Pennington * but the correct thing may include OOM errors.
24401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington */
24411b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonstatic dbus_bool_t
2442f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_existent_service_no_auto_start (BusContext     *context,
2443f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                      DBusConnection *connection)
24441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
24451b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusMessage *message;
24469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessage *base_service_message;
24479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *base_service;
2448a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
24491b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  dbus_bool_t retval;
24509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *existent = EXISTENT_SERVICE_NAME;
24519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t flags;
2452fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
24539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  base_service_message = NULL;
2454b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2455248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
2456248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
2457248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
24588873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                          "StartServiceByName");
24591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
24601b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (message == NULL)
24611b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    return TRUE;
24621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
2463f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  dbus_message_set_auto_start (message, FALSE);
2464b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
24659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  flags = 0;
24661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (!dbus_message_append_args (message,
24679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &existent,
24689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_UINT32, &flags,
24691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                                 DBUS_TYPE_INVALID))
24701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
24711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      dbus_message_unref (message);
24721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      return TRUE;
24731b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
2474b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
24751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (!dbus_connection_send (connection, message, &serial))
24761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
24771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      dbus_message_unref (message);
24781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      return TRUE;
24791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
24801b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
24811b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  dbus_message_unref (message);
24821b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  message = NULL;
24831b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
24841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bus_test_run_everything (context);
24851b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
248651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  /* now wait for the message bus to hear back from the activated
248751781f541094a4936d47119cd62682e0431c41e9Havoc Pennington   * service.
248851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington   */
2489dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "activated service to connect");
249051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
24911b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bus_test_run_everything (context);
24921b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
24931b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
24941b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
2495d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
24961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      return TRUE;
24971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
2498b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
24991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  retval = FALSE;
2500b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
250151781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  message = pop_message_waiting_for_memory (connection);
25021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (message == NULL)
25031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
2504231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      _dbus_warn ("Did not receive any messages after %s %d on %p\n",
25058873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                  "StartServiceByName", serial, connection);
25061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      goto out;
25071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
25081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
2509d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  verbose_message_received (connection, message);
25108873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_verbose ("  (after sending %s)\n", "StartServiceByName");
25111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
2512b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
25131b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
2514248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
25151b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        {
25161b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          _dbus_warn ("Message has wrong sender %s\n",
25171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                      dbus_message_get_sender (message) ?
25181b08036103a70159e7a67b2349306710edcd6654Havoc Pennington                      dbus_message_get_sender (message) : "(none)");
25191b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          goto out;
25201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        }
2521b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
252268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_error (message,
25231820f3bd0a5a4b0ab14dbcc80ba1b68d2c48e01dHavoc Pennington                                 DBUS_ERROR_NO_MEMORY))
25241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        {
25251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          ; /* good, this is a valid response */
25261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        }
252768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      else if (dbus_message_is_error (message,
25281658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                                      DBUS_ERROR_SPAWN_CHILD_EXITED) ||
25291658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu               dbus_message_is_error (message,
25305e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin                                      DBUS_ERROR_SPAWN_CHILD_SIGNALED) ||
25315e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin               dbus_message_is_error (message,
25321658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu                                      DBUS_ERROR_SPAWN_EXEC_FAILED))
25331708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington        {
253478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          ; /* good, this is expected also */
25351708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington        }
25361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      else
25371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        {
25381b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          _dbus_warn ("Did not expect error %s\n",
253968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                      dbus_message_get_error_name (message));
25401b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          goto out;
25411b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        }
25421b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
25431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  else
25441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    {
254585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      GotServiceInfo message_kind;
2546b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2547231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      if (!check_base_service_activated (context, connection,
2548231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                                         message, &base_service))
2549fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        goto out;
2550fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
25519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      base_service_message = message;
2552fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      message = NULL;
2553231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
2554231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      /* We may need to block here for the test service to exit or finish up */
2555dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      block_connection_until_message_from_bus (context, connection, "test service to exit or finish up");
2556b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2557231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      message = dbus_connection_borrow_message (connection);
2558fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      if (message == NULL)
2559fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        {
2560231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          _dbus_warn ("Did not receive any messages after base service creation notification\n");
2561231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          goto out;
2562fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington        }
2563231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
256485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      message_kind = check_got_service_info (message);
256585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
2566231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      dbus_connection_return_message (connection, message);
2567231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington      message = NULL;
25686be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington
256985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      switch (message_kind)
2570075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
2571075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SOMETHING_ELSE:
257285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu          _dbus_warn ("Unexpected message after ActivateService "
257385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu                      "(should be an error or a service announcement");
2574075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
257585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
2576075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_ERROR:
25776be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington          if (!check_got_error (context, connection,
2578a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                                DBUS_ERROR_SPAWN_CHILD_EXITED,
2579a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                                DBUS_ERROR_NO_MEMORY,
2580a03e626728db8a9cbe1dbbfab6f22f5870cb40aeHavoc Pennington                                NULL))
25816be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington            goto out;
25826be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington          /* A service deleted should be coming along now after this error.
25836be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington           * We can also get the error *after* the service deleted.
25846be547d32f018c23ba56426a0bccd08baa2cf440Havoc Pennington           */
2585fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2586075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          /* fall through */
2587075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
2588075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_DELETED:
2589075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          {
2590075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            /* The service started up and got a base address, but then
2591075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             * failed to register under EXISTENT_SERVICE_NAME
2592075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             */
2593075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            CheckServiceOwnerChangedData socd;
2594075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
2595075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_kind = SERVICE_DELETED;
2596075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_service_name = base_service;
2597075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.failed = FALSE;
2598075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.skip_connection = NULL;
2599b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2600075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            bus_test_clients_foreach (check_service_owner_changed_foreach,
2601075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      &socd);
2602075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
2603075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            if (socd.failed)
2604075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
2605075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
2606075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            /* Now we should get an error about the service exiting
2607075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             * if we didn't get it before.
2608075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             */
2609075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            if (message_kind != GOT_ERROR)
2610075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              {
2611075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                block_connection_until_message_from_bus (context, connection, "error about service exiting");
2612b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2613075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                /* and process everything again */
2614075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                bus_test_run_everything (context);
2615b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2616075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                if (!check_got_error (context, connection,
2617075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      DBUS_ERROR_SPAWN_CHILD_EXITED,
2618cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen				      DBUS_ERROR_NO_MEMORY,
2619075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      NULL))
2620075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                  goto out;
2621075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              }
2622075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            break;
2623075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          }
2624075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
2625075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_CREATED:
262651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington          message = pop_message_waiting_for_memory (connection);
2627231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          if (message == NULL)
2628231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington            {
262985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu              _dbus_warn ("Failed to pop message we just put back! "
2630075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                          "should have been a NameOwnerChanged (creation)\n");
2631231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington              goto out;
2632231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington            }
2633b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2634231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME,
2635231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington                                        base_service, message))
2636231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington            goto out;
2637b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2638231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          dbus_message_unref (message);
2639231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          message = NULL;
2640231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
2641231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington          if (!check_no_leftovers (context))
2642231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington            {
2643231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington              _dbus_warn ("Messages were left over after successful activation\n");
2644231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington              goto out;
2645231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington            }
2646231fc084cf418150a9e484429c4152d5a0b35051Havoc Pennington
26477628b541258d906e27e2000a402ed2d02383479cJohn (J	  if (!check_send_exit_to_service (context, connection,
264851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington                                           EXISTENT_SERVICE_NAME, base_service))
26497628b541258d906e27e2000a402ed2d02383479cJohn (J	    goto out;
265085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
2651075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          break;
2652075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
26531b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    }
265485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
26551b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  retval = TRUE;
2656b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
26571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington out:
26581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (message)
26591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    dbus_message_unref (message);
2660fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
26619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (base_service_message)
26629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    dbus_message_unref (base_service_message);
2663b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
26641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return retval;
26651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
26661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
2667e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#ifndef DBUS_WIN_FIXME
266878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington/* returns TRUE if the correct thing happens,
266978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington * but the correct thing may include OOM errors.
267078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington */
267178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Penningtonstatic dbus_bool_t
2672f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_segfault_service_no_auto_start (BusContext     *context,
2673f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                      DBusConnection *connection)
267478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington{
267578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  DBusMessage *message;
2676a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  dbus_uint32_t serial;
267778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  dbus_bool_t retval;
26789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *segv_service;
26799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  dbus_uint32_t flags;
2680b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2681248895207dc15914ac7970a6d1431308075dca1dColin Walters  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
2682248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_PATH_DBUS,
2683248895207dc15914ac7970a6d1431308075dca1dColin Walters                                          DBUS_INTERFACE_DBUS,
26848873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                                          "StartServiceByName");
268578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
268678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (message == NULL)
268778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    return TRUE;
268878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
2689f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  dbus_message_set_auto_start (message, FALSE);
2690b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
26919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  segv_service = "org.freedesktop.DBus.TestSuiteSegfaultService";
26929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  flags = 0;
269378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (!dbus_message_append_args (message,
26949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &segv_service,
26959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_UINT32, &flags,
269678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington                                 DBUS_TYPE_INVALID))
269778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
269878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      dbus_message_unref (message);
269978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      return TRUE;
270078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
2701b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
270278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (!dbus_connection_send (connection, message, &serial))
270378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
270478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      dbus_message_unref (message);
270578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      return TRUE;
270678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
270778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
270878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  dbus_message_unref (message);
270978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  message = NULL;
271078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
271178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  bus_test_run_everything (context);
2712dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to activating segfault service");
271378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  bus_test_run_everything (context);
271478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
271578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (!dbus_connection_get_is_connected (connection))
271678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
2717d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
271878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      return TRUE;
271978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
2720b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
272178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  retval = FALSE;
2722b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
272378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  message = pop_message_waiting_for_memory (connection);
272478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (message == NULL)
272578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
272678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
27278873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                  "StartServiceByName", serial, connection);
272878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      goto out;
272978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
273078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
2731d0c588575e3e2911eacb098fac26f02d1010cbfdHavoc Pennington  verbose_message_received (connection, message);
273278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
2733b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
273478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
2735248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
273678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        {
273778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          _dbus_warn ("Message has wrong sender %s\n",
273878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington                      dbus_message_get_sender (message) ?
273978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington                      dbus_message_get_sender (message) : "(none)");
274078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          goto out;
274178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        }
2742b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
274368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      if (dbus_message_is_error (message,
274468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                 DBUS_ERROR_NO_MEMORY))
274578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        {
274678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          ; /* good, this is a valid response */
274778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        }
274868a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington      else if (dbus_message_is_error (message,
2749c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_FAILED))
2750c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
2751c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          const char *servicehelper;
2752c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          servicehelper = bus_context_get_servicehelper (context);
2753c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          /* make sure this only happens with the launch helper */
2754c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_assert (servicehelper != NULL);
2755c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
2756c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
275768a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                      DBUS_ERROR_SPAWN_CHILD_SIGNALED))
275878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        {
275978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          ; /* good, this is expected also */
276078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        }
276178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      else
276278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        {
276368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington          warn_unexpected (connection, message, "not this error");
276468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington
276578e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington          goto out;
276678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington        }
276778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
276878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  else
276978e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    {
277078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      _dbus_warn ("Did not expect to successfully activate segfault service\n");
277178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington      goto out;
277278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    }
277378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
277478e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  retval = TRUE;
2775b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
277678e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington out:
277778e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  if (message)
277878e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington    dbus_message_unref (message);
2779b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
278078e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington  return retval;
278178e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington}
278278e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington
278393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
278493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens,
278593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors.
278693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */
278793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t
2788f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_segfault_service_auto_start (BusContext     *context,
2789f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                   DBusConnection *connection)
279093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{
279193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  DBusMessage *message;
279293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_uint32_t serial;
279393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_bool_t retval;
279493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
279593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteSegfaultService",
279693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "/org/freedesktop/TestSuite",
279793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "org.freedesktop.TestSuite",
279893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "Echo");
2799b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
280093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
280193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    return TRUE;
2802b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
280393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_send (connection, message, &serial))
280493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
280593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_message_unref (message);
280693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
280793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
280893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
280993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_message_unref (message);
281093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = NULL;
281193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
281293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
2813dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to Echo on segfault service");
281493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
281593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
281693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_get_is_connected (connection))
281793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
2818d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
281993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
282093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
2821b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
282293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = FALSE;
2823b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
282493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = pop_message_waiting_for_memory (connection);
282593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
282693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
282793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
282893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                  "Echo message (auto activation)", serial, connection);
282993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
283093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
283193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
283293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  verbose_message_received (connection, message);
283393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
283493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
283593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
2836248895207dc15914ac7970a6d1431308075dca1dColin Walters      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
283793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
283893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          _dbus_warn ("Message has wrong sender %s\n",
283993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                      dbus_message_get_sender (message) ?
284093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                      dbus_message_get_sender (message) : "(none)");
284193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
284293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
2843b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
284493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (dbus_message_is_error (message,
284593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                 DBUS_ERROR_NO_MEMORY))
284693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
284793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          ; /* good, this is a valid response */
284893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
284993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      else if (dbus_message_is_error (message,
285093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                      DBUS_ERROR_SPAWN_CHILD_SIGNALED))
285193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
285293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          ; /* good, this is expected also */
285393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
285493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      else
285593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
285693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          warn_unexpected (connection, message, "not this error");
285793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
285893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
285993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
286093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
286193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  else
286293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
286393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      _dbus_warn ("Did not expect to successfully activate segfault service\n");
286493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
286593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
286693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
286793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = TRUE;
2868b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
286993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out:
287093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message)
287193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    dbus_message_unref (message);
2872b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
287393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  return retval;
287493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult}
2875e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif
287693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
287793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#define TEST_ECHO_MESSAGE "Test echo message"
2878a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J#define TEST_RUN_HELLO_FROM_SELF_MESSAGE "Test sending message to self"
2879a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2880a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J/* returns TRUE if the correct thing happens,
2881a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J * but the correct thing may include OOM errors.
2882a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J */
2883a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (Jstatic dbus_bool_t
2884a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (Jcheck_existent_hello_from_self (BusContext     *context,
2885a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                DBusConnection *connection)
2886a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J{
2887a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  DBusMessage *message;
2888a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  dbus_uint32_t serial;
2889a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  const char *text;
2890a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2891a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
2892a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                          "/org/freedesktop/TestSuite",
2893a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                          "org.freedesktop.TestSuite",
2894a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                          "RunHelloFromSelf");
2895b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2896a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (message == NULL)
2897a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    return TRUE;
2898a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2899a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  text = TEST_RUN_HELLO_FROM_SELF_MESSAGE;
2900a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (!dbus_message_append_args (message,
2901a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                 DBUS_TYPE_STRING, &text,
2902a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J                                 DBUS_TYPE_INVALID))
2903a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    {
2904a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      dbus_message_unref (message);
2905a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      return TRUE;
2906a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    }
2907a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2908a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (!dbus_connection_send (connection, message, &serial))
2909a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    {
2910a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      dbus_message_unref (message);
2911a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      return TRUE;
2912a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    }
2913a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2914a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  dbus_message_unref (message);
2915a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  message = NULL;
2916a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2917a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  bus_test_run_everything (context);
2918a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2919a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  /* Note: if this test is run in OOM mode, it will block when the bus
2920a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J   * doesn't send a reply due to OOM.
2921a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J   */
2922a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  block_connection_until_message_from_bus (context, connection, "reply from running hello from self");
2923b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
2924a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  message = pop_message_waiting_for_memory (connection);
2925a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (message == NULL)
2926a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    {
2927a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      _dbus_warn ("Failed to pop message! Should have been reply from RunHelloFromSelf message\n");
29285e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin      return FALSE;
2929a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    }
2930a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2931a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (dbus_message_get_reply_serial (message) != serial)
2932a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    {
2933a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J      _dbus_warn ("Wrong reply serial\n");
29345e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin      dbus_message_unref (message);
29355e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin      return FALSE;
2936a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    }
2937a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
2938a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  dbus_message_unref (message);
2939a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  message = NULL;
2940b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
29415e8110d79aa8c11ad76b3e77791e3e6daca0fa32Mark McLoughlin  return TRUE;
2942a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J}
2943a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
294466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J/* returns TRUE if the correct thing happens,
294566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J * but the correct thing may include OOM errors.
294666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J */
294766e1cb9e68ba37980f7a90c396950be1587cdcd7John (Jstatic dbus_bool_t
294866e1cb9e68ba37980f7a90c396950be1587cdcd7John (Jcheck_existent_ping (BusContext     *context,
294966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J                     DBusConnection *connection)
295066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J{
295166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  DBusMessage *message;
295266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  dbus_uint32_t serial;
295366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
295466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J                                          "/org/freedesktop/TestSuite",
295566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J                                          "org.freedesktop.DBus.Peer",
295666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J                                          "Ping");
2957b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
295866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (message == NULL)
295966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    return TRUE;
296066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
296166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!dbus_connection_send (connection, message, &serial))
296266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    {
296366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      dbus_message_unref (message);
296466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      return TRUE;
296566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    }
296666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
296766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  dbus_message_unref (message);
296866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  message = NULL;
296966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
297066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  bus_test_run_everything (context);
297166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
297266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  /* Note: if this test is run in OOM mode, it will block when the bus
297366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J   * doesn't send a reply due to OOM.
297466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J   */
297566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  block_connection_until_message_from_bus (context, connection, "reply from running Ping");
2976b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
297766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  message = pop_message_waiting_for_memory (connection);
297866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (message == NULL)
297966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    {
298066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      _dbus_warn ("Failed to pop message! Should have been reply from Ping message\n");
298166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      return FALSE;
298266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    }
298366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
298466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (dbus_message_get_reply_serial (message) != serial)
298566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    {
298666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      _dbus_warn ("Wrong reply serial\n");
298766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      dbus_message_unref (message);
298866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      return FALSE;
298966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    }
299066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
299166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
299266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    {
299366e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      _dbus_warn ("Unexpected message return during Ping\n");
299466e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      dbus_message_unref (message);
299566e1cb9e68ba37980f7a90c396950be1587cdcd7John (J      return FALSE;
299666e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    }
299766e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
299866e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  dbus_message_unref (message);
299966e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  message = NULL;
3000b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
300166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  return TRUE;
300266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J}
300393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
300493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult/* returns TRUE if the correct thing happens,
300593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult * but the correct thing may include OOM errors.
300693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult */
300793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hultstatic dbus_bool_t
3008d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtoncheck_existent_get_machine_id (BusContext     *context,
3009d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                               DBusConnection *connection)
3010d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
3011d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusMessage *message;
3012d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_uint32_t serial;
3013d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  const char *machine_id;
3014b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3015d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
3016d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                          "/org/freedesktop/TestSuite",
3017d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                          "org.freedesktop.DBus.Peer",
3018d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                          "GetMachineId");
3019b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3020d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (message == NULL)
3021d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    return TRUE;
3022d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3023d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!dbus_connection_send (connection, message, &serial))
3024d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3025d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_message_unref (message);
3026d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return TRUE;
3027d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3028d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3029d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_message_unref (message);
3030d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  message = NULL;
3031d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3032d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  bus_test_run_everything (context);
3033d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3034d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  /* Note: if this test is run in OOM mode, it will block when the bus
3035d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * doesn't send a reply due to OOM.
3036d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   */
3037d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply from running GetMachineId");
3038b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3039d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  message = pop_message_waiting_for_memory (connection);
3040d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (message == NULL)
3041d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3042d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _dbus_warn ("Failed to pop message! Should have been reply from GetMachineId message\n");
3043d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
3044d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3045d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3046d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (dbus_message_get_reply_serial (message) != serial)
3047d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3048d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _dbus_warn ("Wrong reply serial\n");
3049d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_message_unref (message);
3050d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
3051d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3052d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3053d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)
3054d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3055d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _dbus_warn ("Unexpected message return during GetMachineId\n");
3056d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_message_unref (message);
3057d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
3058d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3059d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3060d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  machine_id = NULL;
3061d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &machine_id, DBUS_TYPE_INVALID))
3062d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3063d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _dbus_warn ("Did not get a machine ID in reply to GetMachineId\n");
3064d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_message_unref (message);
3065d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
3066d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3067d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3068d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (machine_id == NULL || strlen (machine_id) != 32)
3069d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
3070d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _dbus_warn ("Machine id looks bogus: '%s'\n", machine_id ? machine_id : "null");
3071d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_message_unref (message);
3072d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
3073d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
3074b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3075d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  /* We can't check that the machine id is correct because during make check it is
3076d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * just made up for each process separately
3077d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   */
3078b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3079d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_message_unref (message);
3080d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  message = NULL;
3081b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3082d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return TRUE;
3083d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
3084d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
3085d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/* returns TRUE if the correct thing happens,
3086d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * but the correct thing may include OOM errors.
3087d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
3088d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t
3089f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Penningtoncheck_existent_service_auto_start (BusContext     *context,
3090f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                                   DBusConnection *connection)
309193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult{
309293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  DBusMessage *message;
30939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusMessage *base_service_message;
309493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_uint32_t serial;
309593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_bool_t retval;
30969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *base_service;
30979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *text;
309893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
30999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  base_service_message = NULL;
310093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
310193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = dbus_message_new_method_call (EXISTENT_SERVICE_NAME,
310293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "/org/freedesktop/TestSuite",
310393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "org.freedesktop.TestSuite",
310493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                          "Echo");
3105b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
310693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
310793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    return TRUE;
310893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
31099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  text = TEST_ECHO_MESSAGE;
311093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_message_append_args (message,
31119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 DBUS_TYPE_STRING, &text,
311293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                 DBUS_TYPE_INVALID))
311393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
311493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_message_unref (message);
311593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
311693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
311793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
311893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_send (connection, message, &serial))
311993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
312093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_message_unref (message);
312193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
312293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
312393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
312493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  dbus_message_unref (message);
312593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = NULL;
312693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
312793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
312893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
312993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  /* now wait for the message bus to hear back from the activated
313093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult   * service.
313193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult   */
3132dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply to Echo on existent service");
313393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  bus_test_run_everything (context);
313493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
313593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (!dbus_connection_get_is_connected (connection))
313693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
3137d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
313893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      return TRUE;
313993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
314093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
314193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = FALSE;
3142b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
314393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  message = pop_message_waiting_for_memory (connection);
314493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message == NULL)
314593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
31468873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington      _dbus_warn ("Did not receive any messages after auto start %d on %p\n",
314793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                  serial, connection);
314893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      goto out;
314993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
315093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
315193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  verbose_message_received (connection, message);
31528873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_verbose ("  (after sending %s)\n", "auto start");
315393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
315485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  /* we should get zero or two ServiceOwnerChanged signals */
315585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
315693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    {
315785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      GotServiceInfo message_kind;
315893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
315993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (!check_base_service_activated (context, connection,
316093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult                                         message, &base_service))
3161075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        goto out;
3162075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3163075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      base_service_message = message;
3164075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      message = NULL;
3165075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3166075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      /* We may need to block here for the test service to exit or finish up */
3167075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      block_connection_until_message_from_bus (context, connection, "service to exit");
3168075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3169075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      /* Should get a service creation notification for the activated
3170075945f611290f2b9db9a4ed6cf5433f2fd85785John (J       * service name, or a service deletion on the base service name
3171075945f611290f2b9db9a4ed6cf5433f2fd85785John (J       */
3172075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      message = dbus_connection_borrow_message (connection);
3173075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      if (message == NULL)
3174075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3175075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_warn ("No message after auto activation "
3176cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen                      "(should be a service announcement)\n");
3177075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          dbus_connection_return_message (connection, message);
3178075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = NULL;
3179075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
3180075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3181075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3182075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      message_kind = check_got_service_info (message);
3183075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3184075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      dbus_connection_return_message (connection, message);
3185075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      message = NULL;
3186075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3187b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      switch (message_kind)
3188075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3189075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_CREATED:
3190075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = pop_message_waiting_for_memory (connection);
3191075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (message == NULL)
3192075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
3193075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              _dbus_warn ("Failed to pop message we just put back! "
3194075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                          "should have been a NameOwnerChanged (creation)\n");
3195075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
3196075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
3197b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3198075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          /* Check that ServiceOwnerChanged (creation) was correctly received */
3199075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (!check_service_auto_activated (context, connection, EXISTENT_SERVICE_NAME,
3200075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                             base_service, message))
3201075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            goto out;
3202b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3203075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          dbus_message_unref (message);
3204075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = NULL;
3205075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3206075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          break;
3207075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3208075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_DELETED:
3209075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          {
3210075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            /* The service started up and got a base address, but then
3211075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             * failed to register under EXISTENT_SERVICE_NAME
3212075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             */
3213075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            CheckServiceOwnerChangedData socd;
3214b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3215075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_kind = SERVICE_DELETED;
3216075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_service_name = base_service;
3217075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.failed = FALSE;
3218075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.skip_connection = NULL;
3219075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            bus_test_clients_foreach (check_service_owner_changed_foreach,
3220075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      &socd);
3221075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3222075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            if (socd.failed)
3223075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
3224075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3225075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            break;
3226075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          }
3227075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3228075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_ERROR:
3229075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SOMETHING_ELSE:
3230075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_warn ("Unexpected message after auto activation\n");
3231075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
3232075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3233075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3234075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3235075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  /* OK, now we've dealt with ServiceOwnerChanged signals, now should
3236075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   * come the method reply (or error) from the initial method call
3237075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   */
3238075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3239075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  /* Note: if this test is run in OOM mode, it will block when the bus
3240075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   * doesn't send a reply due to OOM.
3241075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   */
3242075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation");
3243b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3244075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = pop_message_waiting_for_memory (connection);
3245075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message == NULL)
3246075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3247075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      _dbus_warn ("Failed to pop message! Should have been reply from echo message\n");
3248075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3249075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3250075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3251075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (dbus_message_get_reply_serial (message) != serial)
3252075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3253075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      _dbus_warn ("Wrong reply serial\n");
3254075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3255075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3256075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3257075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_message_unref (message);
3258075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = NULL;
3259a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
326066e1cb9e68ba37980f7a90c396950be1587cdcd7John (J  if (!check_existent_ping (context, connection))
326166e1cb9e68ba37980f7a90c396950be1587cdcd7John (J    goto out;
326266e1cb9e68ba37980f7a90c396950be1587cdcd7John (J
3263d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!check_existent_get_machine_id (context, connection))
3264d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    goto out;
3265b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3266a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J  if (!check_existent_hello_from_self (context, connection))
3267a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J    goto out;
3268a7595655fb892b4ecab852aeb971cf53bdff09ccJohn (J
3269075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!check_send_exit_to_service (context, connection,
3270075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                   EXISTENT_SERVICE_NAME,
3271075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                   base_service))
3272075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    goto out;
3273b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3274075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  retval = TRUE;
3275075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3276075945f611290f2b9db9a4ed6cf5433f2fd85785John (J out:
3277075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message)
3278075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    dbus_message_unref (message);
3279075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3280075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (base_service_message)
3281075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    dbus_message_unref (base_service_message);
3282075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3283075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  return retval;
3284075945f611290f2b9db9a4ed6cf5433f2fd85785John (J}
3285075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3286c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_FILE_MISSING_NAME "org.freedesktop.DBus.TestSuiteEchoServiceDotServiceFileDoesNotExist"
3287c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3288c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens,
3289c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors.
3290c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */
3291c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
3292c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_file_missing (BusContext     *context,
3293c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                   DBusConnection *connection)
3294c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
3295c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusMessage *message;
3296c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_uint32_t serial;
3297c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_bool_t retval;
3298c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3299c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = dbus_message_new_method_call (SERVICE_FILE_MISSING_NAME,
3300c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "/org/freedesktop/TestSuite",
3301c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "org.freedesktop.TestSuite",
3302c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "Echo");
3303b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3304c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3305c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return TRUE;
3306c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3307c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_send (connection, message, &serial))
3308c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3309c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      dbus_message_unref (message);
3310c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3311c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3312c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3313c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_message_unref (message);
3314c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = NULL;
3315c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3316c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3317c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  block_connection_until_message_from_bus (context, connection, "reply to service file missing should fail to auto-start");
3318c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3319c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3320c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_get_is_connected (connection))
3321c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3322d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
3323c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3324c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3325b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3326c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = FALSE;
3327b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3328c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = pop_message_waiting_for_memory (connection);
3329c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3330c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3331c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
3332c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                  "Echo message (auto activation)", serial, connection);
3333c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3334c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3335c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3336c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  verbose_message_received (connection, message);
3337c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3338c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
3339c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3340c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
3341c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3342c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_warn ("Message has wrong sender %s\n",
3343c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) ?
3344c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) : "(none)");
3345c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3346c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3347b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3348c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (dbus_message_is_error (message,
3349c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                 DBUS_ERROR_NO_MEMORY))
3350c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3351c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is a valid response */
3352c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3353c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3354c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SERVICE_UNKNOWN))
3355c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3356c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("got service unknown\n");
3357c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is expected (only valid when using launch helper) */
3358c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3359c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else
3360c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3361c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          warn_unexpected (connection, message, "not this error");
3362c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3363c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3364c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3365c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3366c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  else
3367c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3368c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not expect to successfully auto-start missing service\n");
3369c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3370c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3371c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3372c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = TRUE;
3373b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3374c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out:
3375c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message)
3376c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    dbus_message_unref (message);
3377b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3378c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return retval;
3379c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
3380c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3381c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_USER_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoUser"
3382c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3383c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens,
3384c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors.
3385c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */
3386c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
3387c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_user_missing (BusContext     *context,
3388c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                   DBusConnection *connection)
3389c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
3390c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusMessage *message;
3391c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_uint32_t serial;
3392c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_bool_t retval;
3393c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3394c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = dbus_message_new_method_call (SERVICE_USER_MISSING_NAME,
3395c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "/org/freedesktop/TestSuite",
3396c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "org.freedesktop.TestSuite",
3397c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "Echo");
3398c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3399c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3400c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return TRUE;
3401c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3402c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_send (connection, message, &serial))
3403c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3404c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      dbus_message_unref (message);
3405c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3406c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3407c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3408c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_message_unref (message);
3409c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = NULL;
3410c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3411c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3412c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  block_connection_until_message_from_bus (context, connection,
3413c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  					   "reply to service which should fail to auto-start (missing User)");
3414c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3415c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3416c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_get_is_connected (connection))
3417c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3418d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_warn ("connection was disconnected\n");
3419c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3420c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3421b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3422c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = FALSE;
3423b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3424c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = pop_message_waiting_for_memory (connection);
3425c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3426c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3427c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
3428c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                  "Echo message (auto activation)", serial, connection);
3429c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3430c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3431c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3432c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  verbose_message_received (connection, message);
3433c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3434c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
3435c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3436c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
3437c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3438c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_warn ("Message has wrong sender %s\n",
3439c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) ?
3440c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) : "(none)");
3441c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3442c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3443b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3444c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (dbus_message_is_error (message,
3445c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                 DBUS_ERROR_NO_MEMORY))
3446c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3447c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is a valid response */
3448c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3449c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3450c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SPAWN_FILE_INVALID))
3451c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3452c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("got service file invalid\n");
3453c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is expected (only valid when using launch helper) */
3454c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3455c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else
3456c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3457c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          warn_unexpected (connection, message, "not this error");
3458c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3459c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3460c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3461c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3462c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  else
3463c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3464c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not expect to successfully auto-start missing service\n");
3465c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3466c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3467c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3468c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = TRUE;
3469b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3470c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out:
3471c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message)
3472c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    dbus_message_unref (message);
3473b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3474c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return retval;
3475c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
3476c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3477c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_EXEC_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoExec"
3478c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3479c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens,
3480c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors.
3481c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */
3482c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
3483c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_exec_missing (BusContext     *context,
3484c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                   DBusConnection *connection)
3485c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
3486c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusMessage *message;
3487c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_uint32_t serial;
3488c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_bool_t retval;
3489c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3490c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = dbus_message_new_method_call (SERVICE_EXEC_MISSING_NAME,
3491c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "/org/freedesktop/TestSuite",
3492c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "org.freedesktop.TestSuite",
3493c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "Echo");
3494c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3495c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3496c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return TRUE;
3497c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3498c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_send (connection, message, &serial))
3499c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3500c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      dbus_message_unref (message);
3501c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3502c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3503c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3504c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_message_unref (message);
3505c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = NULL;
3506c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3507c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3508c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  block_connection_until_message_from_bus (context, connection,
3509c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  					   "reply to service which should fail to auto-start (missing Exec)");
3510c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3511c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3512c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_get_is_connected (connection))
3513c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3514d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_warn ("connection was disconnected\n");
3515c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3516c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3517b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3518c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = FALSE;
3519b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3520c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = pop_message_waiting_for_memory (connection);
3521c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3522c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3523c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
3524c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                  "Echo message (auto activation)", serial, connection);
3525c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3526c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3527c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3528c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  verbose_message_received (connection, message);
3529c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3530c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
3531c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3532c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
3533c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3534c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_warn ("Message has wrong sender %s\n",
3535c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) ?
3536c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) : "(none)");
3537c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3538c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3539b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3540c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (dbus_message_is_error (message,
3541c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                 DBUS_ERROR_NO_MEMORY))
3542c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3543c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is a valid response */
3544c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3545c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3546c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SERVICE_UNKNOWN))
3547c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3548c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("could not activate as invalid service file was not added\n");
3549c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is expected as we shouldn't have been added to
3550c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes             * the activation list with a missing Exec key */
3551c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3552c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3553c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SPAWN_FILE_INVALID))
3554c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3555c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("got service file invalid\n");
3556c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is allowed, and is the message passed back from the
3557c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes             * launch helper */
3558c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3559c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else
3560c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3561c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          warn_unexpected (connection, message, "not this error");
3562c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3563c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3564c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3565c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3566c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  else
3567c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3568c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not expect to successfully auto-start missing service\n");
3569c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3570c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3571c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3572c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = TRUE;
3573b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3574c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out:
3575c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message)
3576c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    dbus_message_unref (message);
3577b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3578c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return retval;
3579c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
3580c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3581c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes#define SERVICE_SERVICE_MISSING_NAME "org.freedesktop.DBus.TestSuiteNoService"
3582c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3583c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes/* returns TRUE if the correct thing happens,
3584c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes * but the correct thing may include OOM errors.
3585c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes */
3586c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
3587c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughescheck_launch_service_service_missing (BusContext     *context,
3588c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBusConnection *connection)
3589c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
3590c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusMessage *message;
3591c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_uint32_t serial;
3592c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_bool_t retval;
3593c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3594c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = dbus_message_new_method_call (SERVICE_SERVICE_MISSING_NAME,
3595c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "/org/freedesktop/TestSuite",
3596c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "org.freedesktop.TestSuite",
3597c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                          "Echo");
3598c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3599c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3600c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return TRUE;
3601c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3602c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_send (connection, message, &serial))
3603c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3604c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      dbus_message_unref (message);
3605c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3606c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3607c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3608c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_message_unref (message);
3609c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = NULL;
3610c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3611c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3612c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  block_connection_until_message_from_bus (context, connection,
3613c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  					   "reply to service which should fail to auto-start (missing Service)");
3614c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_test_run_everything (context);
3615c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3616c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!dbus_connection_get_is_connected (connection))
3617c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3618d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_warn ("connection was disconnected\n");
3619c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      return TRUE;
3620c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3621b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3622c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = FALSE;
3623b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3624c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  message = pop_message_waiting_for_memory (connection);
3625c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message == NULL)
3626c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3627c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
3628c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                  "Echo message (auto activation)", serial, connection);
3629c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3630c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3631c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3632c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  verbose_message_received (connection, message);
3633c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3634c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
3635c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3636c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
3637c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3638c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_warn ("Message has wrong sender %s\n",
3639c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) ?
3640c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                      dbus_message_get_sender (message) : "(none)");
3641c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3642c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3643b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3644c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      if (dbus_message_is_error (message,
3645c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                 DBUS_ERROR_NO_MEMORY))
3646c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3647c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is a valid response */
3648c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3649c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3650c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SERVICE_UNKNOWN))
3651c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3652c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("could not activate as invalid service file was not added\n");
3653c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is expected as we shouldn't have been added to
3654c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes             * the activation list with a missing Exec key */
3655c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3656c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else if (dbus_message_is_error (message,
3657c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes                                      DBUS_ERROR_SPAWN_FILE_INVALID))
3658c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3659c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          _dbus_verbose("got service file invalid\n");
3660c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          ; /* good, this is allowed, and is the message passed back from the
3661c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes             * launch helper */
3662c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3663c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      else
3664c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        {
3665c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          warn_unexpected (connection, message, "not this error");
3666c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3667c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes          goto out;
3668c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes        }
3669c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3670c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  else
3671c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    {
3672c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_warn ("Did not expect to successfully auto-start missing service\n");
3673c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      goto out;
3674c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    }
3675c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3676c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  retval = TRUE;
3677b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3678c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes out:
3679c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (message)
3680c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    dbus_message_unref (message);
3681b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3682c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return retval;
3683c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
3684c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
3685075945f611290f2b9db9a4ed6cf5433f2fd85785John (J#define SHELL_FAIL_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceFail"
3686075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3687075945f611290f2b9db9a4ed6cf5433f2fd85785John (J/* returns TRUE if the correct thing happens,
3688075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * but the correct thing may include OOM errors.
3689075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */
3690075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jstatic dbus_bool_t
3691075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jcheck_shell_fail_service_auto_start (BusContext     *context,
3692075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                     DBusConnection *connection)
3693075945f611290f2b9db9a4ed6cf5433f2fd85785John (J{
3694075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  DBusMessage *message;
3695075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_uint32_t serial;
3696075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_bool_t retval;
3697075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3698075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = dbus_message_new_method_call (SHELL_FAIL_SERVICE_NAME,
3699075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "/org/freedesktop/TestSuite",
3700075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "org.freedesktop.TestSuite",
3701075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "Echo");
3702b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3703075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message == NULL)
3704075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    return TRUE;
3705b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3706075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!dbus_connection_send (connection, message, &serial))
3707075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3708075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      dbus_message_unref (message);
3709075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      return TRUE;
3710075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3711075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3712075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_message_unref (message);
3713075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = NULL;
3714075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3715075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  bus_test_run_everything (context);
3716075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  block_connection_until_message_from_bus (context, connection, "reply to shell Echo on service which should fail to auto-start");
3717075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  bus_test_run_everything (context);
3718075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3719075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!dbus_connection_get_is_connected (connection))
3720075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3721d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
3722075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      return TRUE;
3723075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3724b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3725075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  retval = FALSE;
3726b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3727075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = pop_message_waiting_for_memory (connection);
3728075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message == NULL)
3729075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3730075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
3731075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                  "Echo message (auto activation)", serial, connection);
3732075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3733075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3734075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3735075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  verbose_message_received (connection, message);
3736075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3737075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
3738075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3739075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
3740075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3741075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_warn ("Message has wrong sender %s\n",
3742075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                      dbus_message_get_sender (message) ?
3743075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                      dbus_message_get_sender (message) : "(none)");
3744075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
3745075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3746b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3747075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      if (dbus_message_is_error (message,
3748075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                 DBUS_ERROR_NO_MEMORY))
3749075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3750075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          ; /* good, this is a valid response */
3751075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3752075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      else if (dbus_message_is_error (message,
3753075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      DBUS_ERROR_INVALID_ARGS))
3754075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3755075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_verbose("got invalid args\n");
3756075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          ; /* good, this is expected also */
3757075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3758075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      else
3759075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3760075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          warn_unexpected (connection, message, "not this error");
3761075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3762075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
3763075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
3764075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3765075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  else
3766075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3767075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      _dbus_warn ("Did not expect to successfully auto-start shell fail service\n");
3768075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3769075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3770075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3771075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  retval = TRUE;
3772b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3773075945f611290f2b9db9a4ed6cf5433f2fd85785John (J out:
3774075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message)
3775075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    dbus_message_unref (message);
3776b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3777075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  return retval;
3778075945f611290f2b9db9a4ed6cf5433f2fd85785John (J}
3779075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3780075945f611290f2b9db9a4ed6cf5433f2fd85785John (J#define SHELL_SUCCESS_SERVICE_NAME "org.freedesktop.DBus.TestSuiteShellEchoServiceSuccess"
3781075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3782075945f611290f2b9db9a4ed6cf5433f2fd85785John (J/* returns TRUE if the correct thing happens,
3783075945f611290f2b9db9a4ed6cf5433f2fd85785John (J * but the correct thing may include OOM errors.
3784075945f611290f2b9db9a4ed6cf5433f2fd85785John (J */
3785075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jstatic dbus_bool_t
3786075945f611290f2b9db9a4ed6cf5433f2fd85785John (Jcheck_shell_service_success_auto_start (BusContext     *context,
3787075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                        DBusConnection *connection)
3788075945f611290f2b9db9a4ed6cf5433f2fd85785John (J{
3789075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  DBusMessage *message;
3790075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  DBusMessage *base_service_message;
3791075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_uint32_t serial;
3792075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_bool_t retval;
3793075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  const char *base_service;
3794075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  const char *argv[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL};
3795075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3796075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  base_service_message = NULL;
3797075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3798075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = dbus_message_new_method_call (SHELL_SUCCESS_SERVICE_NAME,
3799075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "/org/freedesktop/TestSuite",
3800075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "org.freedesktop.TestSuite",
3801075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                          "Echo");
3802b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3803075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message == NULL)
3804075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    return TRUE;
3805075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3806075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!dbus_connection_send (connection, message, &serial))
3807075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3808075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      dbus_message_unref (message);
3809075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      return TRUE;
3810075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3811075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3812075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  dbus_message_unref (message);
3813075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = NULL;
3814075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3815075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  bus_test_run_everything (context);
3816075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3817075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  /* now wait for the message bus to hear back from the activated
3818075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   * service.
3819075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   */
3820075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  block_connection_until_message_from_bus (context, connection, "reply to Echo on shell success service");
3821075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  bus_test_run_everything (context);
3822075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3823075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!dbus_connection_get_is_connected (connection))
3824075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3825d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
3826075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      return TRUE;
3827075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3828075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3829075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  retval = FALSE;
3830b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3831075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  message = pop_message_waiting_for_memory (connection);
3832075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (message == NULL)
3833075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3834075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      _dbus_warn ("Did not receive any messages after auto start %d on %p\n",
3835075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                  serial, connection);
3836075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3837075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3838075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3839075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  verbose_message_received (connection, message);
3840075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  _dbus_verbose ("  (after sending %s)\n", "auto start");
3841075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3842075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  /* we should get zero or two ServiceOwnerChanged signals */
3843075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_SIGNAL)
3844075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3845075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      GotServiceInfo message_kind;
3846075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3847075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      if (!check_base_service_activated (context, connection,
3848075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                         message, &base_service))
3849075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        goto out;
385093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
38519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      base_service_message = message;
385293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      message = NULL;
385393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
385493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      /* We may need to block here for the test service to exit or finish up */
3855dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      block_connection_until_message_from_bus (context, connection, "service to exit");
385693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
385785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      /* Should get a service creation notification for the activated
385885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu       * service name, or a service deletion on the base service name
385993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult       */
386093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      message = dbus_connection_borrow_message (connection);
386193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      if (message == NULL)
386293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        {
3863075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_warn ("No message after auto activation "
3864cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen                      "(should be a service announcement)\n");
3865075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          dbus_connection_return_message (connection, message);
3866075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = NULL;
386793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult          goto out;
386893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult        }
386993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
387085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      message_kind = check_got_service_info (message);
387193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
387293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      dbus_connection_return_message (connection, message);
387393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult      message = NULL;
387493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
3875b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      switch (message_kind)
3876075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        {
3877075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_CREATED:
3878075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = pop_message_waiting_for_memory (connection);
3879075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (message == NULL)
3880075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            {
3881075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              _dbus_warn ("Failed to pop message we just put back! "
3882075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                          "should have been a NameOwnerChanged (creation)\n");
3883075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
3884075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            }
3885b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3886075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          /* Check that ServiceOwnerChanged (creation) was correctly received */
3887075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          if (!check_service_auto_activated (context, connection, SHELL_SUCCESS_SERVICE_NAME,
3888075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                             base_service, message))
3889075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            goto out;
3890b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3891075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          dbus_message_unref (message);
3892075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          message = NULL;
3893075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3894075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          break;
389585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
3896075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SERVICE_DELETED:
3897075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          {
3898075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            /* The service started up and got a base address, but then
3899075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             * failed to register under SHELL_SUCCESS_SERVICE_NAME
3900075945f611290f2b9db9a4ed6cf5433f2fd85785John (J             */
3901075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            CheckServiceOwnerChangedData socd;
3902b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3903075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_kind = SERVICE_DELETED;
3904075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.expected_service_name = base_service;
3905075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.failed = FALSE;
3906075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            socd.skip_connection = NULL;
3907075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            bus_test_clients_foreach (check_service_owner_changed_foreach,
3908075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                      &socd);
3909075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3910075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            if (socd.failed)
3911075945f611290f2b9db9a4ed6cf5433f2fd85785John (J              goto out;
391293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
3913075945f611290f2b9db9a4ed6cf5433f2fd85785John (J            break;
3914075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          }
391585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
391685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu        case GOT_ERROR:
3917075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        case GOT_SOMETHING_ELSE:
3918075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          _dbus_warn ("Unexpected message after auto activation\n");
3919075945f611290f2b9db9a4ed6cf5433f2fd85785John (J          goto out;
3920075945f611290f2b9db9a4ed6cf5433f2fd85785John (J        }
392185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    }
392293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
392385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  /* OK, now we've dealt with ServiceOwnerChanged signals, now should
392485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu   * come the method reply (or error) from the initial method call
392585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu   */
392685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
392785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  /* Note: if this test is run in OOM mode, it will block when the bus
392885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu   * doesn't send a reply due to OOM.
392985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu   */
3930dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  block_connection_until_message_from_bus (context, connection, "reply from echo message after auto-activation");
3931b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
393285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  message = pop_message_waiting_for_memory (connection);
393385f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (message == NULL)
393485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    {
393585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      _dbus_warn ("Failed to pop message! Should have been reply from echo message\n");
393685f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      goto out;
393785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    }
393885f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
393985f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (dbus_message_get_reply_serial (message) != serial)
394085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    {
394185f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      _dbus_warn ("Wrong reply serial\n");
394285f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu      goto out;
394393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    }
394485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu
3945075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (!dbus_message_get_args (message, NULL,
3946b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                                       DBUS_TYPE_STRING, &argv[0],
3947075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[1],
3948075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[2],
3949075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[3],
3950075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[4],
3951075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[5],
3952075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_STRING, &argv[6],
3953075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                       DBUS_TYPE_INVALID))
3954075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3955cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen      _dbus_warn ("Error getting arguments from return\n");
3956075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3957075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    }
3958075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3959b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering   /* don't worry about arg[0] as it may be different
3960075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      depending on the path to the tests
3961075945f611290f2b9db9a4ed6cf5433f2fd85785John (J   */
3962075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("-test", argv[1]) != 0)
3963075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3964b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n",
3965075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                  "-test", argv[1]);
3966075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3967b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
3968075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3969075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("that", argv[2]) != 0)
3970075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3971b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n",
3972075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                   "that", argv[2]);
3973075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3974b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
3975075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3976075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("we get", argv[3]) != 0)
3977075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3978b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n",
3979075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                   "we get", argv[3]);
3980075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3981b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
3982b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3983075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("back", argv[4]) != 0)
3984075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3985b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n",
3986075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                   "back", argv[4]);
3987075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3988b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
3989075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3990075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("--what", argv[5]) != 0)
3991075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3992b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n",
3993075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                   "--what", argv[5]);
3994075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
3995b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
3996075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
3997075945f611290f2b9db9a4ed6cf5433f2fd85785John (J  if (strcmp("we put in", argv[6]) != 0)
3998075945f611290f2b9db9a4ed6cf5433f2fd85785John (J    {
3999b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering      _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n",
4000075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                   "we put in", argv[6]);
4001075945f611290f2b9db9a4ed6cf5433f2fd85785John (J      goto out;
4002b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
4003075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
400485f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  dbus_message_unref (message);
400585f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  message = NULL;
4006b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
400785f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu  if (!check_send_exit_to_service (context, connection,
4008075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                   SHELL_SUCCESS_SERVICE_NAME,
4009075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                                   base_service))
401085f8f62da6bb26d7033310af9d3260b073efe4bfOlivier Andrieu    goto out;
4011b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
401293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  retval = TRUE;
401393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
401493f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult out:
401593f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  if (message)
401693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult    dbus_message_unref (message);
401793f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
40189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (base_service_message)
40199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    dbus_message_unref (base_service_message);
402093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
402193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  return retval;
402293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult}
402393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
4024bf99381351b802fb3348a24037898222aae631e2Havoc Penningtontypedef struct
4025f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington{
4026bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  Check1Func func;
4027bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  BusContext *context;
4028bf99381351b802fb3348a24037898222aae631e2Havoc Pennington} Check1Data;
4029f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4030bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic dbus_bool_t
4031bf99381351b802fb3348a24037898222aae631e2Havoc Penningtoncheck_oom_check1_func (void *data)
4032bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
4033bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  Check1Data *d = data;
4034f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4035bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  if (! (* d->func) (d->context))
4036bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    return FALSE;
4037b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4038bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  if (!check_no_leftovers (d->context))
4039f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington    {
4040fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      _dbus_warn ("Messages were left over, should be covered by test suite\n");
4041bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      return FALSE;
4042bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    }
4043f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4044bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  return TRUE;
4045bf99381351b802fb3348a24037898222aae631e2Havoc Pennington}
4046f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4047bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic void
4048bf99381351b802fb3348a24037898222aae631e2Havoc Penningtoncheck1_try_iterations (BusContext *context,
4049bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                       const char *description,
4050bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                       Check1Func  func)
4051bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
4052bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  Check1Data d;
4053f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4054bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  d.func = func;
4055bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  d.context = context;
4056f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington
4057bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  if (!_dbus_test_oom_handling (description, check_oom_check1_func,
4058bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                                &d))
4059bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    _dbus_assert_not_reached ("test failed");
4060f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington}
4061f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
40627628b541258d906e27e2000a402ed2d02383479cJohn (Jstatic dbus_bool_t
40637628b541258d906e27e2000a402ed2d02383479cJohn (Jcheck_get_services (BusContext     *context,
40647628b541258d906e27e2000a402ed2d02383479cJohn (J		    DBusConnection *connection,
40657628b541258d906e27e2000a402ed2d02383479cJohn (J		    const char     *method,
40667628b541258d906e27e2000a402ed2d02383479cJohn (J		    char         ***services,
40677628b541258d906e27e2000a402ed2d02383479cJohn (J		    int            *len)
40687628b541258d906e27e2000a402ed2d02383479cJohn (J{
40697628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessage *message;
40707628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_uint32_t serial;
40717628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_bool_t retval;
40727628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusError error;
40737628b541258d906e27e2000a402ed2d02383479cJohn (J  char **srvs;
40747628b541258d906e27e2000a402ed2d02383479cJohn (J  int l;
40757628b541258d906e27e2000a402ed2d02383479cJohn (J
40767628b541258d906e27e2000a402ed2d02383479cJohn (J  retval = FALSE;
40777628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_error_init (&error);
40787628b541258d906e27e2000a402ed2d02383479cJohn (J  message = NULL;
40797628b541258d906e27e2000a402ed2d02383479cJohn (J
40807628b541258d906e27e2000a402ed2d02383479cJohn (J  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
40817628b541258d906e27e2000a402ed2d02383479cJohn (J					  DBUS_PATH_DBUS,
40827628b541258d906e27e2000a402ed2d02383479cJohn (J					  DBUS_INTERFACE_DBUS,
40837628b541258d906e27e2000a402ed2d02383479cJohn (J					  method);
40847628b541258d906e27e2000a402ed2d02383479cJohn (J
40857628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message == NULL)
40867628b541258d906e27e2000a402ed2d02383479cJohn (J    return TRUE;
40877628b541258d906e27e2000a402ed2d02383479cJohn (J
40887628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_connection_send (connection, message, &serial))
40897628b541258d906e27e2000a402ed2d02383479cJohn (J    {
40907628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (message);
40917628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
40927628b541258d906e27e2000a402ed2d02383479cJohn (J    }
40937628b541258d906e27e2000a402ed2d02383479cJohn (J
40947628b541258d906e27e2000a402ed2d02383479cJohn (J  /* send our message */
40957628b541258d906e27e2000a402ed2d02383479cJohn (J  bus_test_run_clients_loop (SEND_PENDING (connection));
40967628b541258d906e27e2000a402ed2d02383479cJohn (J
40977628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_message_unref (message);
40987628b541258d906e27e2000a402ed2d02383479cJohn (J  message = NULL;
40997628b541258d906e27e2000a402ed2d02383479cJohn (J
41007628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_connection_ref (connection); /* because we may get disconnected */
41017628b541258d906e27e2000a402ed2d02383479cJohn (J  block_connection_until_message_from_bus (context, connection, "reply to ListActivatableNames/ListNames");
41027628b541258d906e27e2000a402ed2d02383479cJohn (J
41037628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_connection_get_is_connected (connection))
41047628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4105d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
41067628b541258d906e27e2000a402ed2d02383479cJohn (J
41077628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_connection_unref (connection);
41087628b541258d906e27e2000a402ed2d02383479cJohn (J
41097628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
41107628b541258d906e27e2000a402ed2d02383479cJohn (J    }
41117628b541258d906e27e2000a402ed2d02383479cJohn (J
41127628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_connection_unref (connection);
41137628b541258d906e27e2000a402ed2d02383479cJohn (J
41147628b541258d906e27e2000a402ed2d02383479cJohn (J  message = pop_message_waiting_for_memory (connection);
41157628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message == NULL)
41167628b541258d906e27e2000a402ed2d02383479cJohn (J    {
41177628b541258d906e27e2000a402ed2d02383479cJohn (J      _dbus_warn ("Did not receive a reply to %s %d on %p\n",
41187628b541258d906e27e2000a402ed2d02383479cJohn (J		  method, serial, connection);
41197628b541258d906e27e2000a402ed2d02383479cJohn (J      goto out;
41207628b541258d906e27e2000a402ed2d02383479cJohn (J    }
41217628b541258d906e27e2000a402ed2d02383479cJohn (J
41227628b541258d906e27e2000a402ed2d02383479cJohn (J  verbose_message_received (connection, message);
41237628b541258d906e27e2000a402ed2d02383479cJohn (J
41247628b541258d906e27e2000a402ed2d02383479cJohn (J  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
41257628b541258d906e27e2000a402ed2d02383479cJohn (J    {
41267628b541258d906e27e2000a402ed2d02383479cJohn (J      if (dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY))
41277628b541258d906e27e2000a402ed2d02383479cJohn (J	{
41287628b541258d906e27e2000a402ed2d02383479cJohn (J	  ; /* good, this is a valid response */
41297628b541258d906e27e2000a402ed2d02383479cJohn (J	}
41307628b541258d906e27e2000a402ed2d02383479cJohn (J      else
41317628b541258d906e27e2000a402ed2d02383479cJohn (J	{
41327628b541258d906e27e2000a402ed2d02383479cJohn (J	  warn_unexpected (connection, message, "not this error");
41337628b541258d906e27e2000a402ed2d02383479cJohn (J
41347628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
41357628b541258d906e27e2000a402ed2d02383479cJohn (J	}
41367628b541258d906e27e2000a402ed2d02383479cJohn (J    }
41377628b541258d906e27e2000a402ed2d02383479cJohn (J  else
41387628b541258d906e27e2000a402ed2d02383479cJohn (J    {
41397628b541258d906e27e2000a402ed2d02383479cJohn (J      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
41407628b541258d906e27e2000a402ed2d02383479cJohn (J	{
41417628b541258d906e27e2000a402ed2d02383479cJohn (J	  ; /* good, expected */
41427628b541258d906e27e2000a402ed2d02383479cJohn (J	}
41437628b541258d906e27e2000a402ed2d02383479cJohn (J      else
41447628b541258d906e27e2000a402ed2d02383479cJohn (J	{
41457628b541258d906e27e2000a402ed2d02383479cJohn (J	  warn_unexpected (connection, message,
41467628b541258d906e27e2000a402ed2d02383479cJohn (J			   "method_return for ListActivatableNames/ListNames");
41477628b541258d906e27e2000a402ed2d02383479cJohn (J
41487628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
41497628b541258d906e27e2000a402ed2d02383479cJohn (J	}
41507628b541258d906e27e2000a402ed2d02383479cJohn (J
41517628b541258d906e27e2000a402ed2d02383479cJohn (J    retry_get_property:
41527628b541258d906e27e2000a402ed2d02383479cJohn (J
41537628b541258d906e27e2000a402ed2d02383479cJohn (J      if (!dbus_message_get_args (message, &error,
41547628b541258d906e27e2000a402ed2d02383479cJohn (J				  DBUS_TYPE_ARRAY,
41557628b541258d906e27e2000a402ed2d02383479cJohn (J				  DBUS_TYPE_STRING,
41567628b541258d906e27e2000a402ed2d02383479cJohn (J				  &srvs, &l,
41577628b541258d906e27e2000a402ed2d02383479cJohn (J				  DBUS_TYPE_INVALID))
41587628b541258d906e27e2000a402ed2d02383479cJohn (J	{
41597628b541258d906e27e2000a402ed2d02383479cJohn (J	  if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
41607628b541258d906e27e2000a402ed2d02383479cJohn (J	    {
41617628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_verbose ("no memory to list services by %s\n", method);
41627628b541258d906e27e2000a402ed2d02383479cJohn (J	      dbus_error_free (&error);
41637628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_wait_for_memory ();
41647628b541258d906e27e2000a402ed2d02383479cJohn (J	      goto retry_get_property;
41657628b541258d906e27e2000a402ed2d02383479cJohn (J	    }
41667628b541258d906e27e2000a402ed2d02383479cJohn (J	  else
41677628b541258d906e27e2000a402ed2d02383479cJohn (J	    {
41687628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_assert (dbus_error_is_set (&error));
41697628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_warn ("Did not get the expected DBUS_TYPE_ARRAY from %s\n", method);
41707628b541258d906e27e2000a402ed2d02383479cJohn (J	      goto out;
41717628b541258d906e27e2000a402ed2d02383479cJohn (J	    }
41727628b541258d906e27e2000a402ed2d02383479cJohn (J	} else {
41737628b541258d906e27e2000a402ed2d02383479cJohn (J	  *services = srvs;
41747628b541258d906e27e2000a402ed2d02383479cJohn (J	  *len = l;
41757628b541258d906e27e2000a402ed2d02383479cJohn (J	}
41767628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4177b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
41787628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!check_no_leftovers (context))
41797628b541258d906e27e2000a402ed2d02383479cJohn (J    goto out;
4180b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
41817628b541258d906e27e2000a402ed2d02383479cJohn (J  retval = TRUE;
4182b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
41837628b541258d906e27e2000a402ed2d02383479cJohn (J out:
41847628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_error_free (&error);
4185b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
41867628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message)
41877628b541258d906e27e2000a402ed2d02383479cJohn (J    dbus_message_unref (message);
41887628b541258d906e27e2000a402ed2d02383479cJohn (J
41897628b541258d906e27e2000a402ed2d02383479cJohn (J  return retval;
41907628b541258d906e27e2000a402ed2d02383479cJohn (J}
41917628b541258d906e27e2000a402ed2d02383479cJohn (J
41927628b541258d906e27e2000a402ed2d02383479cJohn (J/* returns TRUE if the correct thing happens,
41937628b541258d906e27e2000a402ed2d02383479cJohn (J * but the correct thing may include OOM errors.
41947628b541258d906e27e2000a402ed2d02383479cJohn (J */
41957628b541258d906e27e2000a402ed2d02383479cJohn (Jstatic dbus_bool_t
41967628b541258d906e27e2000a402ed2d02383479cJohn (Jcheck_list_services (BusContext     *context,
41977628b541258d906e27e2000a402ed2d02383479cJohn (J		     DBusConnection *connection)
41987628b541258d906e27e2000a402ed2d02383479cJohn (J{
41997628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessage  *message;
42007628b541258d906e27e2000a402ed2d02383479cJohn (J  DBusMessage  *base_service_message;
42017628b541258d906e27e2000a402ed2d02383479cJohn (J  const char   *base_service;
42027628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_uint32_t serial;
42037628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_bool_t   retval;
42047628b541258d906e27e2000a402ed2d02383479cJohn (J  const char   *existent = EXISTENT_SERVICE_NAME;
42057628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_uint32_t flags;
42067628b541258d906e27e2000a402ed2d02383479cJohn (J  char        **services;
42077628b541258d906e27e2000a402ed2d02383479cJohn (J  int           len;
42087628b541258d906e27e2000a402ed2d02383479cJohn (J
42097628b541258d906e27e2000a402ed2d02383479cJohn (J  _dbus_verbose ("check_list_services for %p\n", connection);
42107628b541258d906e27e2000a402ed2d02383479cJohn (J
42117628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!check_get_services (context, connection, "ListActivatableNames", &services, &len))
42127628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42137628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
42147628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42157628b541258d906e27e2000a402ed2d02383479cJohn (J
42167628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!_dbus_string_array_contains ((const char **)services, existent))
42177628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42187628b541258d906e27e2000a402ed2d02383479cJohn (J      _dbus_warn ("Did not get the expected %s from ListActivatableNames\n", existent);
42197a4b9293f3cd9bbf7d648f2a6cc0d61b4278bac0Frank Osterfeld      dbus_free_string_array (services);
42207628b541258d906e27e2000a402ed2d02383479cJohn (J      return FALSE;
42217628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42227628b541258d906e27e2000a402ed2d02383479cJohn (J
42237628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_free_string_array (services);
42247628b541258d906e27e2000a402ed2d02383479cJohn (J
42257628b541258d906e27e2000a402ed2d02383479cJohn (J  base_service_message = NULL;
42267628b541258d906e27e2000a402ed2d02383479cJohn (J
42277628b541258d906e27e2000a402ed2d02383479cJohn (J  message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
42287628b541258d906e27e2000a402ed2d02383479cJohn (J					  DBUS_PATH_DBUS,
42297628b541258d906e27e2000a402ed2d02383479cJohn (J					  DBUS_INTERFACE_DBUS,
42307628b541258d906e27e2000a402ed2d02383479cJohn (J					  "StartServiceByName");
42317628b541258d906e27e2000a402ed2d02383479cJohn (J
42327628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message == NULL)
42337628b541258d906e27e2000a402ed2d02383479cJohn (J    return TRUE;
42347628b541258d906e27e2000a402ed2d02383479cJohn (J
42357628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_message_set_auto_start (message, FALSE);
42367628b541258d906e27e2000a402ed2d02383479cJohn (J
42377628b541258d906e27e2000a402ed2d02383479cJohn (J  flags = 0;
42387628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_message_append_args (message,
42397628b541258d906e27e2000a402ed2d02383479cJohn (J				 DBUS_TYPE_STRING, &existent,
42407628b541258d906e27e2000a402ed2d02383479cJohn (J				 DBUS_TYPE_UINT32, &flags,
42417628b541258d906e27e2000a402ed2d02383479cJohn (J				 DBUS_TYPE_INVALID))
42427628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42437628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (message);
42447628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
42457628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42467628b541258d906e27e2000a402ed2d02383479cJohn (J
42477628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_connection_send (connection, message, &serial))
42487628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42497628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_message_unref (message);
42507628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
42517628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42527628b541258d906e27e2000a402ed2d02383479cJohn (J
42537628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_message_unref (message);
42547628b541258d906e27e2000a402ed2d02383479cJohn (J  message = NULL;
42557628b541258d906e27e2000a402ed2d02383479cJohn (J
42567628b541258d906e27e2000a402ed2d02383479cJohn (J  bus_test_run_everything (context);
42577628b541258d906e27e2000a402ed2d02383479cJohn (J
42587628b541258d906e27e2000a402ed2d02383479cJohn (J  /* now wait for the message bus to hear back from the activated
42597628b541258d906e27e2000a402ed2d02383479cJohn (J   * service.
42607628b541258d906e27e2000a402ed2d02383479cJohn (J   */
42617628b541258d906e27e2000a402ed2d02383479cJohn (J  block_connection_until_message_from_bus (context, connection, "activated service to connect");
42627628b541258d906e27e2000a402ed2d02383479cJohn (J
42637628b541258d906e27e2000a402ed2d02383479cJohn (J  bus_test_run_everything (context);
42647628b541258d906e27e2000a402ed2d02383479cJohn (J
42657628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!dbus_connection_get_is_connected (connection))
42667628b541258d906e27e2000a402ed2d02383479cJohn (J    {
4267d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker      _dbus_verbose ("connection was disconnected\n");
42687628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
42697628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42707628b541258d906e27e2000a402ed2d02383479cJohn (J
42717628b541258d906e27e2000a402ed2d02383479cJohn (J  retval = FALSE;
42727628b541258d906e27e2000a402ed2d02383479cJohn (J
42737628b541258d906e27e2000a402ed2d02383479cJohn (J  message = pop_message_waiting_for_memory (connection);
42747628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message == NULL)
42757628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42767628b541258d906e27e2000a402ed2d02383479cJohn (J      _dbus_warn ("Did not receive any messages after %s %d on %p\n",
42777628b541258d906e27e2000a402ed2d02383479cJohn (J		  "StartServiceByName", serial, connection);
42787628b541258d906e27e2000a402ed2d02383479cJohn (J      goto out;
42797628b541258d906e27e2000a402ed2d02383479cJohn (J    }
42807628b541258d906e27e2000a402ed2d02383479cJohn (J
42817628b541258d906e27e2000a402ed2d02383479cJohn (J  verbose_message_received (connection, message);
42827628b541258d906e27e2000a402ed2d02383479cJohn (J  _dbus_verbose ("  (after sending %s)\n", "StartServiceByName");
42837628b541258d906e27e2000a402ed2d02383479cJohn (J
42847628b541258d906e27e2000a402ed2d02383479cJohn (J  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)
42857628b541258d906e27e2000a402ed2d02383479cJohn (J    {
42867628b541258d906e27e2000a402ed2d02383479cJohn (J      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS))
42877628b541258d906e27e2000a402ed2d02383479cJohn (J	{
42887628b541258d906e27e2000a402ed2d02383479cJohn (J	  _dbus_warn ("Message has wrong sender %s\n",
42897628b541258d906e27e2000a402ed2d02383479cJohn (J		      dbus_message_get_sender (message) ?
42907628b541258d906e27e2000a402ed2d02383479cJohn (J		      dbus_message_get_sender (message) : "(none)");
42917628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
42927628b541258d906e27e2000a402ed2d02383479cJohn (J	}
42937628b541258d906e27e2000a402ed2d02383479cJohn (J
42947628b541258d906e27e2000a402ed2d02383479cJohn (J      if (dbus_message_is_error (message,
42957628b541258d906e27e2000a402ed2d02383479cJohn (J				 DBUS_ERROR_NO_MEMORY))
42967628b541258d906e27e2000a402ed2d02383479cJohn (J	{
42977628b541258d906e27e2000a402ed2d02383479cJohn (J	  ; /* good, this is a valid response */
42987628b541258d906e27e2000a402ed2d02383479cJohn (J	}
42997628b541258d906e27e2000a402ed2d02383479cJohn (J      else if (dbus_message_is_error (message,
43007628b541258d906e27e2000a402ed2d02383479cJohn (J				      DBUS_ERROR_SPAWN_CHILD_EXITED) ||
43017628b541258d906e27e2000a402ed2d02383479cJohn (J	       dbus_message_is_error (message,
43027628b541258d906e27e2000a402ed2d02383479cJohn (J				      DBUS_ERROR_SPAWN_CHILD_SIGNALED) ||
43037628b541258d906e27e2000a402ed2d02383479cJohn (J	       dbus_message_is_error (message,
43047628b541258d906e27e2000a402ed2d02383479cJohn (J				      DBUS_ERROR_SPAWN_EXEC_FAILED))
43057628b541258d906e27e2000a402ed2d02383479cJohn (J	{
43067628b541258d906e27e2000a402ed2d02383479cJohn (J	  ; /* good, this is expected also */
43077628b541258d906e27e2000a402ed2d02383479cJohn (J	}
43087628b541258d906e27e2000a402ed2d02383479cJohn (J      else
43097628b541258d906e27e2000a402ed2d02383479cJohn (J	{
43107628b541258d906e27e2000a402ed2d02383479cJohn (J	  _dbus_warn ("Did not expect error %s\n",
43117628b541258d906e27e2000a402ed2d02383479cJohn (J		      dbus_message_get_error_name (message));
43127628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
43137628b541258d906e27e2000a402ed2d02383479cJohn (J	}
43147628b541258d906e27e2000a402ed2d02383479cJohn (J    }
43157628b541258d906e27e2000a402ed2d02383479cJohn (J  else
43167628b541258d906e27e2000a402ed2d02383479cJohn (J    {
43177628b541258d906e27e2000a402ed2d02383479cJohn (J      GotServiceInfo message_kind;
43187628b541258d906e27e2000a402ed2d02383479cJohn (J
43197628b541258d906e27e2000a402ed2d02383479cJohn (J      if (!check_base_service_activated (context, connection,
43207628b541258d906e27e2000a402ed2d02383479cJohn (J					 message, &base_service))
43217628b541258d906e27e2000a402ed2d02383479cJohn (J	goto out;
43227628b541258d906e27e2000a402ed2d02383479cJohn (J
43237628b541258d906e27e2000a402ed2d02383479cJohn (J      base_service_message = message;
43247628b541258d906e27e2000a402ed2d02383479cJohn (J      message = NULL;
43257628b541258d906e27e2000a402ed2d02383479cJohn (J
43267628b541258d906e27e2000a402ed2d02383479cJohn (J      /* We may need to block here for the test service to exit or finish up */
43277628b541258d906e27e2000a402ed2d02383479cJohn (J      block_connection_until_message_from_bus (context, connection, "test service to exit or finish up");
43287628b541258d906e27e2000a402ed2d02383479cJohn (J
43297628b541258d906e27e2000a402ed2d02383479cJohn (J      message = dbus_connection_borrow_message (connection);
43307628b541258d906e27e2000a402ed2d02383479cJohn (J      if (message == NULL)
43317628b541258d906e27e2000a402ed2d02383479cJohn (J	{
43327628b541258d906e27e2000a402ed2d02383479cJohn (J	  _dbus_warn ("Did not receive any messages after base service creation notification\n");
43337628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
43347628b541258d906e27e2000a402ed2d02383479cJohn (J	}
43357628b541258d906e27e2000a402ed2d02383479cJohn (J
43367628b541258d906e27e2000a402ed2d02383479cJohn (J      message_kind = check_got_service_info (message);
43377628b541258d906e27e2000a402ed2d02383479cJohn (J
43387628b541258d906e27e2000a402ed2d02383479cJohn (J      dbus_connection_return_message (connection, message);
43397628b541258d906e27e2000a402ed2d02383479cJohn (J      message = NULL;
43407628b541258d906e27e2000a402ed2d02383479cJohn (J
43417628b541258d906e27e2000a402ed2d02383479cJohn (J      switch (message_kind)
43427628b541258d906e27e2000a402ed2d02383479cJohn (J	{
43437628b541258d906e27e2000a402ed2d02383479cJohn (J	case GOT_SOMETHING_ELSE:
43447628b541258d906e27e2000a402ed2d02383479cJohn (J	case GOT_ERROR:
43457628b541258d906e27e2000a402ed2d02383479cJohn (J	case GOT_SERVICE_DELETED:
43467628b541258d906e27e2000a402ed2d02383479cJohn (J	  _dbus_warn ("Unexpected message after ActivateService "
4347cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen		      "(should be an error or a service announcement)\n");
43487628b541258d906e27e2000a402ed2d02383479cJohn (J	  goto out;
43497628b541258d906e27e2000a402ed2d02383479cJohn (J
43507628b541258d906e27e2000a402ed2d02383479cJohn (J	case GOT_SERVICE_CREATED:
43517628b541258d906e27e2000a402ed2d02383479cJohn (J	  message = pop_message_waiting_for_memory (connection);
43527628b541258d906e27e2000a402ed2d02383479cJohn (J	  if (message == NULL)
43537628b541258d906e27e2000a402ed2d02383479cJohn (J	    {
43547628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_warn ("Failed to pop message we just put back! "
43557628b541258d906e27e2000a402ed2d02383479cJohn (J			  "should have been a NameOwnerChanged (creation)\n");
43567628b541258d906e27e2000a402ed2d02383479cJohn (J	      goto out;
43577628b541258d906e27e2000a402ed2d02383479cJohn (J	    }
4358b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
43597628b541258d906e27e2000a402ed2d02383479cJohn (J	  if (!check_service_activated (context, connection, EXISTENT_SERVICE_NAME,
43607628b541258d906e27e2000a402ed2d02383479cJohn (J					base_service, message))
43617628b541258d906e27e2000a402ed2d02383479cJohn (J	    goto out;
43627628b541258d906e27e2000a402ed2d02383479cJohn (J
43637628b541258d906e27e2000a402ed2d02383479cJohn (J	  dbus_message_unref (message);
43647628b541258d906e27e2000a402ed2d02383479cJohn (J	  message = NULL;
43657628b541258d906e27e2000a402ed2d02383479cJohn (J
43667628b541258d906e27e2000a402ed2d02383479cJohn (J	  if (!check_no_leftovers (context))
43677628b541258d906e27e2000a402ed2d02383479cJohn (J	    {
43687628b541258d906e27e2000a402ed2d02383479cJohn (J	      _dbus_warn ("Messages were left over after successful activation\n");
43697628b541258d906e27e2000a402ed2d02383479cJohn (J	      goto out;
43707628b541258d906e27e2000a402ed2d02383479cJohn (J	    }
43717628b541258d906e27e2000a402ed2d02383479cJohn (J
43727628b541258d906e27e2000a402ed2d02383479cJohn (J	  break;
43737628b541258d906e27e2000a402ed2d02383479cJohn (J	}
43747628b541258d906e27e2000a402ed2d02383479cJohn (J    }
4375b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
43767628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!check_get_services (context, connection, "ListNames", &services, &len))
43777628b541258d906e27e2000a402ed2d02383479cJohn (J    {
43787628b541258d906e27e2000a402ed2d02383479cJohn (J      return TRUE;
43797628b541258d906e27e2000a402ed2d02383479cJohn (J    }
43807628b541258d906e27e2000a402ed2d02383479cJohn (J
43817628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!_dbus_string_array_contains ((const char **)services, existent))
43827628b541258d906e27e2000a402ed2d02383479cJohn (J    {
43837628b541258d906e27e2000a402ed2d02383479cJohn (J      _dbus_warn ("Did not get the expected %s from ListNames\n", existent);
43847628b541258d906e27e2000a402ed2d02383479cJohn (J      goto out;
43857628b541258d906e27e2000a402ed2d02383479cJohn (J    }
43867628b541258d906e27e2000a402ed2d02383479cJohn (J
43877628b541258d906e27e2000a402ed2d02383479cJohn (J  dbus_free_string_array (services);
43887628b541258d906e27e2000a402ed2d02383479cJohn (J
43897628b541258d906e27e2000a402ed2d02383479cJohn (J  if (!check_send_exit_to_service (context, connection,
43907628b541258d906e27e2000a402ed2d02383479cJohn (J				   EXISTENT_SERVICE_NAME, base_service))
43917628b541258d906e27e2000a402ed2d02383479cJohn (J    goto out;
43927628b541258d906e27e2000a402ed2d02383479cJohn (J
43937628b541258d906e27e2000a402ed2d02383479cJohn (J  retval = TRUE;
43947628b541258d906e27e2000a402ed2d02383479cJohn (J
43957628b541258d906e27e2000a402ed2d02383479cJohn (J out:
43967628b541258d906e27e2000a402ed2d02383479cJohn (J  if (message)
43977628b541258d906e27e2000a402ed2d02383479cJohn (J    dbus_message_unref (message);
43987628b541258d906e27e2000a402ed2d02383479cJohn (J
43997628b541258d906e27e2000a402ed2d02383479cJohn (J  if (base_service_message)
44007628b541258d906e27e2000a402ed2d02383479cJohn (J    dbus_message_unref (base_service_message);
44017628b541258d906e27e2000a402ed2d02383479cJohn (J
44027628b541258d906e27e2000a402ed2d02383479cJohn (J  return retval;
44037628b541258d906e27e2000a402ed2d02383479cJohn (J}
44047628b541258d906e27e2000a402ed2d02383479cJohn (J
4405e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtontypedef struct
4406e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{
4407e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  Check2Func func;
4408e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  BusContext *context;
4409e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  DBusConnection *connection;
4410e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington} Check2Data;
4411e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4412e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic dbus_bool_t
4413e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtoncheck_oom_check2_func (void *data)
4414e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{
4415e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  Check2Data *d = data;
4416e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4417e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (! (* d->func) (d->context, d->connection))
4418e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    return FALSE;
4419b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4420e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!check_no_leftovers (d->context))
4421e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    {
4422cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen      _dbus_warn ("Messages were left over, should be covered by test suite\n");
4423e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington      return FALSE;
4424e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington    }
4425e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4426e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  return TRUE;
4427e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington}
4428e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4429e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtonstatic void
4430e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Penningtoncheck2_try_iterations (BusContext     *context,
4431e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                       DBusConnection *connection,
4432e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                       const char     *description,
4433e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                       Check2Func      func)
4434e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington{
4435e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  Check2Data d;
4436e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4437e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  d.func = func;
4438e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  d.context = context;
4439e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  d.connection = connection;
4440b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4441e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington  if (!_dbus_test_oom_handling (description, check_oom_check2_func,
4442e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington                                &d))
4443fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu    {
4444fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu      _dbus_warn ("%s failed during oom\n", description);
4445fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu      _dbus_assert_not_reached ("test failed");
4446fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu    }
4447e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington}
4448e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4449c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
445079d3004e26f490ef37ae0298495ea66f322ce374Havoc Penningtonsetenv_TEST_LAUNCH_HELPER_CONFIG(const DBusString *test_data_dir,
445179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington                                 const char       *filename)
445279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington{
445379d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  DBusString full;
445479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  DBusString file;
445579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
445679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (!_dbus_string_init (&full))
445779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    return FALSE;
445879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
445979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (!_dbus_string_copy (test_data_dir, 0, &full, 0))
446079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    {
446179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      _dbus_string_free (&full);
446279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      return FALSE;
4463b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering    }
446479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
446579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  _dbus_string_init_const (&file, filename);
4466b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
446779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (!_dbus_concat_dir_and_file (&full, &file))
446879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    {
446979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      _dbus_string_free (&full);
447079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      return FALSE;
447179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    }
447279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
4473b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  _dbus_verbose ("Setting TEST_LAUNCH_HELPER_CONFIG to '%s'\n",
447479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington                 _dbus_string_get_const_data (&full));
4475b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
447679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  _dbus_setenv ("TEST_LAUNCH_HELPER_CONFIG", _dbus_string_get_const_data (&full));
447779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
447879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  _dbus_string_free (&full);
447979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
448079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  return TRUE;
448179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington}
448279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
448379d3004e26f490ef37ae0298495ea66f322ce374Havoc Penningtonstatic dbus_bool_t
4484c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test_conf (const DBusString *test_data_dir,
4485c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes		        const char       *filename,
4486c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes		        dbus_bool_t       use_launcher)
44873bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
44883bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  BusContext *context;
44893bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  DBusConnection *foo;
44903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  DBusConnection *bar;
44913bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  DBusConnection *baz;
449229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusError error;
4493fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4494c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* save the config name for the activation helper */
449579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename))
449679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG");
4497c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4498fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  dbus_error_init (&error);
4499b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4500c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  context = bus_context_new_test (test_data_dir, filename);
450129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (context == NULL)
450229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    return FALSE;
4503b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
450473b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  foo = dbus_connection_open_private (TEST_CONNECTION, &error);
45053bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (foo == NULL)
45063bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("could not alloc connection");
45073bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
4508ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!bus_setup_debug_client (foo))
4509ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("could not set up connection");
4510ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4511dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  spin_connection_until_authenticated (context, foo);
4512b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4513ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!check_hello_message (context, foo))
4514ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("hello message failed");
4515a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
45161658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu  if (!check_double_hello_message (context, foo))
45171658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu    _dbus_assert_not_reached ("double hello message failed");
45181658c8afe59166c9aa77549a3ac6a2e389327638Olivier Andrieu
4519a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!check_add_match_all (context, foo))
4520a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    _dbus_assert_not_reached ("AddMatch message failed");
4521b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
452273b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  bar = dbus_connection_open_private (TEST_CONNECTION, &error);
45233bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (bar == NULL)
45243bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("could not alloc connection");
45253bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
4526ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!bus_setup_debug_client (bar))
4527ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("could not set up connection");
4528ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4529dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  spin_connection_until_authenticated (context, bar);
4530b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4531ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!check_hello_message (context, bar))
4532ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    _dbus_assert_not_reached ("hello message failed");
4533a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
4534a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!check_add_match_all (context, bar))
4535a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    _dbus_assert_not_reached ("AddMatch message failed");
4536b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
453773b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  baz = dbus_connection_open_private (TEST_CONNECTION, &error);
45383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  if (baz == NULL)
45393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("could not alloc connection");
4540169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington
4541ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (!bus_setup_debug_client (baz))
4542169238e99a4a163c89eb053250daeedf5f73e5cdHavoc Pennington    _dbus_assert_not_reached ("could not set up connection");
4543ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4544dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  spin_connection_until_authenticated (context, baz);
4545b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
45464c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  if (!check_hello_message (context, baz))
45474c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington    _dbus_assert_not_reached ("hello message failed");
4548f05f87a825ab8ed5273674a7f65521ffc526f0d2Havoc Pennington
4549a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!check_add_match_all (context, baz))
4550a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    _dbus_assert_not_reached ("AddMatch message failed");
4551c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
45523da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#ifdef DBUS_WIN_FIXME
45533da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker  _dbus_warn("TODO: testing of GetConnectionUnixUser message skipped for now\n");
45543da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker  _dbus_warn("TODO: testing of GetConnectionUnixProcessID message skipped for now\n");
45553da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#else
4556c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!check_get_connection_unix_user (context, baz))
4557c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    _dbus_assert_not_reached ("GetConnectionUnixUser message failed");
4558c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen
4559c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen  if (!check_get_connection_unix_process_id (context, baz))
4560c9c0adce43caa00345ad2aeb55822eabde523c2cDavid Zeuthen    _dbus_assert_not_reached ("GetConnectionUnixProcessID message failed");
45613da9815113c013c3e81f4290d9b74d9862004027Ralf Habacker#endif
45627628b541258d906e27e2000a402ed2d02383479cJohn (J
4563bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington  if (!check_list_services (context, baz))
4564bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington    _dbus_assert_not_reached ("ListActivatableNames message failed");
4565b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4566777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (!check_no_leftovers (context))
4567777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
4568cb905b58f068ba68ca8f6645b2c4e9b51ec61e3eDavid Zeuthen      _dbus_warn ("Messages were left over after setting up initial connections\n");
4569777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      _dbus_assert_not_reached ("initial connection setup failed");
4570777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
4571b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
45724219b08bfa318443419c7a3acde28f0b237b05feHavoc Pennington  check1_try_iterations (context, "create_and_hello",
457378e79022316f45e86a6cac4da85d6b60f5a8f7f8Havoc Pennington                         check_hello_connection);
4574b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4575f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  check2_try_iterations (context, foo, "nonexistent_service_no_auto_start",
4576f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                         check_nonexistent_service_no_auto_start);
4577e55fd2c6706e41f6933e1656ac3da7527ee2514fHavoc Pennington
4578e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#ifdef DBUS_WIN_FIXME
4579e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker  _dbus_warn("TODO: dispatch.c segfault_service_no_auto_start test\n");
4580e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#else
4581bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington  check2_try_iterations (context, foo, "segfault_service_no_auto_start",
4582bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington                         check_segfault_service_no_auto_start);
4583e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif
4584b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4585f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  check2_try_iterations (context, foo, "existent_service_no_auto_start",
4586f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington                         check_existent_service_no_auto_start);
4587b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4588f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  check2_try_iterations (context, foo, "nonexistent_service_auto_start",
4589075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                         check_nonexistent_service_auto_start);
4590e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker
4591b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4592b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering#ifdef DBUS_WIN_FIXME
4593e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker  _dbus_warn("TODO: dispatch.c segfault_service_auto_start test\n");
4594e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#else
4595c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* only do the segfault test if we are not using the launcher */
4596bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington  check2_try_iterations (context, foo, "segfault_service_auto_start",
4597bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington                         check_segfault_service_auto_start);
4598e24922e4b59ed6d9a76e71213cdfe9f6f9b1f564Ralf Habacker#endif
4599075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
4600c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* only do the shell fail test if we are not using the launcher */
460179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  check2_try_iterations (context, foo, "shell_fail_service_auto_start",
460279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington                         check_shell_fail_service_auto_start);
4603c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4604c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* specific to launcher */
4605c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (use_launcher)
4606c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    if (!check_launch_service_file_missing (context, foo))
4607c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes      _dbus_assert_not_reached ("did not get service file not found error");
460893f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
460993f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#if 0
461093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult  /* Note: need to resolve some issues with the testing code in order to run
461193f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult   * this in oom (handle that we sometimes don't get replies back from the bus
461293f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult   * when oom happens, without blocking the test).
461393f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult   */
4614f5cf675641e63cefc36c8a9a7a5872cc8600abcdHavoc Pennington  check2_try_iterations (context, foo, "existent_service_auto_auto_start",
4615075945f611290f2b9db9a4ed6cf5433f2fd85785John (J                         check_existent_service_auto_start);
461693f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult#endif
4617b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4618bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington  if (!check_existent_service_auto_start (context, foo))
4619bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington    _dbus_assert_not_reached ("existent service auto start failed");
462093f433a17a0aabff91a0384bf9c4f99c9cf30ae1Richard Hult
4621bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington  if (!check_shell_service_success_auto_start (context, foo))
4622bdbab1212390d85a82d4195fa67a5c63ac0678cbHavoc Pennington    _dbus_assert_not_reached ("shell success service auto start failed");
4623075945f611290f2b9db9a4ed6cf5433f2fd85785John (J
4624f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  _dbus_verbose ("Disconnecting foo, bar, and baz\n");
4625ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4626f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  kill_client_connection_unchecked (foo);
4627f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  kill_client_connection_unchecked (bar);
4628f7c24715b5489b28b47499eb252b941b735fa1bcHavoc Pennington  kill_client_connection_unchecked (baz);
4629ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
4630ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  bus_context_unref (context);
4631b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
46323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  return TRUE;
46333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
4634fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4635c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesstatic dbus_bool_t
4636c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test_conf_fail (const DBusString *test_data_dir,
4637c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes		             const char       *filename)
4638c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
4639c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  BusContext *context;
4640c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusConnection *foo;
4641c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  DBusError error;
4642c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4643c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* save the config name for the activation helper */
464479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (!setenv_TEST_LAUNCH_HELPER_CONFIG (test_data_dir, filename))
464579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    _dbus_assert_not_reached ("no memory setting TEST_LAUNCH_HELPER_CONFIG");
4646b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4647c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  dbus_error_init (&error);
4648b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4649c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  context = bus_context_new_test (test_data_dir, filename);
4650c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (context == NULL)
4651c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return FALSE;
4652b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
465373b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  foo = dbus_connection_open_private (TEST_CONNECTION, &error);
4654c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (foo == NULL)
4655c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("could not alloc connection");
4656c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4657c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!bus_setup_debug_client (foo))
4658c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("could not set up connection");
4659c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4660c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  spin_connection_until_authenticated (context, foo);
4661c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4662c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_hello_message (context, foo))
4663c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("hello message failed");
4664c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4665c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_double_hello_message (context, foo))
4666c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("double hello message failed");
4667c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4668c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_add_match_all (context, foo))
4669c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("AddMatch message failed");
4670c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4671c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* this only tests the activation.c user check */
4672c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_launch_service_user_missing (context, foo))
4673c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("user missing did not trigger error");
4674c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4675c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* this only tests the desktop.c exec check */
4676c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_launch_service_exec_missing (context, foo))
4677c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("exec missing did not trigger error");
4678c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4679c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* this only tests the desktop.c service check */
4680c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!check_launch_service_service_missing (context, foo))
4681c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    _dbus_assert_not_reached ("service missing did not trigger error");
4682c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4683c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  _dbus_verbose ("Disconnecting foo\n");
4684c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4685c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  kill_client_connection_unchecked (foo);
4686c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4687c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  bus_context_unref (context);
4688b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4689c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return TRUE;
4690c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
4691c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4692c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesdbus_bool_t
4693c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughesbus_dispatch_test (const DBusString *test_data_dir)
4694c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes{
4695c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* run normal activation tests */
4696c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  _dbus_verbose ("Normal activation tests\n");
4697c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!bus_dispatch_test_conf (test_data_dir,
4698c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  			       "valid-config-files/debug-allow-all.conf", FALSE))
4699c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return FALSE;
4700c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4701755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#ifdef DBUS_WIN
4702755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker  _dbus_warn("Info: Launch helper activation tests skipped because launch-helper is not supported yet\n");
4703755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#else
4704c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* run launch-helper activation tests */
4705c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  _dbus_verbose ("Launch helper activation tests\n");
4706c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!bus_dispatch_test_conf (test_data_dir,
4707c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  			       "valid-config-files-system/debug-allow-all-pass.conf", TRUE))
4708c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return FALSE;
4709c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4710c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  /* run select launch-helper activation tests on broken service files */
4711c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  if (!bus_dispatch_test_conf_fail (test_data_dir,
4712c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  			            "valid-config-files-system/debug-allow-all-fail.conf"))
4713c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes    return FALSE;
4714755fc64ea480adfded1c961e1832e43e1587d680Ralf Habacker#endif
4715c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4716c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes  return TRUE;
4717c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes}
4718c9a0a9373300e3acdad7321e01e0629fa8651dddRichard Hughes
4719fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Penningtondbus_bool_t
4720fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Penningtonbus_dispatch_sha1_test (const DBusString *test_data_dir)
4721fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington{
4722fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  BusContext *context;
4723fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  DBusConnection *foo;
4724fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  DBusError error;
4725fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4726fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  dbus_error_init (&error);
4727b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4728fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  /* Test SHA1 authentication */
4729fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  _dbus_verbose ("Testing SHA1 context\n");
4730b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4731fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  context = bus_context_new_test (test_data_dir,
4732e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington                                  "valid-config-files/debug-allow-all-sha1.conf");
4733fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  if (context == NULL)
4734fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    return FALSE;
4735fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
473673b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  foo = dbus_connection_open_private (TEST_CONNECTION, &error);
4737fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  if (foo == NULL)
4738fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    _dbus_assert_not_reached ("could not alloc connection");
4739fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4740fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  if (!bus_setup_debug_client (foo))
4741fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    _dbus_assert_not_reached ("could not set up connection");
4742fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4743dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  spin_connection_until_authenticated (context, foo);
4744b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4745fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  if (!check_hello_message (context, foo))
4746fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    _dbus_assert_not_reached ("hello message failed");
4747fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4748a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (!check_add_match_all (context, foo))
4749a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    _dbus_assert_not_reached ("addmatch message failed");
4750b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
4751fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  if (!check_no_leftovers (context))
4752fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    {
4753d3fb6f35716ff1d6f6644dea2043d539007811deHavoc Pennington      _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n");
4754fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington      _dbus_assert_not_reached ("initial connection setup failed");
4755fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington    }
4756b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
47574219b08bfa318443419c7a3acde28f0b237b05feHavoc Pennington  check1_try_iterations (context, "create_and_hello_sha1",
4758fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington                         check_hello_connection);
4759fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4760fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  kill_client_connection_unchecked (foo);
4761fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4762fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  bus_context_unref (context);
4763fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4764fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington  return TRUE;
4765fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington}
4766fe1cb3a9a1fc6bcbfa1b3be74ac9d5867005210fHavoc Pennington
4767004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#ifdef HAVE_UNIX_FD_PASSING
4768004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4769004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poetteringdbus_bool_t
4770004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poetteringbus_unix_fds_passing_test(const DBusString *test_data_dir)
4771004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering{
4772004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  BusContext *context;
4773004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  DBusConnection *foo, *bar;
4774004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  DBusError error;
4775004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  DBusMessage *m;
4776004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  dbus_bool_t b;
4777004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  int one[2], two[2], x, y, z;
4778004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  char r;
4779004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4780004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  dbus_error_init (&error);
4781004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4782004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  context = bus_context_new_test (test_data_dir, "valid-config-files/debug-allow-all.conf");
4783004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (context == NULL)
4784004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not alloc context");
4785004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
478673b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  foo = dbus_connection_open_private (TEST_CONNECTION, &error);
4787004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (foo == NULL)
4788004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not alloc connection");
4789004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4790004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!bus_setup_debug_client (foo))
4791004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not set up connection");
4792004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4793004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  spin_connection_until_authenticated (context, foo);
4794004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4795004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!check_hello_message (context, foo))
4796004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("hello message failed");
4797004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4798004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!check_add_match_all (context, foo))
4799004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("AddMatch message failed");
4800004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
480173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker  bar = dbus_connection_open_private (TEST_CONNECTION, &error);
4802004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (bar == NULL)
4803004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not alloc connection");
4804004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4805004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!bus_setup_debug_client (bar))
4806004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not set up connection");
4807004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4808004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  spin_connection_until_authenticated (context, bar);
4809004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4810004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!check_hello_message (context, bar))
4811004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("hello message failed");
4812004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4813004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!check_add_match_all (context, bar))
4814004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("AddMatch message failed");
4815004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4816004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!(m = dbus_message_new_signal("/", "a.b.c", "d")))
4817004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached ("could not alloc message");
4818004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4819004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!(_dbus_full_duplex_pipe(one, one+1, TRUE, &error)))
4820004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to allocate pipe #1");
4821004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4822004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!(_dbus_full_duplex_pipe(two, two+1, TRUE, &error)))
4823004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to allocate pipe #2");
4824004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4825004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!dbus_message_append_args(m,
4826004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                                DBUS_TYPE_UNIX_FD, one,
4827004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                                DBUS_TYPE_UNIX_FD, two,
4828004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                                DBUS_TYPE_UNIX_FD, two,
4829004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                                DBUS_TYPE_INVALID))
4830004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to attach fds.");
4831004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4832004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(one[0], &error))
4833004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #1 ");
4834004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(two[0], &error))
4835004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #2 ");
4836004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4837c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering  if (!(dbus_connection_can_send_type(foo, DBUS_TYPE_UNIX_FD)))
4838c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering    _dbus_assert_not_reached("Connection cannot do fd passing");
4839c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering
4840c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering  if (!(dbus_connection_can_send_type(bar, DBUS_TYPE_UNIX_FD)))
4841c200e0304d6f53a0fd47f524386b02b27c0c45f6Lennart Poettering    _dbus_assert_not_reached("Connection cannot do fd passing");
4842004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4843004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!dbus_connection_send (foo, m, NULL))
4844004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to send fds");
4845004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4846004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  dbus_message_unref(m);
4847004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4848004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  bus_test_run_clients_loop (SEND_PENDING (foo));
4849004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4850004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  bus_test_run_everything (context);
4851004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4852004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  block_connection_until_message_from_bus (context, foo, "unix fd reception on foo");
4853004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4854004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!(m = pop_message_waiting_for_memory (foo)))
4855004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to receive msg");
4856004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4857004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!dbus_message_is_signal(m, "a.b.c", "d"))
4858004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("bogus message received");
4859004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4860004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  dbus_message_unref(m);
4861004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4862004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  block_connection_until_message_from_bus (context, bar, "unix fd reception on bar");
4863004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4864004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!(m = pop_message_waiting_for_memory (bar)))
4865004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to receive msg");
4866004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4867004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!dbus_message_is_signal(m, "a.b.c", "d"))
4868004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("bogus message received");
4869004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4870004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!dbus_message_get_args(m,
4871004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                             &error,
4872004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                             DBUS_TYPE_UNIX_FD, &x,
4873004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                             DBUS_TYPE_UNIX_FD, &y,
4874004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                             DBUS_TYPE_UNIX_FD, &z,
4875004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering                             DBUS_TYPE_INVALID))
4876004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to parse fds.");
4877004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4878004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  dbus_message_unref(m);
4879004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4880004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (write(x, "X", 1) != 1)
4881004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to write to pipe #1");
4882004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (write(y, "Y", 1) != 1)
4883004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to write to pipe #2");
4884004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (write(z, "Z", 1) != 1)
4885004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to write to pipe #2/2nd fd");
4886004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4887004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(x, &error))
4888004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #1/other side ");
4889004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(y, &error))
4890004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #2/other side ");
4891004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(z, &error))
4892004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #2/other size 2nd fd ");
4893004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4894004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (read(one[1], &r, 1) != 1 || r != 'X')
4895004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to read value from pipe.");
4896004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (read(two[1], &r, 1) != 1 || r != 'Y')
4897004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to read value from pipe.");
4898004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (read(two[1], &r, 1) != 1 || r != 'Z')
4899004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to read value from pipe.");
4900004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4901004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(one[1], &error))
4902004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #1 ");
4903004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  if (!_dbus_close(two[1], &error))
4904004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering    _dbus_assert_not_reached("Failed to close pipe #2 ");
4905004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4906004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  _dbus_verbose ("Disconnecting foo\n");
4907004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  kill_client_connection_unchecked (foo);
4908004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4909004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  _dbus_verbose ("Disconnecting bar\n");
4910004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  kill_client_connection_unchecked (bar);
4911004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4912004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  bus_context_unref (context);
4913004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
4914004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering  return TRUE;
4915004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering}
4916004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering#endif
4917004f01fa451b0341e7ea69ce7f08a1c4690f759aLennart Poettering
49183bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington#endif /* DBUS_BUILD_TESTS */
4919