[Spice-commits] 5 commits - server/red-stream-device.c server/tests

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 19 13:12:51 UTC 2018


 server/red-stream-device.c        |    2 
 server/tests/test-stream-device.c |  288 +++++++++++++++++++++++++-------------
 2 files changed, 197 insertions(+), 93 deletions(-)

New commits:
commit 4d162260fcb4acc166191e24624a6709a684d372
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Jul 11 14:12:20 2018 +0100

    test-stream-device: Check data are sent together
    
    Check that data sent to device are collapsed in a single message.
    The StreamChannel object is mocked in the test.
    This checks that commit dcc3f995d9f5575e319adcfe530c477a7c294ff3
    ("stream-device: handle_data: send whole message") is doing the
    right thing.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index 1bcc1d42..c1872d53 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -31,6 +31,8 @@
 
 #include "test-display-base.h"
 #include "test-glib-compat.h"
+#include "stream-channel.h"
+#include "reds.h"
 
 static SpiceCharDeviceInstance vmc_instance;
 
@@ -173,6 +175,68 @@ check_vmc_error_message(void)
     g_assert_cmpint(GUINT32_FROM_LE(hdr.size), <=, vmc_write_pos - sizeof(hdr));
 }
 
+static int num_send_data_calls = 0;
+static size_t send_data_bytes = 0;
+
+struct StreamChannel {
+    RedChannel parent;
+};
+
+struct StreamChannelClass {
+    RedChannelClass parent_class;
+};
+
+G_DEFINE_TYPE(StreamChannel, stream_channel, RED_TYPE_CHANNEL)
+
+static void
+stream_channel_init(StreamChannel *channel)
+{
+}
+
+static void
+stream_channel_class_init(StreamChannelClass *klass)
+{
+}
+
+void stream_channel_change_format(StreamChannel *channel,
+                                  const struct StreamMsgFormat *fmt)
+{
+}
+
+void stream_channel_send_data(StreamChannel *channel,
+                              const void *data, size_t size,
+                              uint32_t mm_time)
+{
+    ++num_send_data_calls;
+    send_data_bytes += size;
+}
+
+void stream_channel_register_start_cb(StreamChannel *channel,
+                                      stream_channel_start_proc cb, void *opaque)
+{
+}
+
+void stream_channel_register_queue_stat_cb(StreamChannel *channel,
+                                           stream_channel_queue_stat_proc cb, void *opaque)
+{
+}
+
+StreamChannel* stream_channel_new(RedsState *server, uint32_t id)
+{
+    return g_object_new(TYPE_STREAM_CHANNEL,
+                        "spice-server", server,
+                        "core-interface", reds_get_core_interface(server),
+                        "channel-type", SPICE_CHANNEL_DISPLAY,
+                        "id", id,
+                        "migration-flags", 0,
+                        "handle-acks", FALSE,
+                        NULL);
+}
+
+void stream_channel_reset(StreamChannel *channel)
+{
+}
+
 static SpiceCoreInterface *core;
 static Test *test;
 typedef int TestFixture;
@@ -190,6 +254,9 @@ static void test_stream_device_setup(TestFixture *fixture, gconstpointer user_da
     vmc_write_pos = 0;
     message_sizes_curr = message_sizes;
     message_sizes_end = message_sizes;
+
+    num_send_data_calls = 0;
+    send_data_bytes = 0;
 }
 
 static void test_stream_device_teardown(TestFixture *fixture, gconstpointer user_data)
@@ -384,6 +451,40 @@ static void test_stream_device_huge_data(TestFixture *fixture, gconstpointer use
     check_vmc_error_message();
 }
 
+// check that server send all message
+static void test_stream_device_data_message(TestFixture *fixture, gconstpointer user_data)
+{
+    uint8_t *p = message;
+
+    // add some messages into device buffer
+    p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+    p = add_stream_hdr(p, STREAM_TYPE_DATA, 1017);
+    for (int i = 0; i < 1017; ++i, ++p) {
+        *p = (uint8_t) (i * 123 + 57);
+    }
+    *message_sizes_end = 51;
+    ++message_sizes_end;
+    *message_sizes_end = 123;
+    ++message_sizes_end;
+    *message_sizes_end = 534;
+    ++message_sizes_end;
+    *message_sizes_end = p - message;
+    ++message_sizes_end;
+
+    test_kick();
+
+    // we should read all data
+    g_assert(message_sizes_curr - message_sizes == 4);
+
+    // we should have no data from the device
+    discard_server_capabilities();
+    g_assert_cmpint(vmc_write_pos, ==, 0);
+
+    // make sure data were collapsed in a single message
+    g_assert_cmpint(num_send_data_calls, ==, 1);
+    g_assert_cmpint(send_data_bytes, ==, 1017);
+}
+
 static void test_add(const char *name, void (*func)(TestFixture *, gconstpointer), gconstpointer arg)
 {
     g_test_add(name, TestFixture, arg, test_stream_device_setup, func, test_stream_device_teardown);
@@ -407,6 +508,8 @@ int main(int argc, char *argv[])
              test_stream_device_empty, GINT_TO_POINTER(STREAM_TYPE_DATA));
     test_add("/server/stream-device-huge-data",
              test_stream_device_huge_data, NULL);
+    test_add("/server/stream-device-data-message",
+             test_stream_device_data_message, NULL);
 
     return g_test_run();
 }
commit 91aa8ac8308847776a2cba17053611c749ea8c1f
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Jul 11 18:08:03 2018 +0100

    test-stream-device: Factor out a function to start the test
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index 6bd4127c..1bcc1d42 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -203,6 +203,19 @@ static void test_stream_device_teardown(TestFixture *fixture, gconstpointer user
     core = NULL;
 }
 
+static void test_kick(void)
+{
+    vmc_instance.base.sif = &vmc_interface.base;
+    spice_server_add_interface(test->server, &vmc_instance.base);
+
+    // we need to open the device and kick the start
+    // the alarm is to prevent the program from getting stuck
+    alarm(5);
+    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
+    spice_server_char_device_wakeup(&vmc_instance);
+    alarm(0);
+}
+
 static void test_stream_device(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
@@ -273,15 +286,7 @@ static void test_stream_device_unfinished(TestFixture *fixture, gconstpointer us
     *message_sizes_end = p - message;
     ++message_sizes_end;
 
-    vmc_instance.base.sif = &vmc_interface.base;
-    spice_server_add_interface(test->server, &vmc_instance.base);
-
-    // we need to open the device and kick the start
-    // the alarm is to prevent the program from getting stuck
-    alarm(5);
-    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
-    spice_server_char_device_wakeup(&vmc_instance);
-    alarm(0);
+    test_kick();
 
     // we should have read all data
     g_assert(message_sizes_curr - message_sizes == 1);
@@ -303,15 +308,7 @@ static void test_stream_device_multiple(TestFixture *fixture, gconstpointer user
     *message_sizes_end = p - message;
     ++message_sizes_end;
 
-    vmc_instance.base.sif = &vmc_interface.base;
-    spice_server_add_interface(test->server, &vmc_instance.base);
-
-    // we need to open the device and kick the start
-    // the alarm is to prevent the program from getting stuck
-    alarm(5);
-    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
-    spice_server_char_device_wakeup(&vmc_instance);
-    alarm(0);
+    test_kick();
 
     // we should have read all data
     g_assert(message_sizes_curr - message_sizes == 1);
@@ -331,15 +328,7 @@ static void test_stream_device_format_after_data(TestFixture *fixture, gconstpoi
     *message_sizes_end = p - message;
     ++message_sizes_end;
 
-    vmc_instance.base.sif = &vmc_interface.base;
-    spice_server_add_interface(test->server, &vmc_instance.base);
-
-    // we need to open the device and kick the start
-    // the alarm is to avoid program to stuck
-    alarm(5);
-    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
-    spice_server_char_device_wakeup(&vmc_instance);
-    alarm(0);
+    test_kick();
 
     // we should read all data
     g_assert(message_sizes_curr - message_sizes == 1);
@@ -365,15 +354,7 @@ static void test_stream_device_empty(TestFixture *fixture, gconstpointer user_da
     *message_sizes_end = p - message;
     ++message_sizes_end;
 
-    vmc_instance.base.sif = &vmc_interface.base;
-    spice_server_add_interface(test->server, &vmc_instance.base);
-
-    // we need to open the device and kick the start
-    // the alarm is to avoid program to stuck
-    alarm(5);
-    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
-    spice_server_char_device_wakeup(&vmc_instance);
-    alarm(0);
+    test_kick();
 
     // we should read all data
     g_assert(message_sizes_curr - message_sizes == 3);
@@ -394,15 +375,7 @@ static void test_stream_device_huge_data(TestFixture *fixture, gconstpointer use
     *message_sizes_end = p - message;
     ++message_sizes_end;
 
-    vmc_instance.base.sif = &vmc_interface.base;
-    spice_server_add_interface(test->server, &vmc_instance.base);
-
-    // we need to open the device and kick the start
-    // the alarm is to avoid program to stuck
-    alarm(5);
-    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
-    spice_server_char_device_wakeup(&vmc_instance);
-    alarm(0);
+    test_kick();
 
     // we should read all data
     g_assert(message_sizes_curr - message_sizes == 1);
commit 2f3634441f091b788962bb397a6cf2052614b43c
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Jul 11 17:52:53 2018 +0100

    test-stream-device: Put common parts in setup/teardown functions
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index 781b45af..6bd4127c 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -173,11 +173,39 @@ check_vmc_error_message(void)
     g_assert_cmpint(GUINT32_FROM_LE(hdr.size), <=, vmc_write_pos - sizeof(hdr));
 }
 
-static void test_stream_device(void)
+static SpiceCoreInterface *core;
+static Test *test;
+typedef int TestFixture;
+
+static void test_stream_device_setup(TestFixture *fixture, gconstpointer user_data)
+{
+    g_assert_null(core);
+    g_assert_null(test);
+    core = basic_event_loop_init();
+    g_assert_nonnull(core);
+    test = test_new(core);
+    g_assert_nonnull(test);
+
+    pos = 0;
+    vmc_write_pos = 0;
+    message_sizes_curr = message_sizes;
+    message_sizes_end = message_sizes;
+}
+
+static void test_stream_device_teardown(TestFixture *fixture, gconstpointer user_data)
+{
+    g_assert_nonnull(core);
+    g_assert_nonnull(test);
+
+    test_destroy(test);
+    test = NULL;
+    basic_event_loop_destroy();
+    core = NULL;
+}
+
+static void test_stream_device(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
 
     for (int test_num=0; test_num < 2; ++test_num) {
         pos = 0;
@@ -233,22 +261,12 @@ static void test_stream_device(void)
 
         check_vmc_error_message();
     }
-
-    test_destroy(test);
-    basic_event_loop_destroy();
 }
 
 // check if sending a partial message causes issues
-static void test_stream_device_unfinished(void)
+static void test_stream_device_unfinished(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
-
-    pos = 0;
-    vmc_write_pos = 0;
-    message_sizes_curr = message_sizes;
-    message_sizes_end = message_sizes;
 
     // this long and not finished message should not cause an infinite loop
     p = add_stream_hdr(p, STREAM_TYPE_DATA, 100000);
@@ -271,21 +289,12 @@ static void test_stream_device_unfinished(void)
     // we should have no data from the device
     discard_server_capabilities();
     g_assert_cmpint(vmc_write_pos, ==, 0);
-
-    test_destroy(test);
-    basic_event_loop_destroy();
 }
 
 // check if sending multiple messages cause stall
-static void test_stream_device_multiple(void)
+static void test_stream_device_multiple(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
-
-    pos = 0;
-    message_sizes_curr = message_sizes;
-    message_sizes_end = message_sizes;
 
     // add some messages into device buffer
     p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
@@ -306,22 +315,12 @@ static void test_stream_device_multiple(void)
 
     // we should have read all data
     g_assert(message_sizes_curr - message_sizes == 1);
-
-    test_destroy(test);
-    basic_event_loop_destroy();
 }
 
 // check if data message consume even following message
-static void test_stream_device_format_after_data(void)
+static void test_stream_device_format_after_data(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
-
-    pos = 0;
-    vmc_write_pos = 0;
-    message_sizes_curr = message_sizes;
-    message_sizes_end = message_sizes;
 
     // add some messages into device buffer
     p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
@@ -347,22 +346,13 @@ static void test_stream_device_format_after_data(void)
 
     // we should have an error back
     check_vmc_error_message();
-
-    test_destroy(test);
-    basic_event_loop_destroy();
 }
 
 // check empty message
-static void test_stream_device_empty(StreamMsgType msg_type)
+static void test_stream_device_empty(TestFixture *fixture, gconstpointer user_data)
 {
+    const StreamMsgType msg_type = (StreamMsgType) GPOINTER_TO_INT(user_data);
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
-
-    pos = 0;
-    vmc_write_pos = 0;
-    message_sizes_curr = message_sizes;
-    message_sizes_end = message_sizes;
 
     // add some messages into device buffer
     p = add_stream_hdr(p, msg_type, 0);
@@ -391,34 +381,12 @@ static void test_stream_device_empty(StreamMsgType msg_type)
     // we should have no data from the device
     discard_server_capabilities();
     g_assert_cmpint(vmc_write_pos, ==, 0);
-
-    test_destroy(test);
-    basic_event_loop_destroy();
-}
-
-// check empty capabilities
-static void test_stream_device_empty_capabilities(void)
-{
-    test_stream_device_empty(STREAM_TYPE_CAPABILITIES);
-}
-
-// check empty data
-static void test_stream_device_empty_data(void)
-{
-    test_stream_device_empty(STREAM_TYPE_DATA);
 }
 
 // check that server refuse huge data messages
-static void test_stream_device_huge_data(void)
+static void test_stream_device_huge_data(TestFixture *fixture, gconstpointer user_data)
 {
     uint8_t *p = message;
-    SpiceCoreInterface *core = basic_event_loop_init();
-    Test *test = test_new(core);
-
-    pos = 0;
-    vmc_write_pos = 0;
-    message_sizes_curr = message_sizes;
-    message_sizes_end = message_sizes;
 
     // add some messages into device buffer
     p = add_stream_hdr(p, STREAM_TYPE_DATA, 33 * 1024 * 1024);
@@ -441,22 +409,31 @@ static void test_stream_device_huge_data(void)
 
     // we should have an error back
     check_vmc_error_message();
+}
 
-    test_destroy(test);
-    basic_event_loop_destroy();
+static void test_add(const char *name, void (*func)(TestFixture *, gconstpointer), gconstpointer arg)
+{
+    g_test_add(name, TestFixture, arg, test_stream_device_setup, func, test_stream_device_teardown);
 }
 
 int main(int argc, char *argv[])
 {
     g_test_init(&argc, &argv, NULL);
 
-    g_test_add_func("/server/stream-device", test_stream_device);
-    g_test_add_func("/server/stream-device-unfinished", test_stream_device_unfinished);
-    g_test_add_func("/server/stream-device-multiple", test_stream_device_multiple);
-    g_test_add_func("/server/stream-device-format-after-data", test_stream_device_format_after_data);
-    g_test_add_func("/server/stream-device-empty-capabilities", test_stream_device_empty_capabilities);
-    g_test_add_func("/server/stream-device-empty-data", test_stream_device_empty_data);
-    g_test_add_func("/server/stream-device-huge-data", test_stream_device_huge_data);
+    test_add("/server/stream-device",
+             test_stream_device, NULL);
+    test_add("/server/stream-device-unfinished",
+             test_stream_device_unfinished, NULL);
+    test_add("/server/stream-device-multiple",
+             test_stream_device_multiple, NULL);
+    test_add("/server/stream-device-format-after-data",
+             test_stream_device_format_after_data, NULL);
+    test_add("/server/stream-device-empty-capabilities",
+             test_stream_device_empty, GINT_TO_POINTER(STREAM_TYPE_CAPABILITIES));
+    test_add("/server/stream-device-empty-data",
+             test_stream_device_empty, GINT_TO_POINTER(STREAM_TYPE_DATA));
+    test_add("/server/stream-device-huge-data",
+             test_stream_device_huge_data, NULL);
 
     return g_test_run();
 }
commit e3bb59c76bb9951bb7c53d1b57c6665df09b9730
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Jul 11 11:40:16 2018 +0100

    test-stream-device: Check server detect and signal huge data
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index ae9a78da..781b45af 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -165,7 +165,7 @@ check_vmc_error_message(void)
 
     discard_server_capabilities();
 
-    g_assert(vmc_write_pos >= sizeof(hdr));
+    g_assert_cmpint(vmc_write_pos, >= ,sizeof(hdr));
 
     memcpy(&hdr, vmc_write_buf, sizeof(hdr));
     g_assert_cmpint(hdr.protocol_version, ==, STREAM_DEVICE_PROTOCOL);
@@ -408,6 +408,44 @@ static void test_stream_device_empty_data(void)
     test_stream_device_empty(STREAM_TYPE_DATA);
 }
 
+// check that server refuse huge data messages
+static void test_stream_device_huge_data(void)
+{
+    uint8_t *p = message;
+    SpiceCoreInterface *core = basic_event_loop_init();
+    Test *test = test_new(core);
+
+    pos = 0;
+    vmc_write_pos = 0;
+    message_sizes_curr = message_sizes;
+    message_sizes_end = message_sizes;
+
+    // add some messages into device buffer
+    p = add_stream_hdr(p, STREAM_TYPE_DATA, 33 * 1024 * 1024);
+    p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
+    *message_sizes_end = p - message;
+    ++message_sizes_end;
+
+    vmc_instance.base.sif = &vmc_interface.base;
+    spice_server_add_interface(test->server, &vmc_instance.base);
+
+    // we need to open the device and kick the start
+    // the alarm is to avoid program to stuck
+    alarm(5);
+    spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED);
+    spice_server_char_device_wakeup(&vmc_instance);
+    alarm(0);
+
+    // we should read all data
+    g_assert(message_sizes_curr - message_sizes == 1);
+
+    // we should have an error back
+    check_vmc_error_message();
+
+    test_destroy(test);
+    basic_event_loop_destroy();
+}
+
 int main(int argc, char *argv[])
 {
     g_test_init(&argc, &argv, NULL);
@@ -418,6 +456,7 @@ int main(int argc, char *argv[])
     g_test_add_func("/server/stream-device-format-after-data", test_stream_device_format_after_data);
     g_test_add_func("/server/stream-device-empty-capabilities", test_stream_device_empty_capabilities);
     g_test_add_func("/server/stream-device-empty-data", test_stream_device_empty_data);
+    g_test_add_func("/server/stream-device-huge-data", test_stream_device_huge_data);
 
     return g_test_run();
 }
commit c66a3121374da332b18b0715916c2114d30123da
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Jul 11 11:33:01 2018 +0100

    red-stream-device: Fix and check empty data messages
    
    If guest sent an empty data message this was not parsed correctly.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/server/red-stream-device.c b/server/red-stream-device.c
index fafcee5a..d293dc1c 100644
--- a/server/red-stream-device.c
+++ b/server/red-stream-device.c
@@ -332,7 +332,7 @@ handle_msg_data(StreamDevice *dev, SpiceCharDeviceInstance *sin)
     /* read from device */
     n = sif->read(sin, dev->msg->buf + dev->msg_pos, dev->hdr.size - dev->msg_pos);
     if (n <= 0) {
-        return false;
+        return dev->msg_pos == dev->hdr.size;
     }
 
     dev->msg_pos += n;
diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index 00fbc90c..ae9a78da 100644
--- a/server/tests/test-stream-device.c
+++ b/server/tests/test-stream-device.c
@@ -352,8 +352,8 @@ static void test_stream_device_format_after_data(void)
     basic_event_loop_destroy();
 }
 
-// check empty capabilities
-static void test_stream_device_empty_capabilities(void)
+// check empty message
+static void test_stream_device_empty(StreamMsgType msg_type)
 {
     uint8_t *p = message;
     SpiceCoreInterface *core = basic_event_loop_init();
@@ -365,7 +365,7 @@ static void test_stream_device_empty_capabilities(void)
     message_sizes_end = message_sizes;
 
     // add some messages into device buffer
-    p = add_stream_hdr(p, STREAM_TYPE_CAPABILITIES, 0);
+    p = add_stream_hdr(p, msg_type, 0);
     *message_sizes_end = p - message;
     ++message_sizes_end;
     p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG);
@@ -396,6 +396,17 @@ static void test_stream_device_empty_capabilities(void)
     basic_event_loop_destroy();
 }
 
+// check empty capabilities
+static void test_stream_device_empty_capabilities(void)
+{
+    test_stream_device_empty(STREAM_TYPE_CAPABILITIES);
+}
+
+// check empty data
+static void test_stream_device_empty_data(void)
+{
+    test_stream_device_empty(STREAM_TYPE_DATA);
+}
 
 int main(int argc, char *argv[])
 {
@@ -406,6 +417,7 @@ int main(int argc, char *argv[])
     g_test_add_func("/server/stream-device-multiple", test_stream_device_multiple);
     g_test_add_func("/server/stream-device-format-after-data", test_stream_device_format_after_data);
     g_test_add_func("/server/stream-device-empty-capabilities", test_stream_device_empty_capabilities);
+    g_test_add_func("/server/stream-device-empty-data", test_stream_device_empty_data);
 
     return g_test_run();
 }


More information about the Spice-commits mailing list