def test_copynetslave_disconnect_on_empty_data(): class mock(object): def __init__(self): self.value = 0 def inc(self): self.value += 1 return self.value from coopy.base import logging_config logging_config() server = tcp_server('127.0.0.1', 5466, "inet") system = mock() slave = CopyNetSlave(system, host='127.0.0.1') slave.start() import time time.sleep(0.2) cli, address = server.accept() time.sleep(0.2) cli.sendall(_str_to_bytes('1')) time.sleep(0.2) assert slave.running == False import select with pytest.raises(socket_select_error): select.select([slave.sock], [], [], 0) server.close()
def test_network_select_check_if_authorized_client(): from coopy.base import logging_config logging_config(basedir="./") system = "a string represented system state" copynet = CopyNet(system, host="127.0.0.1", port=7777) copynet.start() actor1 = tcp_actor("127.0.0.1", 7777, "inet") actor1.send(_str_to_bytes('copynet')) #guarantee that the client is already connected import time time.sleep(0.2) copynet_client1 = list(copynet.clientmap.values())[0] actor1.send(_str_to_bytes('copynet')) assert True == copynet.check_if_authorized_client(copynet_client1.client) actor1.close() actor2 = tcp_actor("127.0.0.1", 7777, "inet") actor2.send(_str_to_bytes('copynet')) time.sleep(0.2) copynet_client2 = list(copynet.clientmap.values())[0] actor2.send(_str_to_bytes('_copynet')) assert False == copynet.check_if_authorized_client(copynet_client2.client) actor2.close() copynet.close()
def test_network_select_send_direct(): received_msgs = [] from coopy.base import logging_config logging_config(basedir="./") system = "a string represented system state" copynet = CopyNet(system, host="127.0.0.1", port=7777) copynet.start() actor1 = tcp_actor("127.0.0.1", 7777, "inet") actor1.send(_str_to_bytes('copynet')) actor2 = tcp_actor("127.0.0.1", 7777, "inet") actor2.send(_str_to_bytes('copynet')) actors = [actor1, actor2] #guarantee that the client is already connected import time time.sleep(0.2) copynet_client1 = list(copynet.clientmap.values())[0] copynet.send_direct(copynet_client1.client, _str_to_bytes("message")) time.sleep(0.2) if six.PY3: import pickle else: import cPickle as pickle import struct, zlib, pickle size = struct.calcsize(COPYNET_HEADER) #one of the 2 reads will raise an error and the other will work error_count = 0 for actor in actors: try: header = actor.recv(size) (psize, stype) = struct.unpack(COPYNET_HEADER, header) data = pickle.loads(zlib.decompress(actor.recv(psize))) received_msgs.append(data) except Exception: error_count += 1 assert len(received_msgs) == 1 assert error_count == 1 copynet.close() actor1.close() actor2.close()
def test_network_select_broadcast(): received_msgs = [] from coopy.base import logging_config logging_config(basedir="./") system = "a string represented system state" copynet = CopyNet(system, host="127.0.0.1", port=7777) copynet.start() actor1 = tcp_actor("127.0.0.1", 7777, "inet") actor1.send(_str_to_bytes('copynet')) actor2 = tcp_actor("127.0.0.1", 7777, "inet") actor2.send(_str_to_bytes('copynet')) clients = [actor1, actor2] #guarantee that the client is already connected import time time.sleep(0.2) copynet.receive(b"message") if six.PY3: import pickle else: import cPickle as pickle #both clients should receive the same message for cli in clients: import struct, zlib, pickle size = struct.calcsize(COPYNET_HEADER) header = cli.recv(size) (psize, stype) = struct.unpack(COPYNET_HEADER, header) data = pickle.loads(zlib.decompress(cli.recv(psize))) received_msgs.append(data) assert stype == b's' assert data == b"message" assert len(received_msgs) == 2 assert received_msgs == [b"message", b"message"] copynet.close() actor1.close() actor2.close()
def test_network_select_receive(): from coopy.base import logging_config logging_config(basedir="./") system = "a string represented system state" copynet = CopyNet(system, host="127.0.0.1", port=7777) copynet.start() actor = tcp_actor("127.0.0.1", 7777, "inet") actor.send(b'copynet') #guarantee that the client is already connected import time time.sleep(0.2) copynet.receive(b"message") #if no error, socket is open import select select.select([], [], [actor], 0) import struct, zlib if six.PY3: import pickle else: import cPickle as pickle size = struct.calcsize(COPYNET_HEADER) header = actor.recv(size) (psize, stype) = struct.unpack(COPYNET_HEADER, header) data = pickle.loads(zlib.decompress(actor.recv(psize))) assert stype == b's' assert data == b"message" copynet.close() actor.close()
def test_network_select_disconnect_senders(): from coopy.base import logging_config logging_config(basedir="./") system = "a string represented system state" copynet = CopyNet(system, host="127.0.0.1", port=7777) copynet.start() actor = tcp_actor("127.0.0.1", 7777, "inet") actor.send(_str_to_bytes('copynet')) #guarantee that the client is already connected import time time.sleep(0.2) actor.send(_str_to_bytes('actor should be disconnected')) time.sleep(0.2) assert 0 == len(copynet.clientmap) copynet.close() actor.close()