Пример #1
0
class TestLocal(unittest.TestCase):
    def setUp(self):
        self.listenAddr = ("127.0.0.1", 11111)
        self.remoteAddr = ("127.0.0.1", 22222)
        self.remoteServer = socket.socket()
        self.remoteServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.remoteServer.bind(self.remoteAddr)
        self.remoteServer.listen(socket.SOMAXCONN)
        self.remoteServer.setblocking(False)
        pwd = randomPwd()
        self.cipher = Cipher.NewCipher(pwd)
        self.loop = asyncio.new_event_loop()
        self.local = Local(
            loop=self.loop,
            pwd=pwd,
            listenAddr=self.listenAddr,
            remoteAddr=self.remoteAddr,
        )
        self.msg = bytearray(b"hello world")
        self.encrypted_msg = self.msg.copy()
        self.cipher.encode(self.encrypted_msg)

    def tearDown(self):
        self.remoteServer.close()
        self.loop.close()

    def test_dialRemote(self):
        async def test():
            with await self.local.dialRemote() as connection:
                await self.loop.sock_sendall(connection, self.msg)
                remoteConn, _ = await self.loop.sock_accept(self.remoteServer)
                received_msg = await self.loop.sock_recv(remoteConn, 1024)
                remoteConn.close()
                self.assertEqual(received_msg, self.msg)

        self.loop.run_until_complete(test())

        with self.assertRaises(ConnectionError):
            self.local.remoteAddr = ("127.0.0.1", 0)
            self.loop.run_until_complete(self.local.dialRemote())

    def test_run(self):
        def didListen(address):
            self.assertEqual(address[0], self.listenAddr[0])
            self.assertEqual(address[1], self.listenAddr[1])
            user_client = socket.create_connection(self.listenAddr)
            user_client.send(b"hello world")
            user_client.close()

            async def call_later():
                conn, _ = await self.loop.sock_accept(self.remoteServer)
                with conn:
                    received_msg = await self.loop.sock_recv(conn, 1024)
                await asyncio.sleep(0.001)
                self.assertEqual(received_msg, self.encrypted_msg)
                self.loop.stop()

            asyncio.ensure_future(call_later(), loop=self.loop)

        with self.assertRaises(RuntimeError):
            self.loop.run_until_complete(self.local.listen(didListen))