Exemplo n.º 1
0
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()