[Spice-devel] [PATCH 5/9] server/tests: test_display_width_stride

Alon Levy alevy at redhat.com
Fri May 17 08:08:10 PDT 2013


---
 server/tests/Makefile.am                 |  8 ++-
 server/tests/test_display_base.c         | 48 ++++++++++++++---
 server/tests/test_display_base.h         | 13 +++++
 server/tests/test_display_width_stride.c | 92 ++++++++++++++++++++++++++++++++
 4 files changed, 154 insertions(+), 7 deletions(-)
 create mode 100644 server/tests/test_display_width_stride.c

diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am
index e0472f3..655bc83 100644
--- a/server/tests/Makefile.am
+++ b/server/tests/Makefile.am
@@ -35,6 +35,7 @@ noinst_PROGRAMS =						\
 	test_display_resolution_changes		\
 	test_two_servers					\
 	test_vdagent						\
+	test_display_width_stride			\
 	$(NULL)
 
 test_vdagent_SOURCES =		\
@@ -90,4 +91,9 @@ test_two_servers_SOURCES =			\
 	test_two_servers.c 			\
 	$(NULL)
 
-
+test_display_width_stride_SOURCES =			\
+	$(COMMON_BASE)				\
+	test_display_base.c			\
+	test_display_base.h			\
+	test_display_width_stride.c 			\
+	$(NULL)
diff --git a/server/tests/test_display_base.c b/server/tests/test_display_base.c
index 8657e91..b4c93f3 100644
--- a/server/tests/test_display_base.c
+++ b/server/tests/test_display_base.c
@@ -309,20 +309,36 @@ static SimpleSpiceUpdate *test_spice_create_update_copy_bits(Test *test, uint32_
     return update;
 }
 
-static SimpleSurfaceCmd *create_surface(int surface_id, int width, int height, uint8_t *data)
+static int format_to_bpp(int format)
+{
+    switch (format) {
+    case SPICE_SURFACE_FMT_8_A:
+        return 1;
+    case SPICE_SURFACE_FMT_16_555:
+    case SPICE_SURFACE_FMT_16_565:
+        return 2;
+    case SPICE_SURFACE_FMT_32_xRGB:
+    case SPICE_SURFACE_FMT_32_ARGB:
+        return 4;
+    }
+    abort();
+}
+
+static SimpleSurfaceCmd *create_surface(int surface_id, int format, int width, int height, uint8_t *data)
 {
     SimpleSurfaceCmd *simple_cmd = calloc(sizeof(SimpleSurfaceCmd), 1);
     QXLSurfaceCmd *surface_cmd = &simple_cmd->surface_cmd;
+    int bpp = format_to_bpp(format);
 
     set_cmd(&simple_cmd->ext, QXL_CMD_SURFACE, (intptr_t)surface_cmd);
     simple_set_release_info(&surface_cmd->release_info, (intptr_t)simple_cmd);
     surface_cmd->type = QXL_SURFACE_CMD_CREATE;
     surface_cmd->flags = 0; // ?
     surface_cmd->surface_id = surface_id;
-    surface_cmd->u.surface_create.format = SPICE_SURFACE_FMT_32_xRGB;
+    surface_cmd->u.surface_create.format = format;
     surface_cmd->u.surface_create.width = width;
     surface_cmd->u.surface_create.height = height;
-    surface_cmd->u.surface_create.stride = -width * 4;
+    surface_cmd->u.surface_create.stride = -width * bpp;
     surface_cmd->u.surface_create.data = (intptr_t)data;
     return simple_cmd;
 }
@@ -471,7 +487,10 @@ static void produce_command(Test *test)
     if (test->has_secondary)
         test->target_surface = 1;
 
-    ASSERT(test->num_commands);
+    if (!test->num_commands) {
+        usleep(1000);
+        return;
+    }
 
     command = &test->commands[test->cmd_index];
     if (command->cb) {
@@ -538,8 +557,17 @@ static void produce_command(Test *test)
         case SIMPLE_CREATE_SURFACE: {
             SimpleSurfaceCmd *update;
             test->target_surface = MAX_SURFACE_NUM - 1;
-            update = create_surface(test->target_surface, SURF_WIDTH, SURF_HEIGHT,
-                                    test->secondary_surface);
+            if (command) {
+                update = create_surface(command->create_surface.surface_id,
+                                        command->create_surface.format,
+                                        command->create_surface.width,
+                                        command->create_surface.height,
+                                        command->create_surface.data);
+            } else {
+                update = create_surface(test->target_surface, SPICE_SURFACE_FMT_32_xRGB,
+                                        SURF_WIDTH, SURF_HEIGHT,
+                                        test->secondary_surface);
+            }
             push_command(&update->ext);
             test->has_secondary = 1;
             break;
@@ -716,7 +744,15 @@ static void set_client_capabilities(QXLInstance *qin,
                                     uint8_t client_present,
                                     uint8_t caps[58])
 {
+    Test *test = SPICE_CONTAINEROF(qin, Test, qxl_instance);
+
     printf("%s: present %d caps %d\n", __func__, client_present, caps[0]);
+    if (test->on_client_connected && client_present) {
+        test->on_client_connected(test);
+    }
+    if (test->on_client_disconnected && !client_present) {
+        test->on_client_disconnected(test);
+    }
 }
 
 QXLInterface display_sif = {
diff --git a/server/tests/test_display_base.h b/server/tests/test_display_base.h
index c3b9fea..d2823a7 100644
--- a/server/tests/test_display_base.h
+++ b/server/tests/test_display_base.h
@@ -32,6 +32,14 @@ typedef struct CommandCreatePrimary {
     uint32_t height;
 } CommandCreatePrimary;
 
+typedef struct CommandCreateSurface {
+    uint32_t surface_id;
+    uint32_t format;
+    uint32_t width;
+    uint32_t height;
+    uint8_t *data;
+} CommandCreateSurface;
+
 typedef struct CommandDrawBitmap {
     QXLRect bbox;
     uint8_t *bitmap;
@@ -62,6 +70,7 @@ struct Command {
         CommandDrawBitmap bitmap;
         CommandDrawSolid solid;
         CommandSleep sleep;
+        CommandCreateSurface create_surface;
     };
 };
 
@@ -100,6 +109,10 @@ struct Test {
     int cmd_index;
 
     int target_surface;
+
+    // callbacks
+    void (*on_client_connected)(Test *test);
+    void (*on_client_disconnected)(Test *test);
 };
 
 void test_set_simple_command_list(Test *test, int *command, int num_commands);
diff --git a/server/tests/test_display_width_stride.c b/server/tests/test_display_width_stride.c
new file mode 100644
index 0000000..20de57a
--- /dev/null
+++ b/server/tests/test_display_width_stride.c
@@ -0,0 +1,92 @@
+/**
+ * Recreate the primary surface endlessly.
+ */
+
+#include <config.h>
+#include <math.h>
+#include <stdlib.h>
+#include "test_display_base.h"
+
+SpiceTimer *ping_timer;
+
+void show_channels(SpiceServer *server);
+
+int ping_ms = 100;
+
+void pinger(void *opaque)
+{
+    Test *test = opaque;
+    // show_channels is not thread safe - fails if disconnections / connections occur
+    //show_channels(server);
+
+    test->core->timer_start(ping_timer, ping_ms);
+}
+
+static int g_surface_id = 1;
+static uint8_t *g_surface_data;
+
+void set_draw_parameters(Test *test, Command *command)
+{
+    static int count = 17;
+    CommandDrawSolid *solid = &command->solid;
+
+    solid->bbox.top = 0;
+    solid->bbox.left = 0;
+    solid->bbox.bottom = 20;
+    solid->bbox.right = count;
+    solid->surface_id = g_surface_id;
+    count++;
+}
+
+void set_surface_params(Test *test, Command *command)
+{
+    CommandCreateSurface *create = &command->create_surface;
+
+    // UGLY
+    if (g_surface_data) {
+        exit(0);
+    }
+    create->format = SPICE_SURFACE_FMT_8_A;
+    create->width = 128;
+    create->height = 128;
+    g_surface_data = realloc(g_surface_data, create->width * create->height * 1);
+    create->surface_id = g_surface_id;
+    create->data = g_surface_data;
+}
+
+static Command commands[] = {
+    {SIMPLE_CREATE_SURFACE, set_surface_params},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+    {SIMPLE_DRAW_SOLID, set_draw_parameters},
+};
+
+void on_client_connected(Test *test)
+{
+    test_set_command_list(test, commands, COUNT(commands));
+}
+
+int main(void)
+{
+    SpiceCoreInterface *core;
+    Test *test;
+
+    core = basic_event_loop_init();
+    test = test_new(core);
+    test->on_client_connected = on_client_connected;
+    //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
+    test_add_display_interface(test);
+
+    ping_timer = core->timer_add(pinger, test);
+    core->timer_start(ping_timer, ping_ms);
+
+    basic_event_loop_mainloop();
+
+    return 0;
+}
-- 
1.8.2.1



More information about the Spice-devel mailing list