Example #1
0
    def test_e2e_single_session_large_message_client_close(self):
        server = rcp.RCPRouter(("127.0.0.1", 12345))
        client = rcp.RCPRouter(("127.0.0.1", 12346))

        server.listen()

        client_sock = client.connect(("127.0.0.1", 12345))
        server_sock = server.accept()

        random.seed()

        client_message = random.randbytes(
            10 * 128 * 32)  # should ensure 10 sliding windows
        client_sock.send(client_message)

        server_message = random.randbytes(
            10 * 128 * 32)  # should ensure 10 sliding windows
        server_sock.send(server_message)

        client_sock.close()

        server_received = server_sock.read()
        self.assertEqual(client_message, server_received)

        client_received = client_sock.read()
        self.assertEqual(server_message, client_received)

        server.close()
        client.close()
Example #2
0
    def test_e2e_multi_session_small_message_client_close(self):
        server = rcp.RCPRouter(("127.0.0.1", 12345))
        client_a = rcp.RCPRouter(("127.0.0.1", 12346))
        client_b = rcp.RCPRouter(("127.0.0.1", 12347))

        server.listen()

        client_a_sock = client_a.connect(("127.0.0.1", 12345))
        server_a_sock = server.accept()
        client_b_sock = client_b.connect(("127.0.0.1", 12345))
        server_b_sock = server.accept()

        client_a_sock.send(b'Hello, server from client a!')
        client_b_sock.send(b'Hello, server from client b!')

        self.assertEqual(b'Hello, server from client b!', server_b_sock.recv())
        self.assertEqual(b'Hello, server from client a!', server_a_sock.recv())

        server_a_sock.send(b'Hello, client a!')
        server_b_sock.send(b'Hello, client b!')
        self.assertEqual(b'Hello, client a!', client_a_sock.recv())
        self.assertEqual(b'Hello, client b!', client_b_sock.recv())

        client_a_sock.close()
        client_b_sock.close()

        self.assertEqual(b'', client_a_sock.recv())
        self.assertEqual(b'', server_a_sock.recv())
        self.assertEqual(b'', client_b_sock.recv())
        self.assertEqual(b'', server_b_sock.recv())

        server.close()
        client_a.close()
        client_b.close()
Example #3
0
def main():
    logging.basicConfig(level=logging.DEBUG)
    addr, port = sys.argv[1:]
    router = rcp.RCPRouter((addr, int(port)))
    logger.info(f"Starting RCP Echo Server at {addr}:{port}")
    router.listen()
    listen_and_serve(router)
Example #4
0
    def test_e2e_single_session_small_message_server_close(self):
        server = rcp.RCPRouter(("127.0.0.1", 12345))
        client = rcp.RCPRouter(("127.0.0.1", 12346))

        server.listen()

        client_sock = client.connect(("127.0.0.1", 12345))
        server_sock = server.accept()

        client_sock.send(b'Hello, server!')
        self.assertEqual(b'Hello, server!', server_sock.recv())

        server_sock.send(b'Hello, client!')
        self.assertEqual(b'Hello, client!', client_sock.recv())

        server_sock.close()
        self.assertEqual(b'', client_sock.recv())
        self.assertEqual(b'', server_sock.recv())

        server.close()
        client.close()
Example #5
0
    def test_e2e_single_session_large_message_over_faulty_socket(self):
        server = rcp.RCPRouter(("127.0.0.1", 12345))
        client = rcp.RCPRouter(("127.0.0.1", 12346))

        server.sock = FaultySocket(server.sock)
        client.sock = FaultySocket(client.sock)

        server.listen()

        client_sock = client.connect(("127.0.0.1", 12345))
        server_sock = server.accept()

        random.seed()

        client_message = random.randbytes(
            10 * 128 * 32)  # should ensure 10 sliding windows
        client_sock.send(client_message)

        server_message = random.randbytes(
            10 * 128 * 32)  # should ensure 10 sliding windows
        server_sock.send(server_message)

        client_sock.close()

        server_received = server_sock.read()
        self.assertEqual(client_message, server_received)

        client_received = client_sock.read()
        self.assertEqual(server_message, client_received)

        # because the last ack will likely be dropped, give both sides adequate time to
        # close by time out
        time.sleep(.3)
        self.assertEqual({}, client.sessions)
        self.assertEqual({}, server.sessions)

        server.close()
        client.close()
Example #6
0
def main():
    src_addr, src_port, dst_addr, dst_port, condition = sys.argv[1:]
    router = rcp.RCPRouter((src_addr, int(src_port)))
    router.sock = PacketCountingMiddleware(router.sock)
    sock = router.connect((dst_addr, int(dst_port)))

    time_start = time.time()
    random.seed()
    sent_hash = hashlib.sha256()
    sent_len = 0
    for i in range(1000):
        to_send = random.randbytes(random.randrange(200, 400))
        sent_hash.update(to_send)
        sent_len += len(to_send)
        sock.send(to_send)
        time.sleep(random.randrange(2, 20) / 1000)

    recv_hash = hashlib.sha256()
    recv_len = 0
    while recv_len != sent_len:
        msg = sock.recv()
        recv_hash.update(msg)
        recv_len += len(msg)

    total_time_s = time.time() - time_start
    sock.close()
    router.close()

    if recv_hash.hexdigest() == sent_hash.hexdigest():
        print(
            f"Sent and received {sent_len} bytes. Confirmed hashes match: {sent_hash.hexdigest()}"
        )
    else:
        raise ValueError(
            f"Hash mismatch between sent bytes and received bytes: {sent_hash.hexdigest()} != {recv_hash.hexdigest()}"
        )
    print(
        f"Toatal packets sent: {router.sock.total_sends} -- Total packets received: {router.sock.total_recvs}"
    )

    # packets received isn't meaningful here since we don't know how many packets our peer sent
    # so just log the packets sent
    _log_datum("results.json", [router.sock.total_sends, total_time_s],
               condition)