aboutsummaryrefslogtreecommitdiff
path: root/test/testsrvr.lua
blob: 7b899879109fe88072a44a09cccee06cfb5c70f7 (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
-----------------------------------------------------------------------------
-- LuaSocket automated test module
-- testsrvr.lua
-- This is the server module. It's completely controled by the client module
-- by the use of a control connection.
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
-- Read command definitions
-----------------------------------------------------------------------------
HOST = HOST or "*"
assert(dofile("testcmd.lua"))
test_debug_mode()

-----------------------------------------------------------------------------
-- Start control connection
-----------------------------------------------------------------------------
server, err = bind(HOST, PORT)
if not server then
	fail(err)
	exit(1)
end
print("server: waiting for control connection...")
control = server:accept()
print("server: control connection stablished!")

-----------------------------------------------------------------------------
-- Executes a command, detecting any possible failures
-- Input
--   cmd: command to be executed
--   par: command parameters, if needed
-----------------------------------------------------------------------------
function execute_command(cmd, par)
	if cmd == CONNECT then
		print("server: waiting for data connection...")
		data = server:accept()
		data:timeout(10)
		if not data then
			fail("server: unable to start data connection!")
		else
			print("server: data connection stablished!")
		end
	elseif cmd == CLOSE then
		print("server: closing connection with client...")
		if data then 
			data:close()
			data = nil
		end
	elseif cmd == ECHO_LINE then
		str, err = data:receive()
		if err then fail("server: " .. err) end
		err = data:send(str, "\n")
		if err then fail("server: " .. err) end
	elseif cmd == ECHO_BLOCK then
		str, err = data:receive(par)
		print(format("server: received %d bytes", strlen(str)))
		if err then fail("server: " .. err) end
		print(format("server: sending %d bytes", strlen(str)))
		err = data:send(str)
		if err then fail("server: " .. err) end
	elseif cmd == RECEIVE_BLOCK then
		str, err = data:receive(par)
		print(format("server: received %d bytes", strlen(str)))
	elseif cmd == SEND_BLOCK then
		print(format("server: sending %d bytes", strlen(str)))
		err = data:send(str)
	elseif cmd == ECHO_TIMEOUT then
		str, err = data:receive(par)
		if err then fail("server: " .. err) end
		err = data:send(str)
		if err then fail("server: " .. err) end
	elseif cmd == COMMAND then
		cmd, par = get_command()
		send_command(cmd, par)
	elseif cmd == EXIT then
		print("server: exiting...")
		exit(0)
	elseif cmd == SYNC then
		print("server: synchronizing...")
		send_command(SYNC)
	elseif cmd == SLEEP then
		print("server: sleeping for " .. par .. " seconds...")
		_sleep(par)
		print("server: woke up!")
	end
end

-----------------------------------------------------------------------------
-- Loop forever, accepting and executing commands
-----------------------------------------------------------------------------
while 1 do
	cmd, par = get_command()
	if not cmd then fail("server: " .. par) end
	print_command(cmd, par)
	execute_command(cmd, par)
end