aboutsummaryrefslogtreecommitdiff
path: root/spec/startup_spec.lua
blob: 1b3f7400afdedab297f6bb2e889cc98e3a77f82e (plain)
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
--[[
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()
		print("Starting survayor respondent test")
		math.randomseed(os.time())
		local s = assert(nng.surveyor0_open())
		print("About to listen")
		assert(s:listen("ipc:///tmp/survey.ipc"))
		print("S is listening")
		local b = {}
		for i = 1,100 do
			print("Testing",i)
			local r = assert(nng.respondent0_open())
			assert(r:dial("ipc:///tmp/survey.ipc"))
			print("Dialed",i)
			b[i] = r
		end
		print("About to send hello")
		assert(s:send("Hello"))
		print("Done sending hello")
		for i = 1,100 do
			print("About to recv from", i)
			local survey = assert(b[i]:recv())
			print("Done receving from ",i)
			assert(survey == "Hello")
			print("About to send number back")
			assert(b[i]:send(string.format("%f",math.random())))
			print("Done sending number back")
		end
		local responses = {}
		while true do
			print("Got ", #responses, "responses")
			local succ, msg = s:recv(nng.NNG_FLAG_NONBLOCK)
			if succ then
				table.insert(responses,tonumber(succ))
			elseif msg == "Try again" then
				print("Sleeping...")
				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)
		assert(avg < 0.6)
		print("Completed survayor respondent test")
	end)
	it("should be able to use publish and subscribe sockets to transfer information", function()
		print("starting pubsub test")
		for i = 1,1000 do
			local s1 = assert(nng.pub0_open())
			local s2 = assert(nng.sub0_open())
			local s3 = assert(nng.sub0_open())
			print("everything opened")
			--local listener, err = s1:listen("tcp://127.0.0.1:1000")
			local listener, err = s1:listen("ipc:///tmp/pub.ipc")
			local num_addr_in_use = 0
			while err == "Address in use" do
				print("Got addr in use")
				num_addr_in_use = num_addr_in_use + 1
				if num_addr_in_use > 1000 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
			print("s1 is listeneing...")
			assert(s2:subscribe("hello"))
			assert(s3:subscribe("hello"))
			--assert(s2:dial("tcp://127.0.0.1:1000"))
			--assert(s3:dial("tcp://127.0.0.1:1000"))
			assert(s2:dial("ipc:///tmp/pub.ipc"))
			assert(s3:dial("ipc:///tmp/pub.ipc"))
			print("Everything set up")
			assert(s1:send("hello 1"))
			print("sent")
			assert.are_equal(s2:recv(),"hello 1")
			print("received 1")
			assert.are_equal(s3:recv(),"hello 1")
			print("received 2")
			listener:close()
			s1:close()
		end
		print("Finishing pubsub test")
	end)
	describe("tcp transport",function()
		it("has a keepalive option that prevents the tcp connection from closing",function()
			print("starting tcp transport test")
			local s1 = assert(nng.pair1_open())
			local s2 = assert(nng.pair1_open())
			--s1[nng.NNG_OPT_TCP_KEEPALIVE] = true
			assert(s1:listen("tcp://127.0.0.1:1000"))
			assert(s2:dial("tcp://127.0.0.1:1000"))
			print("Finished tcp transport test")
		end)
	end)
end)