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@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
Christophe Fergeau 2017-09-20 17:25:42 +02:00
parent 5ccad96671
commit 67484cd98b
3 changed files with 41 additions and 13 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);