Re: [spice-server] tests: Automatically determine free port to use

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> 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().
> 

make sense.

Considering that Qemu/libvirt scan forward, why not scanning backward?

Have you considering somebody could try to connect to a test server?
I think will use the line printed with the port by the way.

> Signed-off-by: Christophe Fergeau <cfergeau@xxxxxxxxxx>
> ---
>  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

weird to be defined in the middle

> +    port = BASE_PORT;
>      spice_server_set_noauth(server);
> -    spice_server_init(server, core);
> +
> +    g_test_log_set_fatal_handler(ignore_bind_failures, NULL);

Can't you set back (to NULL ?) at the end of the loop?

> +    while (port < BASE_PORT + 10) {

I would see a for here, but not an issue.

> +        spice_server_set_port(server, port);
> +        if (spice_server_init(server, core) == 0) {

Looking at the source code it does not seem we ever though
about calling spice_server_init multiple times, for instance
main_dispatcher field is replaced every time at least causing
leaks (not surely a regression of this patch).

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

The idea is good.
Beside the multiple spice_server_init call the patch looks good
(all other comments are really minor).

Frediano
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]