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

Ilya Kosarev i.kosarev at tarantool.org
Mon Dec 23 23:48:38 MSK 2019


Hi!

Thanks for your review.
3 answers are below.
Sent v4 including all proposed changes with minor fixes.
There are 2 comments in that section. 
>Вторник, 17 декабря 2019, 3:03 +03:00 от Vladislav Shpilevoy <v.shpilevoy at tarantool.org>:
>
>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. 
3. Right. My bad.
>
>
>>  ---
>>  - 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. 
4. Ok, i see, we don't need to touch infinite timeout cases.
>
>
>>  ---
>>  - 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. 
5. Nice, i didn't consider this possibility. Therefore we don't
need to perform manual random port search.
>
>
>> +---
>> +...
>>  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 
1. We need to start listening here.
>
> 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()
2. It still seems to me that we don't want to hang on chan:put() even
in case server fails to start, as far as it makes output less clear.
However, alternative construction also seems to be quite confusing.
Considering that it shouldn't also fail any more, i see why it is
better to leave unwrapped construction.
>
>
>===========================================================================
>
>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


-- 
Ilya Kosarev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20191223/3017d76d/attachment.html>


More information about the Tarantool-patches mailing list