From: Rico Tzschichholz Date: Mon, 17 May 2021 16:56:12 +0000 (+0200) Subject: tests: Add "no-reply" DBus test to increase coverage X-Git-Tag: 0.53.1~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3a9343add89612b70eb59698527bdbc6142bba4;p=thirdparty%2Fvala.git tests: Add "no-reply" DBus test to increase coverage --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 681f17c79..cfe4adbb4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -720,6 +720,7 @@ TESTS = \ dbus/dynamic-method.test \ dbus/enum-string-marshalling.vala \ dbus/generics.test \ + dbus/no-reply.test \ dbus/signals.test \ dbus/filedescriptor.test \ dbus/filedescriptor-async.test \ diff --git a/tests/dbus/no-reply.test b/tests/dbus/no-reply.test new file mode 100644 index 000000000..5508c9f08 --- /dev/null +++ b/tests/dbus/no-reply.test @@ -0,0 +1,102 @@ +Packages: gio-2.0 +D-Bus + +Program: client + +[DBus (name = "org.example.Test")] +interface Test : Object { + public abstract string[] list_messages () throws IOError; + public abstract void post_message (string message) throws IOError; + [DBus (no_reply = true)] + public abstract void post_message_no_reply (string message) throws IOError; +} + +MainLoop main_loop; + +async void run () { + Test test = yield Bus.get_proxy (BusType.SESSION, "org.example.Test", "/org/example/Test"); + + var events = new AsyncQueue (); + + DBusConnection connection = ((DBusProxy) test).g_connection; + connection.add_filter ((conn, message, incoming) => { + if (message.get_interface () == "org.example.Test" && message.get_member () != "ListMessages") { + switch (message.get_message_type ()) { + case DBusMessageType.METHOD_CALL: + events.push (message.get_flags ().to_string ()); + break; + default: + assert_not_reached (); + } + } + return message; + }); + + string[] messages = test.list_messages (); + assert (messages.length == 0); + + test.post_message ("round-trip"); + assert (events.pop () == "G_DBUS_MESSAGE_FLAGS_NONE"); + assert (events.try_pop () == null); + + test.post_message_no_reply ("fire-and-forget"); + assert (events.pop () == "G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED"); + assert (events.try_pop () == null); + + messages = test.list_messages (); + assert (messages.length == 2); + assert (messages[0] == "round-trip"); + assert (messages[1] == "fire-and-forget"); + + main_loop.quit (); +} + +void main () { + run.begin (); + + main_loop = new MainLoop (null, false); + main_loop.run (); +} + +Program: server + +[DBus (name = "org.example.Test")] +class Test : Object { + private string[] messages = new string[0]; + + public string[] list_messages () { + return messages; + } + + public void post_message (string message) { + messages += message; + } + + [DBus (no_reply = true)] + public void post_message_no_reply (string message) { + messages += message; + } +} + +MainLoop main_loop; + +void client_exit (Pid pid, int status) { + assert (status == 0); + main_loop.quit (); +} + +void main () { + var conn = Bus.get_sync (BusType.SESSION); + conn.register_object ("/org/example/Test", new Test ()); + + var request_result = conn.call_sync ("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "RequestName", + new Variant ("(su)", "org.example.Test", 0x4), null, 0, -1); + assert ((uint) request_result.get_child_value (0) == 1); + + Pid client_pid; + Process.spawn_async (null, { "dbus_no_reply_client" }, null, SpawnFlags.DO_NOT_REAP_CHILD, null, out client_pid); + ChildWatch.add (client_pid, client_exit); + + main_loop = new MainLoop (); + main_loop.run (); +}