1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
--[[
test startup of the nng api
]]
describe("nng",function()
local nng
it("should be included with require()",function()
nng = require("nng")
end)
it("should be able to create sockets",function()
local socket = assert(nng.pair1_open())
end)
it("should be able to extablish a connection over inter-process communication",function()
local s1 = assert(nng.pair1_open())
local s2 = assert(nng.pair1_open())
assert(s1:listen("ipc:///tmp/pair.ipc"))
assert(s2:dial("ipc://tmp/pair.ipc"))
assert(s2:send("hello"))
local rec = assert(s1:recv())
assert(rec == "hello","Failed to receive hello, received:" .. rec)
end)
it("should be able to use a bus socket to distribute information",function()
local b = {}
for i = 1,10 do
local s = assert(nng.bus0_open())
b[i] = s
end
for i = 1,10 do
local ipcaddr = string.format("ipc:///tmp/bus_%d.ipc",i)
assert(b[i]:listen(ipcaddr))
end
for i = 1,10 do
for j = 1,10 do
if i ~= j then
local addr = string.format("ipc:///tmp/bus_%d.ipc",j)
assert(b[i]:dial(addr))
end
end
end
assert(b[1]:send("Hello"))
for i = 2,10 do
local msg = assert(b[i]:recv())
assert(msg == "Hello")
end
end)
it("should be able to use a survey socket to gather information",function()
math.randomseed(os.time())
local s = assert(nng.surveyor0_open())
assert(s:listen("ipc:///tmp/survey.ipc"))
local b = {}
for i = 1,100 do
local r = assert(nng.respondent0_open())
assert(r:dial("ipc:///tmp/survey.ipc"))
b[i] = r
end
assert(s:send("Hello"))
for i = 1,100 do
local survey = assert(b[i]:recv())
assert(survey == "Hello")
assert(b[i]:send(string.format("%f",math.random())))
end
local responses = {}
while true do
local succ, msg = s:recv(nng.NNG_FLAG_NONBLOCK)
if succ then
table.insert(responses,tonumber(succ))
elseif msg == "Try again" then
os.execute("sleep 1")
elseif msg == "Incorrect state" then
break
end
end
local avg = 0
for _,v in pairs(responses) do
avg = avg + v
end
avg = avg / #responses
--avg should be about 0.5
assert(avg > 0.4, "Average was:" .. avg)
assert(avg < 0.6, "Average was:" .. avg)
end)
it("should be able to use publish and subscribe sockets to transfer information", function()
--for i = 1,1000 do
for i = 1,10 do
local s1 = assert(nng.pub0_open())
local s2 = assert(nng.sub0_open())
local s3 = assert(nng.sub0_open())
--local listener, err = s1:listen("tcp://127.0.0.1:1000")
local listener, err = s1:listen("ipc:///tmp/pub.ipc")
local dialers = {}
local num_addr_in_use = 0
while err == "Address in use" do
num_addr_in_use = num_addr_in_use + 1
if num_addr_in_use > 10 then
error("After multiple attempts, failed to bind on round " .. i)
end
listener, err = s1:listen("tcp://127.0.0.1:1000")
--listener, err = s1:listen("ipc:///tmp/pub.ipc")
end
assert(s2:dial("tcp://127.0.0.1:1000"))
assert(s3:dial("tcp://127.0.0.1:1000"))
--local d1 = assert(s2:dial("ipc:///tmp/pub.ipc"))
--local d2 = assert(s3:dial("ipc:///tmp/pub.ipc"))
assert(s2:subscribe(""))
assert(s3:subscribe(""))
table.insert(dialers, d1)
table.insert(dialers, d2)
assert(s1:send("hello 1"))
local r1 = assert(s2:recv())
assert.are_equal(r1,"hello 1")
local r2 = assert(s2:recv())
assert.are_equal(s2,"hello 1")
listener:close()
s1:close()
s2:close()
s3:close()
end
end)
describe("socket option",function()
describe("LOCADDR",function()
it("should return the local address for a socket",function()
local nng = require("nng")
local s1 = assert(nng.bus0_open())
local s2 = assert(nng.bus0_open())
local listener = assert(s1:listen("tcp://127.0.0.1:1001"))
local dialer = assert(s2:dial("tcp://127.0.0.1:1001"))
--local listener = s1:listen("ipc:///tmp/locaddr.ipc")
--local dialer = s2:dial("ipc:///tmp/locaddr.ipc")
assert(s1:send("test"))
assert(s2:recv() == "test")
local addr = dialer[nng.NNG_OPT_URL]
end)
end)
end)
describe("tcp transport",function()
it("has a keepalive option that prevents the tcp connection from closing #writing2",function()
local nng = require("nng")
local s1 = assert(nng.pair1_open())
local s2 = assert(nng.pair1_open())
s1[nng.NNG_OPT_TCP_KEEPALIVE] = true
--print(s1[nng.NNG_OPT_TCP_KEEPALIVE])
assert(s1:listen("tcp://127.0.0.1:1000"))
assert(s2:dial("tcp://127.0.0.1:1000"))
end)
end)
end)
|