From 27ece5603fc0cde89183ceb61f915fa64fef1061 Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Wed, 29 Jul 2020 12:18:10 -0400 Subject: Added recv_any() recv_any() is a function that takes multiple sockets and waits for one or more of them to receive. See the unit test for examples. --- spec/aio_spec.lua | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 spec/aio_spec.lua (limited to 'spec/aio_spec.lua') diff --git a/spec/aio_spec.lua b/spec/aio_spec.lua new file mode 100644 index 0000000..8c7c332 --- /dev/null +++ b/spec/aio_spec.lua @@ -0,0 +1,136 @@ +--[[ +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) -- cgit v1.2.3-70-g09d2