[Spice-devel] [spice-server] tests: Automatically determine free port to use
Christophe Fergeau
cfergeau at redhat.com
Wed Sep 20 15:47:28 UTC 2017
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>
---
server/tests/test-display-base.c | 48 ++++++++++++++++++++++++++++++++--------
server/tests/test-display-base.h | 1 -
server/tests/test-two-servers.c | 2 +-
3 files changed, 40 insertions(+), 11 deletions(-)
diff --git a/server/tests/test-display-base.c b/server/tests/test-display-base.c
index 289aa9840..76c3de744 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,11 +900,30 @@ 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;
+}
+
+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;
@@ -913,10 +933,25 @@ Test* test_new_with_port(SpiceCoreInterface* core, int port)
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);
+#define BASE_PORT 5912
+ port = BASE_PORT;
spice_server_set_noauth(server);
- spice_server_init(server, core);
+
+ g_test_log_set_fatal_handler(ignore_bind_failures, NULL);
+ while (port < BASE_PORT + 10) {
+ spice_server_set_port(server, port);
+ if (spice_server_init(server, core) == 0) {
+ break;
+ }
+ port++;
+ }
+
+ if (port >= BASE_PORT + 10) {
+ g_assert_not_reached();
+ return NULL;
+ }
+
+ printf("TESTER: listening on port %d (unsecure)\n", port);
cursor_init();
path_init(&path, 0, angle_parts);
@@ -925,11 +960,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 a80f03e78..1a4f20c5b 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 92935528e..40a0e5717 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);
--
2.13.5
More information about the Spice-devel
mailing list