import random
import socket
import threading
import unittest

import telethon.network.authenticator as authenticator
from telethon.extensions import TcpClient
from telethon.network import Connection


def run_server_echo_thread(port):
    def server_thread():
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.bind(('', port))
            s.listen(1)
            connection, address = s.accept()
            with connection:
                data = connection.recv(16)
                connection.send(data)

    server = threading.Thread(target=server_thread)
    server.start()


class NetworkTests(unittest.TestCase):
    @staticmethod
    def test_tcp_client():
        port = random.randint(50000, 60000)  # Arbitrary non-privileged port
        run_server_echo_thread(port)

        msg = b'Unit testing...'
        client = TcpClient()
        client.connect('localhost', port)
        client.write(msg)
        assert msg == client.read(
            15), 'Read message does not equal sent message'
        client.close()

    @staticmethod
    def test_authenticator():
        transport = Connection('149.154.167.91', 443)
        authenticator.do_authentication(transport)
        transport.close()