118 lines
3.8 KiB
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()
|