[Spice-devel] [PATCH spice-server 5/5] test-stream-device: Check data are sent together

Frediano Ziglio fziglio at redhat.com
Fri Jul 13 19:33:18 UTC 2018


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>
---
 server/tests/test-stream-device.c | 99 +++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)

diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c
index 1bcc1d42c..2916a07d8 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,66 @@ 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;
+
+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;
+}
+
+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 +252,8 @@ 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;
 }
 
 static void test_stream_device_teardown(TestFixture *fixture, gconstpointer user_data)
@@ -384,6 +448,39 @@ 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);
+}
+
 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 +504,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();
 }
-- 
2.17.1



More information about the Spice-devel mailing list