[Spice-commits] server/tests

Christophe Fergau teuf at kemper.freedesktop.org
Thu Sep 21 15:42:05 UTC 2017


 server/tests/test-display-base.c |   51 ++++++++++++++++++++++++++++++---------
 server/tests/test-display-base.h |    1 
 server/tests/test-two-servers.c  |    2 -
 3 files changed, 41 insertions(+), 13 deletions(-)

New commits:
commit 67484cd98b56325238e636bcbf393122eeba2b0f
Author: Christophe Fergeau <cfergeau at redhat.com>
Date:   Wed Sep 20 17:25:42 2017 +0200

    tests: Automatically determine free port to use
    
    Currently, the port used by most tests is hardcoded to 5912. However,
    the test suite can be run in parallel, so if 2 tests run in parallel,
    the 2nd one is not going to be able to bind to port 5912 and will fail.
    
    After this commit, test_new() will try to find a free port between 5912
    and 5922 and will abort if it can't find any.
    
    The issue can be reproduced by adding a usleep(1000000) to the beginning
    of test_destroy().
    
    Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
    Acked-by: Frediano Ziglio <fziglio at redhat.com>

diff --git a/server/tests/test-display-base.c b/server/tests/test-display-base.c
index 289aa984..83eb92e5 100644
--- a/server/tests/test-display-base.c
+++ b/server/tests/test-display-base.c
@@ -32,6 +32,7 @@
 #include <spice/qxl_dev.h>
 
 #include "test-display-base.h"
+#include "test-glib-compat.h"
 #include "red-channel.h"
 
 #ifndef PATH_MAX
@@ -899,24 +900,57 @@ void test_set_command_list(Test *test, Command *commands, int num_commands)
     test->num_commands = num_commands;
 }
 
+static gboolean ignore_bind_failures(const gchar *log_domain,
+                                     GLogLevelFlags log_level,
+                                     const gchar *message,
+                                     gpointer user_data)
+{
+    if (!g_str_equal (log_domain, G_LOG_DOMAIN)) {
+        return true;
+    }
+    if ((log_level & G_LOG_LEVEL_WARNING) == 0)  {
+        return true;
+    }
+    if (strstr(message, "reds_init_socket: binding socket to ") == NULL) {
+        g_print("XXX [%s]\n", message);
+        return true;
+    }
 
-Test* test_new_with_port(SpiceCoreInterface* core, int port)
+    return false;
+}
+
+#define BASE_PORT 5912
+
+Test* test_new(SpiceCoreInterface* core)
 {
     Test *test = spice_new0(Test, 1);
-    SpiceServer* server = spice_server_new();
+    int port = -1;
 
     test->qxl_instance.base.sif = &display_sif.base;
     test->qxl_instance.id = 0;
 
     test->core = core;
-    test->server = server;
     test->wakeup_ms = 1;
     test->cursor_notify = NOTIFY_CURSOR_BATCH;
     // some common initialization for all display tests
+    port = BASE_PORT;
+
+    g_test_log_set_fatal_handler(ignore_bind_failures, NULL);
+    for (port = BASE_PORT; port < BASE_PORT + 10; port++) {
+        SpiceServer* server = spice_server_new();
+        spice_server_set_noauth(server);
+        spice_server_set_port(server, port);
+        if (spice_server_init(server, core) == 0) {
+            test->server = server;
+            break;
+        }
+        spice_server_destroy(server);
+    }
+
+    g_assert(test->server != NULL);
+
     printf("TESTER: listening on port %d (unsecure)\n", port);
-    spice_server_set_port(server, port);
-    spice_server_set_noauth(server);
-    spice_server_init(server, core);
+    g_test_log_set_fatal_handler(NULL, NULL);
 
     cursor_init();
     path_init(&path, 0, angle_parts);
@@ -925,11 +959,6 @@ Test* test_new_with_port(SpiceCoreInterface* core, int port)
     return test;
 }
 
-Test *test_new(SpiceCoreInterface *core)
-{
-    return test_new_with_port(core, 5912);
-}
-
 void test_destroy(Test *test)
 {
     spice_server_destroy(test->server);
diff --git a/server/tests/test-display-base.h b/server/tests/test-display-base.h
index a80f03e7..1a4f20c5 100644
--- a/server/tests/test-display-base.h
+++ b/server/tests/test-display-base.h
@@ -134,7 +134,6 @@ void test_set_simple_command_list(Test *test, const int *command, int num_comman
 void test_set_command_list(Test *test, Command *command, int num_commands);
 void test_add_display_interface(Test *test);
 void test_add_agent_interface(SpiceServer *server); // TODO - Test *test
-Test* test_new_with_port(SpiceCoreInterface* core, int port);
 Test* test_new(SpiceCoreInterface* core);
 void test_destroy(Test *test);
 
diff --git a/server/tests/test-two-servers.c b/server/tests/test-two-servers.c
index 92935528..40a0e571 100644
--- a/server/tests/test-two-servers.c
+++ b/server/tests/test-two-servers.c
@@ -42,7 +42,7 @@ int main(void)
 
     core = basic_event_loop_init();
     t1 = test_new(core);
-    t2 = test_new_with_port(core, 5913);
+    t2 = test_new(core);
     //spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESSION_OFF);
     test_add_display_interface(t1);
     test_add_display_interface(t2);


More information about the Spice-commits mailing list