[Spice-devel] [PATCH spice-server 14/16] tests: Make test-two-servers work reliably

Frediano Ziglio fziglio at redhat.com
Mon Sep 4 10:57:22 UTC 2017


This test run 2 spice server in one program.
Use two different tcp port to be able to connect to both servers.
Also fix a race condition getting the command to execute from
the worker threads.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/tests/test-display-base.c | 29 +++++++++++++++--------------
 server/tests/test-display-base.h |  2 ++
 server/tests/test-two-servers.c  |  1 +
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/server/tests/test-display-base.c b/server/tests/test-display-base.c
index 101df44d..82dcdf35 100644
--- a/server/tests/test-display-base.c
+++ b/server/tests/test-display-base.c
@@ -70,6 +70,8 @@ static void test_spice_destroy_update(SimpleSpiceUpdate *update)
     free(update);
 }
 
+int test_port = 5912;
+
 #define DEFAULT_WIDTH 640
 #define DEFAULT_HEIGHT 320
 
@@ -485,20 +487,19 @@ static void push_command(QXLCommandExt *ext)
     pthread_mutex_unlock(&command_mutex);
 }
 
-static struct QXLCommandExt *get_simple_command(void)
+static int get_num_commands(void)
 {
-    pthread_mutex_lock(&command_mutex);
-    struct QXLCommandExt *ret = commands[commands_start % COMMANDS_SIZE];
-    spice_assert(commands_start < commands_end);
-    commands_start++;
-    pthread_mutex_unlock(&command_mutex);
-    return ret;
+    return commands_end - commands_start;
 }
 
-static int get_num_commands(void)
+static struct QXLCommandExt *get_simple_command(void)
 {
     pthread_mutex_lock(&command_mutex);
-    int ret = commands_end - commands_start;
+    struct QXLCommandExt *ret = NULL;
+    if (get_num_commands() > 0) {
+        ret = commands[commands_start % COMMANDS_SIZE];
+        commands_start++;
+    }
     pthread_mutex_unlock(&command_mutex);
     return ret;
 }
@@ -507,10 +508,11 @@ static int get_num_commands(void)
 static int get_command(SPICE_GNUC_UNUSED QXLInstance *qin,
                        struct QXLCommandExt *ext)
 {
-    if (get_num_commands() == 0) {
+    struct QXLCommandExt *cmd = get_simple_command();
+    if (!cmd) {
         return FALSE;
     }
-    *ext = *get_simple_command();
+    *ext = *cmd;
     return TRUE;
 }
 
@@ -902,7 +904,6 @@ void test_set_command_list(Test *test, Command *commands, int num_commands)
 
 Test *test_new(SpiceCoreInterface *core)
 {
-    int port = 5912;
     Test *test = spice_new0(Test, 1);
     SpiceServer* server = spice_server_new();
 
@@ -914,8 +915,8 @@ Test *test_new(SpiceCoreInterface *core)
     test->wakeup_ms = 1;
     test->cursor_notify = NOTIFY_CURSOR_BATCH;
     // some common initialization for all display tests
-    printf("TESTER: listening on port %d (unsecure)\n", port);
-    spice_server_set_port(server, port);
+    printf("TESTER: listening on port %d (unsecure)\n", test_port);
+    spice_server_set_port(server, test_port);
     spice_server_set_noauth(server);
     spice_server_init(server, core);
 
diff --git a/server/tests/test-display-base.h b/server/tests/test-display-base.h
index 1a4f20c5..23c2ce18 100644
--- a/server/tests/test-display-base.h
+++ b/server/tests/test-display-base.h
@@ -130,6 +130,8 @@ struct Test {
     void (*on_client_disconnected)(Test *test);
 };
 
+extern int test_port;
+
 void test_set_simple_command_list(Test *test, const int *command, int num_commands);
 void test_set_command_list(Test *test, Command *command, int num_commands);
 void test_add_display_interface(Test *test);
diff --git a/server/tests/test-two-servers.c b/server/tests/test-two-servers.c
index 40a0e571..2372e730 100644
--- a/server/tests/test-two-servers.c
+++ b/server/tests/test-two-servers.c
@@ -42,6 +42,7 @@ int main(void)
 
     core = basic_event_loop_init();
     t1 = test_new(core);
+    ++test_port;
     t2 = test_new(core);
     //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
     test_add_display_interface(t1);
-- 
2.13.5



More information about the Spice-devel mailing list