107 lines
2.7 KiB
Lua
107 lines
2.7 KiB
Lua
-- Tests Copas socket timeouts
|
|
--
|
|
-- Run the test file, it should exit successfully without hanging.
|
|
|
|
-- make sure we are pointing to the local copas first
|
|
package.path = string.format("../src/?.lua;%s", package.path)
|
|
|
|
|
|
local copas = require("copas")
|
|
local socket = require("socket")
|
|
|
|
-- hack; no way to kill copas.loop from thread
|
|
local function error(err)
|
|
print(debug.traceback(err, 2))
|
|
os.exit(-1)
|
|
end
|
|
local function assert(truthy, err)
|
|
if not truthy then
|
|
print(debug.traceback(err, 2))
|
|
os.exit(-1)
|
|
end
|
|
end
|
|
|
|
-- udp echo server for testing against, returns `ip, port` to connect to
|
|
-- send `quit\n` to cause server to disconnect client
|
|
-- stops listen server after provided number of echos
|
|
local function singleuseechoserver(die_after)
|
|
die_after = die_after or 1
|
|
local server = socket.udp()
|
|
server:setsockname("127.0.0.1", 0) -- "localhost" fails because of IPv6 error
|
|
local ip, port = server:getsockname()
|
|
|
|
copas.addthread(function()
|
|
local skt = copas.wrap(server)
|
|
while die_after > 0 do
|
|
local data, ip, port = skt:receivefrom()
|
|
if not data or data == "quit" then
|
|
break
|
|
end
|
|
skt:sendto(data, ip, port)
|
|
die_after = die_after - 1
|
|
end
|
|
end)
|
|
|
|
return ip, port
|
|
end
|
|
|
|
local tests = {}
|
|
|
|
function tests.receive_timeout()
|
|
local ip, port = singleuseechoserver(1)
|
|
|
|
copas.addthread(function()
|
|
local client = socket.udp()
|
|
client = copas.wrap(client)
|
|
client:settimeout(0.01)
|
|
local status, err = client:setpeername(ip, port)
|
|
assert(status, "failed to connect: "..tostring(err))
|
|
|
|
client:send("foo")
|
|
local data, err = client:receive()
|
|
assert(data, "failed to recieve: "..tostring(err))
|
|
assert(data == "foo", "recieved wrong echo: "..tostring(data))
|
|
|
|
local data, err = client:receive()
|
|
assert(data == nil, "somehow recieved echo without sending")
|
|
assert(err == "timeout", "failed with non-timeout error")
|
|
|
|
client:close()
|
|
end)
|
|
|
|
copas.loop()
|
|
end
|
|
|
|
function tests.receivefrom_timeout()
|
|
local ip, port = singleuseechoserver(1)
|
|
|
|
copas.addthread(function()
|
|
local client = socket.udp()
|
|
client = copas.wrap(client)
|
|
client:settimeout(0.01)
|
|
|
|
client:sendto("foo", ip, port)
|
|
local data, err = client:receivefrom()
|
|
assert(data, "failed to recieve: "..tostring(err))
|
|
assert(data == "foo", "recieved wrong echo: "..tostring(data))
|
|
|
|
local data, err = client:receivefrom()
|
|
assert(data == nil, "somehow recieved echo without sending")
|
|
assert(err == "timeout", "failed with non-timeout error")
|
|
|
|
client:close()
|
|
end)
|
|
|
|
copas.loop()
|
|
end
|
|
|
|
-- test "framework"
|
|
for name, test in pairs(tests) do
|
|
print("testing: "..tostring(name))
|
|
local status, err = pcall(test)
|
|
if not status then
|
|
error(err)
|
|
end
|
|
end
|
|
|
|
print("[✓] all tests completed successuly")
|