--[[ test the asyncronous parts of nnng ]] local nng = require("nng") local lanes = require("lanes").configure() describe("nng.aio",function() it("should be able to create aio object",function() print("one") local aio = assert(nng.aio.alloc(function() end)) end) it("should accept a callback with arguments",function() print("two") local aio = assert(nng.aio.alloc(function(a,b,c) print("hello") end, "one", 2, "three")) end) --it("should call the callback after sleeping", function() --print("three") --local called = false --local callback = function(lock) --called = true --end --print("about to alloc") --local aio = assert(nng.aio.alloc(callback)) --print("done alloc") --print("about to sleep") --nng.aio.sleep(1,aio) --print("whatever:",whatever) ----nng.aio.sleep(1,aio) --print("done sleep") --os.execute("sleep 1") --lock(-1) --print("checking called...") --print("called was",called) --assert(called) --end) it("should call more than one socket getting a callback at once",function() print("checking recv_any callback") local s1 = assert(nng.bus0_open()) assert(s1:listen("tcp://127.0.0.1:4000")) local s2 = assert(nng.bus0_open()) assert(s2:listen("tcp://127.0.0.1:4001")) local s3 = assert(nng.bus0_open()) assert(s3:dial("tcp://127.0.0.1:4000")) assert(s3:dial("tcp://127.0.0.1:4001")) for i = 1, 100 do --100 times to try to trigger race conditions --print("i:",i) assert(s3:send("one")) assert(s3:send("two")) local s1_got_one, s1_got_two, s2_got_one, s2_got_two = false, false, false, false while not (s1_got_one and s1_got_two and s2_got_one and s2_got_two) do --local socket, message = nng.aio.recv_any(s1, s2) --print("about to start recv_any") --local tbl = nng.aio.recv_any(s1,s2) for socket, message in pairs(nng.aio.recv_any(s1,s2)) do --print("in one recv any:",socket, message) if socket == s1 then if message == "one" then s1_got_one = true elseif message == "two" then s1_got_two = true else error("message socket 1:" .. message) end elseif socket == s2 then if message == "one" then s2_got_one = true elseif message == "two" then s2_got_two = true else error("message socket 2:" .. message) end else error("socket:" .. tostring(socket)) end --print("done with recv_any",s1_got_one, s1_got_two, s2_got_one, s2_got_two) end end assert(s1_got_one) assert(s1_got_two) assert(s2_got_one) assert(s2_got_two) end print("Sucessful completion of recv_any test") end) it("Should accept multiple sockets of dispirate types #writing",function() local servers = {} local clients = {} local messages = {} local halfs = { {"rep","req",true}, {"bus","bus",nil}, {"surveyor","respondent",false}, {"pub","sub",false} } for i = 1, 10 do local rng = math.random(#halfs) --Create server servers[i] = assert(nng[halfs[rng][1] .. "0_open"]()) local url = string.format("tcp://127.0.0.1:%d",4000 + i) assert(servers[i]:listen(url)) --Create clients local numclients = math.random(1,3) clients[i] = {} messages[i] = {} for j = 1, numclients do clients[i][j] = assert(nng[halfs[rng][2] .. "0_open"]()) assert(clients[i][j]:dial(url)) messages[i][j] = {} if halfs[rng][3] == true then --we send messages local nummessages = math.random(5) for k = 1, nummessages do local message = string.format("ping_%d_%d_%d",i,j,k) assert(clients[i][j]:send(message)) table.insert(messages[i][j],message) end --elseif halfs[rng][3] == nil then --we can send or receive messages else --we receive and reply to messages end end end for socket, message in pairs(nng.aio.recv_any(table.unpack(servers))) do print("GOT MESSAGE:",message) end end) end)