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 |
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 --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))) {