Merge "Optional autogen.sh flag --enable-kdbus-transport added allowing to compile...
[platform/upstream/dbus.git] / test / test-service.c
index ed47a50..7181fa3 100644 (file)
@@ -1,9 +1,13 @@
+#include <config.h>
 
 #include "test-utils.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 static DBusLoop *loop;
 static dbus_bool_t already_quit = FALSE;
-static dbus_bool_t hello_from_self_reply_recived = FALSE;
+static dbus_bool_t hello_from_self_reply_received = FALSE;
 
 static void
 quit (void)
@@ -54,7 +58,7 @@ check_hello_from_self_reply (DBusPendingCall *pcall,
   if (type == DBUS_MESSAGE_TYPE_METHOD_RETURN)
     {
       const char *s;
-      printf ("Reply from HelloFromSelf recived\n");
+      printf ("Reply from HelloFromSelf received\n");
      
       if (!dbus_message_get_args (echo_message,
                               &error,
@@ -108,13 +112,14 @@ check_hello_from_self_reply (DBusPendingCall *pcall,
       dbus_error_free (&error);
     }
   else
-     _dbus_assert_not_reached ("Unexpected message recived\n");
+     _dbus_assert_not_reached ("Unexpected message received\n");
 
-  hello_from_self_reply_recived = TRUE;
+  hello_from_self_reply_received = TRUE;
   
   dbus_message_unref (reply);
   dbus_message_unref (echo_message);
   dbus_pending_call_unref (pcall);
+  dbus_connection_unref (connection);
 }
 
 static DBusHandlerResult
@@ -222,6 +227,62 @@ handle_echo (DBusConnection     *connection,
   return DBUS_HANDLER_RESULT_HANDLED;
 }
 
+static DBusHandlerResult
+handle_delay_echo (DBusConnection     *connection,
+                   DBusMessage        *message)
+{
+  DBusError error;
+  DBusMessage *reply;
+  char *s;
+
+  _dbus_verbose ("sleeping for a short time\n");
+
+  _dbus_sleep_milliseconds (50);
+
+  _dbus_verbose ("sending reply to DelayEcho method\n");
+  
+  dbus_error_init (&error);
+  
+  if (!dbus_message_get_args (message,
+                              &error,
+                              DBUS_TYPE_STRING, &s,
+                              DBUS_TYPE_INVALID))
+    {
+      reply = dbus_message_new_error (message,
+                                      error.name,
+                                      error.message);
+
+      if (reply == NULL)
+        die ("No memory\n");
+
+      if (!dbus_connection_send (connection, reply, NULL))
+        die ("No memory\n");
+
+      dbus_message_unref (reply);
+
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
+  reply = dbus_message_new_method_return (message);
+  if (reply == NULL)
+    die ("No memory\n");
+  
+  if (!dbus_message_append_args (reply,
+                                 DBUS_TYPE_STRING, &s,
+                                 DBUS_TYPE_INVALID))
+    die ("No memory");
+  
+  if (!dbus_connection_send (connection, reply, NULL))
+    die ("No memory\n");
+
+  fprintf (stderr, "DelayEcho service echoed string: \"%s\"\n", s);
+  
+  dbus_message_unref (reply);
+    
+  return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+
 static void
 path_unregistered_func (DBusConnection  *connection,
                         void            *user_data)
@@ -240,9 +301,12 @@ path_message_func (DBusConnection  *connection,
     return handle_echo (connection, message);
   else if (dbus_message_is_method_call (message,
                                         "org.freedesktop.TestSuite",
+                                        "DelayEcho"))
+    return handle_delay_echo (connection, message);
+  else if (dbus_message_is_method_call (message,
+                                        "org.freedesktop.TestSuite",
                                         "Exit"))
     {
-      dbus_connection_close (connection);
       quit ();
       return DBUS_HANDLER_RESULT_HANDLED;
     }
@@ -285,7 +349,7 @@ path_message_func (DBusConnection  *connection,
                                         "HelloFromSelf"))
     {
         DBusMessage *reply;
-        printf ("Recived the HelloFromSelf message\n");
+        printf ("Received the HelloFromSelf message\n");
         
         reply = dbus_message_new_method_return (message);
         if (reply == NULL)
@@ -293,6 +357,8 @@ path_message_func (DBusConnection  *connection,
         
         if (!dbus_connection_send (connection, reply, NULL))
           die ("No memory");
+
+        return DBUS_HANDLER_RESULT_HANDLED;
     }
   else
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -317,7 +383,6 @@ filter_func (DBusConnection     *connection,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
     {
-      dbus_connection_close (connection);
       quit ();
       return DBUS_HANDLER_RESULT_HANDLED;
     }
@@ -334,7 +399,39 @@ main (int    argc,
   DBusError error;
   int result;
   DBusConnection *connection;
-  
+  const char *name;
+  dbus_bool_t do_fork;
+
+  if (argc != 3)
+    {
+      name = "org.freedesktop.DBus.TestSuiteEchoService";
+      do_fork = FALSE;
+    }
+  else
+    {
+      name = argv[1];
+#ifndef DBUS_WIN
+      do_fork = strcmp (argv[2], "fork") == 0;
+#else
+      do_fork = FALSE;
+#endif
+    }
+
+  /* The bare minimum for simulating a program "daemonizing"; the intent
+   * is to test services which move from being legacy init scripts to
+   * activated services.
+   * https://bugzilla.redhat.com/show_bug.cgi?id=545267
+   */
+#ifndef DBUS_WIN
+   if (do_fork)
+    {
+      pid_t pid = fork ();
+      if (pid != 0)
+        exit (0);
+      sleep (1);
+    }
+#endif
+
   dbus_error_init (&error);
   connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
   if (connection == NULL)
@@ -369,8 +466,8 @@ main (int    argc,
     if (d != (void*) 0xdeadbeef)
       die ("dbus_connection_get_object_path_data() doesn't seem to work right\n");
   }
-  
-  result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService",
+
+  result = dbus_bus_request_name (connection, name,
                                   0, &error);
   if (dbus_error_is_set (&error))
     {
@@ -380,7 +477,14 @@ main (int    argc,
       dbus_error_free (&error);
       exit (1);
     }
-  
+
+  if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
+    {
+      fprintf (stderr, "Unable to acquire service: code %d\n", result);
+      _dbus_verbose ("*** Failed to acquire service: %d\n", result);
+      exit (1);
+    }
+
   _dbus_verbose ("*** Test service entering main loop\n");
   _dbus_loop_run (loop);