From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 6283C2963D for ; Fri, 30 Aug 2019 11:28:48 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id X3HrGTcgmiE2 for ; Fri, 30 Aug 2019 11:28:48 -0400 (EDT) Received: from smtp56.i.mail.ru (smtp56.i.mail.ru [217.69.128.36]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 9E43429634 for ; Fri, 30 Aug 2019 11:28:47 -0400 (EDT) From: Ilya Kosarev Subject: [tarantool-patches] [PATCH] test: fix flaky socket test Date: Fri, 30 Aug 2019 18:28:37 +0300 Message-Id: <20190830152837.10171-1-i.kosarev@tarantool.org> Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: georgy@tarantool.org, alexander.turenko@tarantool.org, avtikhon@tarantool.org, Ilya Kosarev socket.test had a number of problems: - racing condition on closing socket around line 640 - racing condition on waiting around line 42 - racing conditions on "receiving_socket:recv" around line 777 Now they are solved. Closes #4451, #4426 --- 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 test/app/socket.result | 43 +++++++++++++++++++++++++++++++++------- test/app/socket.test.lua | 22 ++++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/test/app/socket.result b/test/app/socket.result index fd299424c..811f6b4e9 100644 --- a/test/app/socket.result +++ b/test/app/socket.result @@ -107,11 +107,11 @@ s:nonblock(true) --- - true ... -s:readable(.1) +s:readable(.5) --- - true ... -s:wait(.1) +s:wait(.5) --- - RW ... @@ -1822,8 +1822,14 @@ test_run:cmd("setopt delimiter ';'") --- - true ... +socket_opened = true cfiber = fiber.create(function(sc, rch, wch) - while sc:send(wch:get()) and rch:put(sc:receive("*l")) do end + while socket_opened do + sc:send(wch:get()) + local data = sc:receive("*l") + if not socket_opened then sc:close() end + rch:put(data) + end end, sc, rch, wch); --- ... @@ -1936,6 +1942,9 @@ c:receive("*l") --- - ... +socket_opened = false +--- +... wch:put("Fu") --- - true @@ -1944,10 +1953,6 @@ c:send("354 Please type your message\n") --- - 29 ... -sc:close() ---- -- 1 -... c:receive("*l", "Line: ") --- - null @@ -2292,6 +2297,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message = receiving_socket:recv() --- ... @@ -2315,6 +2323,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom() --- ... @@ -2392,6 +2403,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message = receiving_socket:recv(512) --- ... @@ -2415,6 +2429,9 @@ sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) --- - 0 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom(512) --- ... @@ -2452,6 +2469,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message = receiving_socket:recv() --- ... @@ -2484,6 +2504,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom() --- ... @@ -2523,6 +2546,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message = receiving_socket:recv(512) --- ... @@ -2566,6 +2592,9 @@ sending_socket:sendto('127.0.0.1', receiving_socket_port, message) --- - 1025 ... +fiber.yield() +--- +... received_message, from = receiving_socket:recvfrom(512) --- ... diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua index c72d41763..8cb693735 100644 --- a/test/app/socket.test.lua +++ b/test/app/socket.test.lua @@ -39,8 +39,8 @@ s:nonblock(false) s:nonblock() s:nonblock(true) -s:readable(.1) -s:wait(.1) +s:readable(.5) +s:wait(.5) socket.iowait(s:fd(), 'RW') socket.iowait(s:fd(), 3) socket.iowait(s:fd(), 'R') @@ -619,8 +619,14 @@ s:settimeout(100500) rch, wch = fiber.channel(1), fiber.channel(1) sc = socket.connect(host, port) test_run:cmd("setopt delimiter ';'") +socket_opened = true cfiber = fiber.create(function(sc, rch, wch) - while sc:send(wch:get()) and rch:put(sc:receive("*l")) do end + while socket_opened do + sc:send(wch:get()) + local data = sc:receive("*l") + if not socket_opened then sc:close() end + rch:put(data) + end end, sc, rch, wch); test_run:cmd("setopt delimiter ''"); @@ -651,9 +657,9 @@ rch:get() wch:put("DATA\n") c:receive(4) c:receive("*l") +socket_opened = false wch:put("Fu") c:send("354 Please type your message\n") -sc:close() c:receive("*l", "Line: ") c:receive() c:receive(10) @@ -778,6 +784,7 @@ e == errno.EAGAIN -- expected true -- case: recv, zero datagram sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message = receiving_socket:recv() e = receiving_socket:errno() received_message == '' -- expected true @@ -786,6 +793,7 @@ e == 0 -- expected true -- case: recvfrom, zero datagram sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message, from = receiving_socket:recvfrom() e = receiving_socket:errno() received_message == '' -- expected true @@ -812,6 +820,7 @@ e == errno.EAGAIN -- expected true -- case: recv, zero datagram, explicit size sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message = receiving_socket:recv(512) e = receiving_socket:errno() received_message == '' -- expected true @@ -820,6 +829,7 @@ e == 0 -- expected true -- case: recvfrom, zero datagram, explicit size sendto_zero(sending_socket, '127.0.0.1', receiving_socket_port) +fiber.yield() received_message, from = receiving_socket:recvfrom(512) e = receiving_socket:errno() received_message == '' -- expected true @@ -833,6 +843,7 @@ 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) +fiber.yield() received_message = receiving_socket:recv() e = receiving_socket:errno() received_message == message -- expected true @@ -844,6 +855,7 @@ e -- case: recvfrom, non-zero length datagram, the buffer size should be -- evaluated sending_socket:sendto('127.0.0.1', receiving_socket_port, message) +fiber.yield() received_message, from = receiving_socket:recvfrom() e = receiving_socket:errno() received_message == message -- expected true @@ -856,6 +868,7 @@ 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) +fiber.yield() received_message = receiving_socket:recv(512) e = receiving_socket:errno() received_message == message:sub(1, 512) -- expected true @@ -872,6 +885,7 @@ 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) +fiber.yield() received_message, from = receiving_socket:recvfrom(512) e = receiving_socket:errno() received_message == message:sub(1, 512) -- expected true -- 2.17.1