singe/thirdparty/copas/tests/largetransfer.lua

118 lines
3.8 KiB
Lua

-- tests large transmissions, sending and receiving
-- uses `receive` and `receivepartial`
-- Does send the same string twice simultaneously
--
-- Test should;
-- * show timer output, once per second, and actual time should be 1 second increments
-- * both transmissions should take appr. equal time, then they we're nicely cooperative
local copas = require 'copas'
local socket = require 'socket'
-- copas.debug.start()
local body = ("A"):rep(1024*1024*50) -- 50 mb string
local start = socket.gettime()
local done = 0
local sparams, cparams
local function runtest()
local s1 = socket.bind('*', 49500)
copas.addserver(s1, copas.handler(function(skt)
copas.setsocketname("Server 49500", skt)
copas.setthreadname("Server 49500")
--skt:settimeout(0) -- don't set, uses `receive` method
local res, err, part = skt:receive('*a')
res = res or part
if res ~= body then print("Received doesn't match send") end
print("Server reading port 49500... Done!", socket.gettime()-start, err, #res)
copas.removeserver(s1)
done = done + 1
end, sparams))
local s2 = socket.bind('*', 49501)
copas.addserver(s2, copas.handler(function(skt)
skt:settimeout(0) -- set, uses the `receivepartial` method
copas.setsocketname("Server 49501", skt)
copas.setthreadname("Server 49501")
local res, err, part = skt:receive('*a')
res = res or part
if res ~= body then print("Received doesn't match send") end
print("Server reading port 49501... Done!", socket.gettime()-start, err, #res)
copas.removeserver(s2)
done = done + 1
end, sparams))
copas.addnamedthread("Client 49500", function()
local skt = socket.tcp()
skt = copas.wrap(skt, cparams)
copas.setsocketname("Client 49500", skt)
skt:connect("localhost", 49500)
local last_byte_sent, err
repeat
last_byte_sent, err = skt:send(body, last_byte_sent or 1, -1)
until last_byte_sent == nil or last_byte_sent == #body
print("Client writing port 49500... Done!", socket.gettime()-start, err, #body)
-- we're not closing the socket, so the Copas GC-when-idle can kick-in to clean up
skt = nil -- luacheck: ignore
done = done + 1
end)
copas.addnamedthread("Client 49501", function()
local skt = socket.tcp()
skt = copas.wrap(skt, cparams)
copas.setsocketname("Client 49501", skt)
skt:connect("localhost", 49501)
local last_byte_sent, err
repeat
last_byte_sent, err = skt:send(body, last_byte_sent or 1, -1)
until last_byte_sent == nil or last_byte_sent == #body
print("Client writing port 49501... Done!", socket.gettime()-start, err, #body)
-- we're not closing the socket, so the Copas GC-when-idle can kick-in to clean up
skt = nil -- luacheck: ignore
done = done + 1
end)
copas.addnamedthread("test timeout thread", function()
local i = 1
while done ~= 4 do
copas.pause(1)
print(i, "seconds:", socket.gettime()-start)
i = i + 1
if i > 60 then
print"timeout"
os.exit(1)
end
end
print "success!"
end)
print("starting loop")
copas.loop()
print("Loop done")
end
runtest() -- run test using regular connection (s/cparams == nil)
-- set ssl parameters and do it again
sparams = {
mode = "server",
protocol = "tlsv1",
key = "tests/certs/serverAkey.pem",
certificate = "tests/certs/serverA.pem",
cafile = "tests/certs/rootA.pem",
verify = {"peer", "fail_if_no_peer_cert"},
options = {"all", "no_sslv2"},
}
cparams = {
mode = "client",
protocol = "tlsv1",
key = "tests/certs/clientAkey.pem",
certificate = "tests/certs/clientA.pem",
cafile = "tests/certs/rootA.pem",
verify = {"peer", "fail_if_no_peer_cert"},
options = {"all", "no_sslv2"},
}
done = 0
start = socket.gettime()
runtest()