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

Eduardo Lima (Etrunko) etrunko at redhat.com
Fri Jul 20 19:22:03 UTC 2018


On 13/07/18 16:33, Frediano Ziglio wrote:
> 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)
> +{
> +}
> +

This breaks the meson build due to redefinitions of struct StreamChannel
and all the functions from stream-channel.c. Maybe we could rename this
struct to TestStreamChannel?

server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_get_type':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:90:
multiple definition of `stream_channel_get_type'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:189:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_new':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:332:
multiple definition of `stream_channel_new'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:225:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_change_format':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:480:
multiple definition of `stream_channel_change_format'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:203:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_send_data':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:543:
multiple definition of `stream_channel_send_data'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:209:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_register_start_cb':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:569:
multiple definition of `stream_channel_register_start_cb'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:216:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_register_queue_stat_cb':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:577:
multiple definition of `stream_channel_register_queue_stat_cb'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:221:
first defined here
server/server@@spice-server at sha/stream-channel.c.o: In function
`stream_channel_reset':
/home/elima/projects/spice/spice/build/../server/stream-channel.c:584:
multiple definition of `stream_channel_reset'
server/tests/server at tests@@test-stream-device at exe/test-stream-device.c.o:/home/elima/projects/spice/spice/build/../server/tests/test-stream-device.c:237:
first defined here
collect2: error: ld returned 1 exit status

For the moment I am disabling this test on the meson build.



>  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();
>  }
> 


-- 
Eduardo de Barros Lima (Etrunko)
Software Engineer - RedHat
etrunko at redhat.com


More information about the Spice-devel mailing list