diff mbox series

[47/51] tests/qtest: libqtest: Correct the timeout unit of blocking receive calls for win32

Message ID 20220824094029.1634519-48-bmeng.cn@gmail.com (mailing list archive)
State New, archived
Headers show
Series tests/qtest: Enable running qtest on Windows | expand

Commit Message

Bin Meng Aug. 24, 2022, 9:40 a.m. UTC
From: Bin Meng <bin.meng@windriver.com>

Some qtest cases don't get response from the the QEMU executable
under test in time on Windows. It turns out that the socket receive
call got timeout before it receive the complete response.

The timeout value is supposed to be set to 50 seconds via the
setsockopt() call, but there is a difference among platforms.
The timeout unit of blocking receive calls is measured in
seconds on non-Windows platforms but milliseconds on Windows.

Signed-off-by: Bin Meng <bin.meng@windriver.com>
---

 tests/qtest/libqtest.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Marc-André Lureau Sept. 1, 2022, 11:57 a.m. UTC | #1
Hi

On Wed, Aug 24, 2022 at 3:44 PM Bin Meng <bmeng.cn@gmail.com> wrote:

> From: Bin Meng <bin.meng@windriver.com>
>
> Some qtest cases don't get response from the the QEMU executable
>

"the the"


> under test in time on Windows. It turns out that the socket receive
> call got timeout before it receive the complete response.
>
> The timeout value is supposed to be set to 50 seconds via the
> setsockopt() call, but there is a difference among platforms.
> The timeout unit of blocking receive calls is measured in
> seconds on non-Windows platforms but milliseconds on Windows.
>

Ahah, interesting :) Well, it's not the only difference, windows uses DWORD
instead of timeval


>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>
>  tests/qtest/libqtest.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 918f4657ed..7b41971347 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -36,13 +36,14 @@
>  #include "qapi/qmp/qstring.h"
>
>  #define MAX_IRQ 256
> -#define SOCKET_TIMEOUT 50
>
>  #ifndef _WIN32
> +# define SOCKET_TIMEOUT 50
>  # define CMD_EXEC   "exec "
>  # define DEV_STDERR "/dev/fd/2"
>  # define DEV_NULL   "/dev/null"
>  #else
> +# define SOCKET_TIMEOUT 50000
>  # define CMD_EXEC   ""
>  # define DEV_STDERR "2"
>  # define DEV_NULL   "nul"
> @@ -108,8 +109,16 @@ static int socket_accept(int sock)
>      struct sockaddr_un addr;
>      socklen_t addrlen;
>      int ret;
> +    /*
> +     * timeout unit of blocking receive calls is different among platfoms.
> +     * It's in seconds on non-Windows platforms but milliseconds on
> Windows.
> +     */
> +#ifndef _WIN32
>      struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
>                                 .tv_usec = 0 };
> +#else
> +    DWORD timeout = SOCKET_TIMEOUT;
> +#endif
>
>      if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
>                     (void *)&timeout, sizeof(timeout))) {
> --
> 2.34.1
>
>
>
diff mbox series

Patch

diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 918f4657ed..7b41971347 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -36,13 +36,14 @@ 
 #include "qapi/qmp/qstring.h"
 
 #define MAX_IRQ 256
-#define SOCKET_TIMEOUT 50
 
 #ifndef _WIN32
+# define SOCKET_TIMEOUT 50
 # define CMD_EXEC   "exec "
 # define DEV_STDERR "/dev/fd/2"
 # define DEV_NULL   "/dev/null"
 #else
+# define SOCKET_TIMEOUT 50000
 # define CMD_EXEC   ""
 # define DEV_STDERR "2"
 # define DEV_NULL   "nul"
@@ -108,8 +109,16 @@  static int socket_accept(int sock)
     struct sockaddr_un addr;
     socklen_t addrlen;
     int ret;
+    /*
+     * timeout unit of blocking receive calls is different among platfoms.
+     * It's in seconds on non-Windows platforms but milliseconds on Windows.
+     */
+#ifndef _WIN32
     struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT,
                                .tv_usec = 0 };
+#else
+    DWORD timeout = SOCKET_TIMEOUT;
+#endif
 
     if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,
                    (void *)&timeout, sizeof(timeout))) {