Currently create device, open it and pass some messages checking they are handled. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/tests/Makefile.am | 1 + server/tests/test-stream-device.c | 151 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 server/tests/test-stream-device.c diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am index 21e47c61..971575b5 100644 --- a/server/tests/Makefile.am +++ b/server/tests/Makefile.am @@ -58,6 +58,7 @@ check_PROGRAMS = \ test-fail-on-null-core-interface \ test-empty-success \ test-channel \ + test-stream-device \ $(NULL) noinst_PROGRAMS = \ diff --git a/server/tests/test-stream-device.c b/server/tests/test-stream-device.c new file mode 100644 index 00000000..92807eb0 --- /dev/null +++ b/server/tests/test-stream-device.c @@ -0,0 +1,151 @@ +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (C) 2009-2017 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ +/** + * Test streaming device + */ + +#include <config.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> + +#include <spice/protocol.h> +#include <spice/stream-device.h> + +#include "test-display-base.h" +#include "test-glib-compat.h" + +#ifndef MIN +#define MIN(a, b) ((a) > (b) ? (b) : (a)) +#endif + +static SpiceCharDeviceInstance vmc_instance; + +static uint8_t message[2048]; +static unsigned pos = 0; +static unsigned message_size; + +static int vmc_write(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin, + SPICE_GNUC_UNUSED const uint8_t *buf, + int len) +{ + return len; +} + +static int vmc_read(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin, + uint8_t *buf, + int len) +{ + int ret; + + if (pos == message_size) { + g_message("sent whole message"); + pos++; /* Only print message once */ + } + if (pos >= message_size) { + return 0; + } + ret = MIN(message_size - pos, len); + memcpy(buf, &message[pos], ret); + pos += ret; + // kick of next message read + spice_server_char_device_wakeup(&vmc_instance); + return ret; +} + +static void vmc_state(SPICE_GNUC_UNUSED SpiceCharDeviceInstance *sin, + SPICE_GNUC_UNUSED int connected) +{ +} + +static SpiceCharDeviceInterface vmc_interface = { + .base = { + .type = SPICE_INTERFACE_CHAR_DEVICE, + .description = "test spice virtual channel char device", + .major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR, + .minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR, + }, + .state = vmc_state, + .write = vmc_write, + .read = vmc_read, +}; + +static SpiceCharDeviceInstance vmc_instance = { + .subtype = "port", + .portname = "com.redhat.stream.0", +}; + +static uint8_t *add_stream_hdr(uint8_t *p, StreamMsgType type, uint32_t size) +{ + StreamDevHeader hdr; + memset(&hdr, 0, sizeof(hdr)); + hdr.protocol_version = STREAM_DEVICE_PROTOCOL; + hdr.type = GUINT16_TO_LE(type); + hdr.size = GUINT32_TO_LE(size); + + memcpy(p, &hdr, sizeof(hdr)); + return p + sizeof(hdr); +} + +static uint8_t *add_format(uint8_t *p, uint32_t w, uint32_t h, SpiceVideoCodecType codec) +{ + StreamMsgFormat fmt; + memset(&fmt, 0, sizeof(fmt)); + fmt.width = GUINT32_TO_LE(w); + fmt.height = GUINT32_TO_LE(h); + fmt.codec = codec; + + p = add_stream_hdr(p, STREAM_TYPE_FORMAT, sizeof(fmt)); + memcpy(p, &fmt, sizeof(fmt)); + return p + sizeof(fmt); +} + +static void test_stream_device(void) +{ + SpiceCoreInterface *core = basic_event_loop_init(); + Test *test = test_new(core); + + // build some messages into device + // here we are testing the device is reading two consecutive + // format messages + uint8_t *p = message; + p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_MJPEG); + p = add_format(p, 640, 480, SPICE_VIDEO_CODEC_TYPE_VP9); + message_size = p - message; + + g_test_expect_message(G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, "sent whole message"); + 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 + spice_server_port_event(&vmc_instance, SPICE_PORT_EVENT_OPENED); + spice_server_char_device_wakeup(&vmc_instance); + + g_test_assert_expected_messages(); + test_destroy(test); + basic_event_loop_destroy(); +} + +int main(int argc, char *argv[]) +{ + g_test_init(&argc, &argv, NULL); + + g_test_add_func("/server/stream-device", test_stream_device); + + return g_test_run(); +} -- 2.13.6 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel