ya2 · news · projects · code · about

refactoring of functional tests
[pmachines.git] / lib / engine / network / client.py
1 from queue import Queue
2 from lib.engine.network.network import AbsNetwork, NetworkThread, msg_rpc_call
3 from lib.engine.network.binary import BinaryData
4
5
6 class ClientThread(NetworkThread):
7
8 def __init__(self, srv_addr, eng, port):
9 self.srv_addr = srv_addr
10 NetworkThread.__init__(self, eng, port)
11 self.msgs = Queue()
12 self.rpc_ret = Queue()
13
14 def _configure_socket(self):
15 self.tcp_sock.connect((self.srv_addr, self.port))
16
17 def _rpc_cb(self, data, sock):
18 self.rpc_ret.put(data)
19
20 def _queue(self, sock):
21 return self.msgs
22
23 def send_msg(self, msg, receiver=None): self.msgs.put(msg)
24
25 def do_rpc(self, funcname, *args, **kwargs):
26 args = list(args)
27 msg_size, msg_data = BinaryData.pack(
28 [msg_rpc_call, funcname, args, kwargs])
29 self.msgs.put((msg_size, msg_data))
30 return self.rpc_ret.get()
31
32
33 class Client(AbsNetwork):
34
35 def __init__(self, port, srv_addr):
36 AbsNetwork.__init__(self, port)
37 self.srv_addr = srv_addr
38 self._functions = []
39
40 def start(self, read_cb):
41 return AbsNetwork.start(self, read_cb)
42
43 def _bld_netw_thr(self):
44 srv, port = self.srv_addr.split(':')
45 return ClientThread(srv, self.eng, int(port))
46
47 def _configure_udp(self): pass
48
49 def send_udp(self, data_lst, sender):
50 host, port = self.srv_addr.split(':')
51 msg_size, msg_data = BinaryData.pack([sender] + data_lst)
52 self.udp_sock.sendto(msg_data, (host, int(port)))
53
54 def register_rpc(self, funcname): self._functions += [funcname]
55
56 def unregister_rpc(self, funcname): self._functions.remove(funcname)
57
58 def __getattr__(self, attr):
59 if attr not in self._functions: raise AttributeError(attr)
60
61 def do_rpc(*args, **kwargs):
62 return self.netw_thr.do_rpc(attr, *args, **kwargs)
63 return do_rpc