async def async_test_e2e(loop: asyncio.AbstractEventLoop, password: str): local = Local(loop, password, '127.0.0.1', LOCAL_PORT, '127.0.0.1', SERVER_PORT) server = Server(loop, password, '127.0.0.1', SERVER_PORT) asyncio.ensure_future(local.listen()) asyncio.ensure_future(server.listen()) asyncio.ensure_future(remote_listen(loop)) client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) await loop.sock_connect(client_sock, ('127.0.0.1', LOCAL_PORT)) # greeting client_hello = bytes((0x05, 0x01, 0x00)) await loop.sock_sendall(client_sock, client_hello) server_hello = await loop.sock_recv(client_sock, BUFFER_SIZE) assert server_hello == bytes((0x05, 0x00)) # request: connect to remote 127.0.0.1:34567 socks_request = bytes( (0x05, 0x01, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x87, 0x07)) await loop.sock_sendall(client_sock, socks_request) socks_response = await loop.sock_recv(client_sock, BUFFER_SIZE) assert socks_response == bytes( (0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) # pipe msg = b'hello world' await loop.sock_sendall(client_sock, msg) msg_reply = await loop.sock_recv(client_sock, BUFFER_SIZE) assert msg_reply == b'Reply: hello world'
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))