[vala/staging: 1/3] tests: Add test for dbus fd passing failures



commit 4a8bf26ea2610856ed832e723a7585f89c4c8bb6
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Feb 18 15:05:06 2017 +0100

    tests: Add test for dbus fd passing failures
    
    The server will exhaust all fds before the fd list in the dbus
    request is opened. We do expect it to fail in the client.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=778540

 tests/Makefile.am                     |    1 +
 tests/dbus/filedescriptor-errors.test |   77 +++++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f824f4e..268409b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -247,6 +247,7 @@ TESTS = \
        dbus/async-errors.test \
        dbus/signals.test \
        dbus/filedescriptor.test \
+       dbus/filedescriptor-errors.test \
        dbus/dicts.test \
        dbus/bug596862.vala \
        dbus/bug602003.test \
diff --git a/tests/dbus/filedescriptor-errors.test b/tests/dbus/filedescriptor-errors.test
new file mode 100644
index 0000000..96f28cf
--- /dev/null
+++ b/tests/dbus/filedescriptor-errors.test
@@ -0,0 +1,77 @@
+Packages: gio-2.0 gio-unix-2.0 posix
+D-Bus
+
+Program: client
+
+[DBus (name = "org.example.Test")]
+interface Test : Object {
+       public abstract string test (UnixOutputStream output_stream) throws IOError;
+}
+
+void pipe (out UnixInputStream input, out UnixOutputStream output) throws IOError {
+       int pipefd[2];
+       if (Posix.pipe (pipefd) < 0) {
+               throw new IOError.FAILED ("Pipe creation failed");
+       }
+       input = new UnixInputStream (pipefd[0], true);
+       output = new UnixOutputStream (pipefd[1], true);
+}
+
+void main () {
+       // client
+       Test test = Bus.get_proxy_sync (BusType.SESSION, "org.example.Test", "/org/example/test");
+
+       UnixInputStream i;
+       UnixOutputStream o;
+       pipe (out i, out o);
+
+       try {
+               test.test (o);
+               // We expect the request to fail
+               assert_not_reached ();
+       } catch (Error e) {
+       }
+}
+
+Program: server
+
+[DBus (name = "org.example.Test")]
+class Test : Object {
+       public void test (UnixOutputStream output_stream) throws IOError {
+               uint8[] buffer = new uint8[1];
+               buffer[0] = 42;
+               output_stream.write (buffer);
+       }
+}
+
+MainLoop main_loop;
+
+void client_exit (Pid pid, int status) {
+       // client finished, terminate server
+       assert (status == 0);
+       main_loop.quit ();
+}
+
+void main () {
+       var conn = Bus.get_sync (BusType.SESSION);
+       conn.register_object ("/org/example/test", new Test ());
+
+       // try to register service in session bus
+       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);
+
+       // server ready, spawn client
+       Pid client_pid;
+       Process.spawn_async (null, { "test", "/dbus/filedescriptor-errors/client" }, null, 
SpawnFlags.DO_NOT_REAP_CHILD, null, out client_pid);
+       ChildWatch.add (client_pid, client_exit);
+
+       main_loop = new MainLoop ();
+
+       /* Exhaust fds before the incoming request */
+       int fd = 0;
+       while (fd >= 0)
+               fd = Posix.open ("/", 0);
+
+       main_loop.run ();
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]