[Tarantool-patches] [PATCH v3] test: fix flaky socket test

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Tue Dec 17 03:03:28 MSK 2019


Thanks for the patch!

See 6 comments below, and 2 review fix commits in the
end.

On 10/12/2019 15:36, Ilya Kosarev wrote:
> test: fix flaky socket test

1. You've duplicated the commit title in the
commit message.

> 
> socket.test had a number of flaky problems:
> - socket readiness expectation
> - race conditions on socket shutdown in emulation test cases
> - tcp_server stability in socket receive inconsistent behavior case
> Now they are solved. Port randomization is improved.
> Socket test is not fragile anymore.

2. It depends on definition of 'fragile test'. Any test using UDP
can fail under sufficiently high load. And this test is not an
exception. After your and my fixes it fails extremely rare, but
still fails. That happens under huge load when the kernel starts
dropping UDP packets. Not delivers them with a delay, but drops.

But I guess yeah, we can remove the 'fragile' flag. Unless our
test suite will ever try to run 64 socket tests in parallel a
couple of times.

> 
> Closes #4451, #4426, #4469
> ---
> Branch: https://github.com/tarantool/tarantool/tree/i.kosarev/gh-4426-4451-fix-socket-test
> Issues: https://github.com/tarantool/tarantool/issues/4426
>         https://github.com/tarantool/tarantool/issues/4451
>         https://github.com/tarantool/tarantool/issues/4469
> 
> Changes in v2:
> - reconsidered socket readiness expectation
> - reduced conditions waiting time
> 
> Changes in v3:
> - reconsidered expectations to unify them
> - simplified randomization
> 
>  test/app/socket.result   | 159 +++++++++++++++++++++++++--------------
>  test/app/socket.test.lua | 123 +++++++++++++++++++-----------
>  test/app/suite.ini       |   1 -
>  3 files changed, 178 insertions(+), 105 deletions(-)
> 
> diff --git a/test/app/socket.result b/test/app/socket.result
> index fd299424c96..25ad9034374 100644
> --- a/test/app/socket.result
> +++ b/test/app/socket.result
> @@ -278,14 +278,14 @@ s:error()
>  ---
>  - null
>  ...
> -s:listen(128)
> +s:listen(WAIT_COND_TIME)

3. I suggest you to read socket.lua source code. Listen takes
backlog size, not a timeout. The same comment to many other
places.

>  ---
>  - true
>  ...
>  sevres = {}
>  ---
>  ...
> -type(require('fiber').create(function() s:readable() do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))
> +type(require('fiber').create(function() s:readable(WAIT_COND_TIME) do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))

4. :readable() has infinity timeout. When you made it WAIT_COND_TIME,
you certainly didn't improve the test stability. The same in other
similar places.

>  ---
>  - userdata
>  ...
> @@ -1004,7 +1004,7 @@ socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED
>  - null
>  - true
>  ...
> -s:listen()
> +s:listen(WAIT_COND_TIME)
>  ---
>  - true
>  ...
> @@ -1074,6 +1074,9 @@ master:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
>  ---
>  - true
>  ...
> +math.randomseed(fiber.time())

5. This line becomes useless when you've increased the timeout.
Moreover, the random port search below also does not make any
sense. You could use port 0 to bind to any free port instead of
manual guessing for the kernel.

> +---
> +...
>  port = 32768 + math.random(0, 32767)
>  ---
>  ...
> @@ -2231,7 +2239,17 @@ test_run:cmd("setopt delimiter ''");
>  receiving_socket = socket('AF_INET', 'SOCK_DGRAM', 'udp')
>  ---
>  ...
> -receiving_socket:bind('127.0.0.1', 0)
> +test_run:cmd("setopt delimiter ';'")
> +---
> +- true
> +...
> +test_run:wait_cond(function()
> +    return receiving_socket:bind('127.0.0.1', 32768 + math.random(0, 32767))
> +end, WAIT_COND_TIME);

6. Why? Bind with 0 port finds a suitable port. You don't
need to do random guessing. The same in many other places.

> +---
> +- true
> +...
> +test_run:cmd("setopt delimiter ''");
>  ---
>  - true
>  ...
Below are 2 my commits. First with review fixes to the patch. Second
with stabilization of UDP tests (well, not 100% stability, but much
better. 100% would require to rework the tests too much loosing their
purpose).

Please, review them, squahs if you agree, and send to a second review
to someone. For example to Alexander. But taking into account urgency
of 2.3.1 maybe we can't wait several weeks more, so ask Kirill.

===========================================================================

commit fc11ffbd9135554b2b91728483189ababa86c36e
Author: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
Date:   Mon Dec 16 23:33:21 2019 +0100

    Review fixes

diff --git a/test/app/socket.result b/test/app/socket.result
index 25ad90343..563519315 100644
--- a/test/app/socket.result
+++ b/test/app/socket.result
@@ -278,14 +278,14 @@ s:error()
 ---
 - null
 ...
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 ---
 - true
 ...
 sevres = {}
 ---
 ...
-type(require('fiber').create(function() s:readable(WAIT_COND_TIME) do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))
+type(require('fiber').create(function() s:readable() do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))
 ---
 - userdata
 ...
@@ -440,7 +440,7 @@ s:bind('127.0.0.1', 0)
 ---
 - true
 ...
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 ---
 - true
 ...
@@ -485,7 +485,7 @@ sa:read(3)
 ---
 - orl
 ...
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 ---
 - true
 ...
@@ -513,7 +513,7 @@ sa:read(1, .01)
 ---
 - null
 ...
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 ---
 - true
 ...
@@ -546,7 +546,7 @@ sc:send('Hello')
 ---
 - 5
 ...
-sa:readable(WAIT_COND_TIME)
+sa:readable()
 ---
 - true
 ...
@@ -646,7 +646,7 @@ sc ~= nil
 ---
 - true
 ...
-s:listen(WAIT_COND_TIME)
+s:listen(1234)
 ---
 - true
 ...
@@ -665,7 +665,7 @@ sc:error()
 ---
 - null
 ...
-s:readable(WAIT_COND_TIME)
+s:readable()
 ---
 - true
 ...
@@ -754,7 +754,7 @@ string.match(tostring(sc), ', peer') == nil
 ---
 - true
 ...
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 ---
 - true
 ...
@@ -957,7 +957,7 @@ s:bind('127.0.0.1', 0)
 port = s:name().port
 ---
 ...
-s:listen(WAIT_COND_TIME)
+s:listen()
 ---
 - true
 ...
@@ -1004,7 +1004,7 @@ socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED
 - null
 - true
 ...
-s:listen(WAIT_COND_TIME)
+s:listen()
 ---
 - true
 ...
@@ -1070,39 +1070,21 @@ s = nil
 master = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 ---
 ...
-master:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
+master:bind('127.0.0.1', 0)
 ---
 - true
 ...
-math.randomseed(fiber.time())
----
-...
-port = 32768 + math.random(0, 32767)
+port = master:name().port
 ---
 ...
--- SO_REUSEADDR allows to bind to the same source addr:port twice,
--- so listen() can return EADDRINUSE and so we check it within
--- wait_cond().
 test_run:cmd("setopt delimiter ';'")
 ---
 - true
 ...
-test_run:wait_cond(function()
-    local ok = master:bind('127.0.0.1', port)
-    local ok = ok and master:listen(WAIT_COND_TIME)
-    if not ok then
-        port = 32768 + math.random(32768)
-        return false, master:error()
-    end
-    return true
-end, WAIT_COND_TIME);
----
-- true
-...
 function gh361()
     local s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
     s:sysconnect('127.0.0.1', port)
-    s:wait(WAIT_COND_TIME)
+    s:wait()
     res = s:read(1200)
 end;
 ---
@@ -1149,7 +1131,7 @@ s:error()
 ---
 - null
 ...
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 ---
 - true
 ...
@@ -1159,7 +1141,7 @@ test_run:cmd("setopt delimiter ';'")
 ...
 f = fiber.create(function()
     for i=1,2 do
-        s:readable(WAIT_COND_TIME)
+        s:readable()
         local sc = s:accept()
         sc:write('ok!')
         sc:shutdown()
@@ -1535,7 +1517,7 @@ s:bind('unix/', path)
 ---
 - true
 ...
-s:listen(WAIT_COND_TIME)
+s:listen()
 ---
 - true
 ...
@@ -1762,7 +1744,7 @@ s:bind('127.0.0.1', 0) -- error handling
 - null
 - Invalid argument
 ...
-s:listen(WAIT_COND_TIME)
+s:listen(10)
 ---
 - 1
 ...
@@ -2239,17 +2221,7 @@ test_run:cmd("setopt delimiter ''");
 receiving_socket = socket('AF_INET', 'SOCK_DGRAM', 'udp')
 ---
 ...
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-test_run:wait_cond(function()
-    return receiving_socket:bind('127.0.0.1', 32768 + math.random(0, 32767))
-end, WAIT_COND_TIME);
----
-- true
-...
-test_run:cmd("setopt delimiter ''");
+receiving_socket:bind('127.0.0.1', 0)
 ---
 - true
 ...
@@ -2643,21 +2615,11 @@ listening_socket:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
 ---
 - true
 ...
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-test_run:wait_cond(function()
-    return listening_socket:bind('127.0.0.1', 32768 + math.random(0, 32767))
-end, WAIT_COND_TIME);
----
-- true
-...
-test_run:cmd("setopt delimiter ''");
+listening_socket:bind('127.0.0.1', 0)
 ---
 - true
 ...
-listening_socket:listen(WAIT_COND_TIME)
+listening_socket:listen()
 ---
 - true
 ...
@@ -2671,18 +2633,12 @@ sending_socket:sysconnect('127.0.0.1', listening_socket_port) or errno() == errn
 ---
 - true
 ...
-test_run:cmd("setopt delimiter ';'")
+listening_socket:readable(WAIT_COND_TIME)
 ---
 - true
 ...
-receiving_socket = test_run:wait_cond(function()
-    return listening_socket:accept()
-end, WAIT_COND_TIME);
----
-...
-test_run:cmd("setopt delimiter ''");
+receiving_socket = listening_socket:accept()
 ---
-- true
 ...
 sending_socket:write(message)
 ---
@@ -2864,46 +2820,41 @@ counter = 0
 fn = function(s) counter = 0; while true do s:write((tostring(counter)):rep(chan:get())); counter = counter + 1 end end
 ---
 ...
-srv = nil
+srv = socket.tcp_server('0.0.0.0', 0, fn)
 ---
 ...
-test_run:cmd("setopt delimiter ';'")
+s = socket.connect('localhost', srv:name().port)
 ---
-- true
 ...
-test_run:wait_cond(function()
-    port = 32768 + math.random(0, 32767)
-    srv = socket.tcp_server('0.0.0.0', port, fn)
-    return srv ~= nil
-end, WAIT_COND_TIME);
+chan:put(5)
 ---
 - true
 ...
-receive1 = nil; receive2 = nil;
+chan:put(5)
 ---
+- true
 ...
-if srv ~= nil then
-    s = socket.connect('localhost', port)
-    chan:put(5)
-    chan:put(5)
-    receive1 = s:receive(5)
-    chan:put(5)
-    s:settimeout(1)
-    receive2 = s:receive('*a')
-    s:close()
-    srv:close()
-end;
+s:receive(5)
 ---
+- '00000'
 ...
-test_run:cmd("setopt delimiter ''");
+chan:put(5)
 ---
 - true
 ...
-receive1
+s:settimeout(1)
 ---
-- '00000'
+- 1
 ...
-receive2
+s:receive('*a')
 ---
 - '1111122222'
 ...
+s:close()
+---
+- 1
+...
+srv:close()
+---
+- true
+...
diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua
index 97dac794e..9ba6b2893 100644
--- a/test/app/socket.test.lua
+++ b/test/app/socket.test.lua
@@ -91,9 +91,9 @@ s:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
 s:error()
 s:bind('127.0.0.1', 0)
 s:error()
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 sevres = {}
-type(require('fiber').create(function() s:readable(WAIT_COND_TIME) do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))
+type(require('fiber').create(function() s:readable() do local sc = s:accept() table.insert(sevres, sc) sc:syswrite('ok') sc:close() end end))
 #sevres
 
 sc = socket('PF_INET', 'SOCK_STREAM', 'tcp')
@@ -135,7 +135,7 @@ s:close()
 s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 s:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
 s:bind('127.0.0.1', 0)
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 
 sc = socket('PF_INET', 'SOCK_STREAM', 'tcp')
 
@@ -150,14 +150,14 @@ addr2.family == addr.family
 sa:nonblock(1)
 sa:read(8)
 sa:read(3)
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 sc:write(', again')
 sa:read(8)
 sa:error()
 string.len(sa:read(0))
 type(sa:read(0))
 sa:read(1, .01)
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 
 -- gh-3979 Check for errors when argument is negative.
 
@@ -170,7 +170,7 @@ sc:send('abc')
 sa:read(3)
 
 sc:send('Hello')
-sa:readable(WAIT_COND_TIME)
+sa:readable()
 sa:recv()
 sa:recv()
 
@@ -198,14 +198,14 @@ path = 'tarantool-test-socket'
 os.remove(path)
 s:bind('unix/', path)
 sc ~= nil
-s:listen(WAIT_COND_TIME)
+s:listen(1234)
 
 sc = socket('PF_UNIX', 'SOCK_STREAM', 0)
 sc:nonblock(true)
 sc:sysconnect('unix/', path)
 sc:error()
 
-s:readable(WAIT_COND_TIME)
+s:readable()
 sa = s:accept()
 sa:nonblock(true)
 sa:send('Hello, world')
@@ -243,7 +243,7 @@ sc:getsockopt('SOL_SOCKET', 'SO_ERROR')
 sc:nonblock(true)
 sc:sysconnect('127.0.0.1', 3458) or errno() == errno.EINPROGRESS or errno() == errno.ECONNREFUSED
 string.match(tostring(sc), ', peer') == nil
-sc:writable(WAIT_COND_TIME)
+sc:writable()
 string.match(tostring(sc), ', peer') == nil
 socket_error = sc:getsockopt('SOL_SOCKET', 'SO_ERROR')
 socket_error == errno.ECONNREFUSED or socket_error == 0
@@ -307,7 +307,7 @@ socket.tcp_connect('127.0.0.1', 80, 0.00000000001)
 s = socket('AF_INET', 'SOCK_STREAM', 'tcp')
 s:bind('127.0.0.1', 0)
 port = s:name().port
-s:listen(WAIT_COND_TIME)
+s:listen()
 sc, e = socket.tcp_connect('127.0.0.1', port), errno()
 sc ~= nil
 e == 0
@@ -321,7 +321,7 @@ _ = os.remove(path)
 s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 s:bind('unix/', path)
 socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED
-s:listen(WAIT_COND_TIME)
+s:listen()
 sc, e = socket.tcp_connect('unix/', path), errno()
 sc ~= nil
 e
@@ -342,26 +342,13 @@ s = nil
 
 -- random port
 master = socket('PF_INET', 'SOCK_STREAM', 'tcp')
-master:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
-math.randomseed(fiber.time())
-port = 32768 + math.random(0, 32767)
--- SO_REUSEADDR allows to bind to the same source addr:port twice,
--- so listen() can return EADDRINUSE and so we check it within
--- wait_cond().
+master:bind('127.0.0.1', 0)
+port = master:name().port
 test_run:cmd("setopt delimiter ';'")
-test_run:wait_cond(function()
-    local ok = master:bind('127.0.0.1', port)
-    local ok = ok and master:listen(WAIT_COND_TIME)
-    if not ok then
-        port = 32768 + math.random(32768)
-        return false, master:error()
-    end
-    return true
-end, WAIT_COND_TIME);
 function gh361()
     local s = socket('PF_INET', 'SOCK_STREAM', 'tcp')
     s:sysconnect('127.0.0.1', port)
-    s:wait(WAIT_COND_TIME)
+    s:wait()
     res = s:read(1200)
 end;
 test_run:cmd("setopt delimiter ''");
@@ -378,11 +365,11 @@ s:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
 s:error()
 s:bind('unix/', path)
 s:error()
-s:listen(WAIT_COND_TIME)
+s:listen(128)
 test_run:cmd("setopt delimiter ';'")
 f = fiber.create(function()
     for i=1,2 do
-        s:readable(WAIT_COND_TIME)
+        s:readable()
         local sc = s:accept()
         sc:write('ok!')
         sc:shutdown()
@@ -507,7 +494,7 @@ _ = os.remove(path)
 -- Test that socket is closed on GC
 s = socket('AF_UNIX', 'SOCK_STREAM', 0)
 s:bind('unix/', path)
-s:listen(WAIT_COND_TIME)
+s:listen()
 s = nil
 while socket.tcp_connect('unix/', path) do collectgarbage('collect') end
 _ = os.remove(path)
@@ -603,7 +590,7 @@ s:setoption('tcp-nodelay', true)
 s:setoption('unknown', true)
 s:bind('127.0.0.1', 0)
 s:bind('127.0.0.1', 0) -- error handling
-s:listen(WAIT_COND_TIME)
+s:listen(10)
 s -- transformed to tcp{server} socket
 host, port, family = s:getsockname()
 host == '127.0.0.1', type(port) == 'string', family == 'inet'
@@ -763,11 +750,7 @@ end;
 test_run:cmd("setopt delimiter ''");
 
 receiving_socket = socket('AF_INET', 'SOCK_DGRAM', 'udp')
-test_run:cmd("setopt delimiter ';'")
-test_run:wait_cond(function()
-    return receiving_socket:bind('127.0.0.1', 32768 + math.random(0, 32767))
-end, WAIT_COND_TIME);
-test_run:cmd("setopt delimiter ''");
+receiving_socket:bind('127.0.0.1', 0)
 receiving_socket_port = receiving_socket:name().port
 sending_socket = socket('AF_INET', 'SOCK_DGRAM', 'udp')
 
@@ -902,20 +885,13 @@ message = string.rep('x', message_len)
 
 listening_socket = socket('AF_INET', 'SOCK_STREAM', 'tcp')
 listening_socket:setsockopt('SOL_SOCKET', 'SO_REUSEADDR', true)
-test_run:cmd("setopt delimiter ';'")
-test_run:wait_cond(function()
-    return listening_socket:bind('127.0.0.1', 32768 + math.random(0, 32767))
-end, WAIT_COND_TIME);
-test_run:cmd("setopt delimiter ''");
-listening_socket:listen(WAIT_COND_TIME)
+listening_socket:bind('127.0.0.1', 0)
+listening_socket:listen()
 listening_socket_port = listening_socket:name().port
 sending_socket = socket('AF_INET', 'SOCK_STREAM', 'tcp')
 sending_socket:sysconnect('127.0.0.1', listening_socket_port) or errno() == errno.EINPROGRESS
-test_run:cmd("setopt delimiter ';'")
-receiving_socket = test_run:wait_cond(function()
-    return listening_socket:accept()
-end, WAIT_COND_TIME);
-test_run:cmd("setopt delimiter ''");
+listening_socket:readable(WAIT_COND_TIME)
+receiving_socket = listening_socket:accept()
 sending_socket:write(message)
 
 -- case: recvfrom reads first 512 bytes from the message with tcp
@@ -983,26 +959,14 @@ test_run:cmd("clear filter")
 chan = fiber.channel()
 counter = 0
 fn = function(s) counter = 0; while true do s:write((tostring(counter)):rep(chan:get())); counter = counter + 1 end end
-srv = nil
-test_run:cmd("setopt delimiter ';'")
-test_run:wait_cond(function()
-    port = 32768 + math.random(0, 32767)
-    srv = socket.tcp_server('0.0.0.0', port, fn)
-    return srv ~= nil
-end, WAIT_COND_TIME);
-receive1 = nil; receive2 = nil;
-if srv ~= nil then
-    s = socket.connect('localhost', port)
-    chan:put(5)
-    chan:put(5)
-    receive1 = s:receive(5)
-    chan:put(5)
-    s:settimeout(1)
-    receive2 = s:receive('*a')
-    s:close()
-    srv:close()
-end;
-test_run:cmd("setopt delimiter ''");
-receive1
-receive2
+srv = socket.tcp_server('0.0.0.0', 0, fn)
+s = socket.connect('localhost', srv:name().port)
+chan:put(5)
+chan:put(5)
+s:receive(5)
+chan:put(5)
+s:settimeout(1)
+s:receive('*a')
+s:close()
+srv:close()
 
===========================================================================

commit 5a5cd01a0c665f2438e05feb46dde964828f6c01
Author: Vladislav Shpilevoy <v.shpilevoy at tarantool.org>
Date:   Tue Dec 17 00:20:01 2019 +0100

    Make UDP more table on Mac

diff --git a/test/app/socket.result b/test/app/socket.result
index 563519315..cb3897ee1 100644
--- a/test/app/socket.result
+++ b/test/app/socket.result
@@ -2282,7 +2282,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
 ---
 - 0
 ...
-received_message = receiving_socket:recv()
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv()                      \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2305,7 +2307,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
 ---
 - 0
 ...
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2382,7 +2386,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
 ---
 - 0
 ...
-received_message = receiving_socket:recv(512)
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv(512)                   \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2405,7 +2411,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
 ---
 - 0
 ...
-received_message, from = receiving_socket:recvfrom(512)
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom(512)               \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2442,7 +2450,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
 ---
 - 1025
 ...
-received_message = receiving_socket:recv()
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv()                      \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2474,7 +2484,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
 ---
 - 1025
 ...
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2513,7 +2525,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
 ---
 - 1025
 ...
-received_message = receiving_socket:recv(512)
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv(512)                   \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2556,7 +2570,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
 ---
 - 1025
 ...
-received_message, from = receiving_socket:recvfrom(512)
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom(512)               \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
@@ -2645,7 +2661,9 @@ sending_socket:write(message)
 - 513
 ...
 -- case: recvfrom reads first 512 bytes from the message with tcp
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 ---
 ...
 e = receiving_socket:errno()
diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua
index 9ba6b2893..a0803519d 100644
--- a/test/app/socket.test.lua
+++ b/test/app/socket.test.lua
@@ -772,7 +772,9 @@ e == errno.EAGAIN -- expected true
 
 -- case: recv, zero datagram
 sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
-received_message = receiving_socket:recv()
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv()                      \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == '' -- expected true
 received_message
@@ -780,7 +782,9 @@ e == 0 -- expected true
 
 -- case: recvfrom, zero datagram
 sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == '' -- expected true
 received_message
@@ -806,7 +810,9 @@ e == errno.EAGAIN -- expected true
 
 -- case: recv, zero datagram, explicit size
 sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
-received_message = receiving_socket:recv(512)
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv(512)                   \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == '' -- expected true
 received_message
@@ -814,7 +820,9 @@ e == 0 -- expected true
 
 -- case: recvfrom, zero datagram, explicit size
 sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port)
-received_message, from = receiving_socket:recvfrom(512)
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom(512)               \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == '' -- expected true
 received_message
@@ -827,7 +835,9 @@ message = string.rep('x', message_len)
 
 -- case: recv, non-zero length datagram, the buffer size should be evaluated
 sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
-received_message = receiving_socket:recv()
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv()                      \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == message -- expected true
 received_message:len()
@@ -838,7 +848,9 @@ e
 -- case: recvfrom, non-zero length datagram, the buffer size should be
 -- evaluated
 sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == message -- expected true
 received_message:len()
@@ -850,7 +862,9 @@ e
 
 -- case: recv truncates a datagram larger then the buffer of an explicit size
 sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
-received_message = receiving_socket:recv(512)
+received_message = test_run:wait_cond(function()        \
+    return receiving_socket:recv(512)                   \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == message:sub(1, 512) -- expected true
 received_message:len() == 512 -- expected true
@@ -866,7 +880,9 @@ message = string.rep('y', message_len)
 
 -- case: recvfrom truncates a datagram larger then the buffer of an explicit size
 sending_socket:sendto('127.0.0.1', receiving_socket_port, message)
-received_message, from = receiving_socket:recvfrom(512)
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom(512)               \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == message:sub(1, 512) -- expected true
 received_message:len() == 512 -- expected true
@@ -895,7 +911,9 @@ receiving_socket = listening_socket:accept()
 sending_socket:write(message)
 
 -- case: recvfrom reads first 512 bytes from the message with tcp
-received_message, from = receiving_socket:recvfrom()
+received_message, from = test_run:wait_cond(function()  \
+    return receiving_socket:recvfrom()                  \
+end, WAIT_COND_TIME)
 e = receiving_socket:errno()
 received_message == message:sub(1, 512) -- expected true
 received_message:len() == 512 -- expected true


More information about the Tarantool-patches mailing list