summaryrefslogtreecommitdiff
path: root/test.py
blob: 25c20c8afcadf2f3f2befd66b34339ea23218cfd (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/usr/bin/env python3

import sys, socket, inspect

opensockets=[]

encoding="latin-1"

def connect():
	sock=socket.socket()
	sock.connect(("localhost",1423))
	opensockets.append(sock)
	return sock

def close(sock):
	sock.close()
	opensockets.remove(sock)

def sendraw(sock,text):
	sock.sendall(text.encode(encoding))

def sendline(sock,line):
	sendraw(sock,line+"\n")

def recvraw(sock,length):
	text=""
	while len(text)<length:
		text+=sock.recv(length-len(text)).decode(encoding)
	return text

def recvline(sock):
	line=""
	while True:
		c=sock.recv(1).decode(encoding)
		if c=="\n":
			break
		line+=c
	return line

def recvint(sock):
	line=recvline(sock)
	spl=line.split(" ")
	assert len(spl)==3 and spl[0]=="int"
	return int(spl[2])

def sendlineok(sock,line):
	sendline(sock,line)
	cmd=line.split(" ")[0]
	expect(sock,"ok "+cmd)

def sendlineerror(sock,line,msg):
	sendline(sock,line)
	cmd=line.split(" ")[0]
	expect(sock,"error "+cmd+" "+msg)

def sendlinelist(sock,line,lst):
	sendline(sock,line)
	cmd=line.split(" ")[0]
	expect(sock,"list "+cmd+" "+str(len(lst))+("" if len(lst)==0 else " "+" ".join(lst)))

def expectraw(sock,text):
	got=recvraw(sock,len(text))
	if got!=text:
		print("\nEXPECTRAW error: expected '"+text+"', got '"+got+"'")
		sys.exit(1)

def expect(sock,line):
	got=recvline(sock)
	if got!=line:
		print("\nEXPECT error: expected '"+line+"', got '"+got+"'")
		sys.exit(1)


testfunctions=[]

def testfunction(tag):
	def dec(func):
		def newfunc():
			global opensockets
			socks=[]
			for i in range(len(inspect.signature(func).parameters)):
				socks.append(connect())
			func(*socks)
			for sock in opensockets: sock.close()
			opensockets=[]
		testfunctions.append((tag,newfunc))
	return dec

def runtests():
	for (tag,f) in testfunctions:
		print("- "+tag+": ",end="")
		sys.stdout.flush()
		f()
		print("\x1B[32mOK\x1B[0m")
	print("\x1B[32m>> All OK!\x1B[0m")



@testfunction("Pingpong")
def testping(s):
	sendline(s,"ping")
	expect(s,"pong")

@testfunction("Create room, list, query")
def testroom(s,t):
	sendlinelist(s,"room_query",[])
	sendlinelist(t,"room_query",[])
	sendlinelist(s,"room_list game",[])
	sendlinelist(t,"room_list game",[])
	sendlineok(s,"room_create game room 1 2")
	sendlinelist(s,"room_query",["room"])
	sendlinelist(t,"room_query",[])
	sendlinelist(s,"room_list game",["room"])
	sendlinelist(t,"room_list game",["room"])

@testfunction("Create private room, list, query")
def testprivateroom(s,t):
	sendlineok(s,"room_create game room 0 2")
	sendlinelist(s,"room_query",["room"])
	sendlinelist(t,"room_query",[])
	sendlinelist(s,"room_list game",[])
	sendlinelist(t,"room_list game",[])

@testfunction("Join room")
def testjoin(s,t):
	sendlineok(s,"room_create game room 1 2")
	sendline(s,"id"); sid=recvint(s)
	sendline(t,"id"); tid=recvint(t)
	sendlineok(t,"room_join game room")
	expect(s,"room_join game room "+str(tid))
	sendlinelist(t,"room_query",["room"])

	sendlineok(t,"room_create game room2 1 1")
	sendlinelist(t,"room_query",["room","room2"])
	sendlineerror(s,"room_join game room2","Room full")

	sendlineok(s,"room_leave game room")
	expect(t,"room_leave game room "+str(sid))

@testfunction("Player list, messaging")
def testid(s,t):
	sendline(s,"id"); sid=recvint(s)
	sendline(t,"id"); tid=recvint(t)
	sendlineok(s,"room_create game room 0 2")
	sendlineok(t,"room_join game room")
	expect(s,"room_join game room "+str(tid))
	sendlinelist(s,"room_player_list game room",[str(sid),str(tid)])
	sendlinelist(t,"room_player_list game room",[str(sid),str(tid)])

	sendline(s,"room_message game room "+str(tid)+" 4")
	sendraw(s,"kaas")
	expect(s,"ok room_message")
	expect(t,"room_message "+str(sid)+" 4")
	expectraw(t,"kaas")

	sendline(t,"room_message game room "+str(sid)+" 256")
	sendraw(t,"".join(chr(i) for i in range(256)))
	expect(t,"ok room_message")
	expect(s,"room_message "+str(tid)+" 256")
	expectraw(s,"".join(chr(i) for i in range(256)))



if __name__=="__main__":
	runtests()