import pytest import aiosocks from aiohttp.test_utils import make_mocked_coro from unittest import mock async def test_create_connection_init(): addr = aiosocks.Socks5Addr('localhost') auth = aiosocks.Socks5Auth('usr', 'pwd') dst = ('python.org', 80) # proxy argument with pytest.raises(AssertionError) as ct: await aiosocks.create_connection(None, None, auth, dst) assert 'proxy must be Socks4Addr() or Socks5Addr() tuple' in str(ct) with pytest.raises(AssertionError) as ct: await aiosocks.create_connection(None, auth, auth, dst) assert 'proxy must be Socks4Addr() or Socks5Addr() tuple' in str(ct) # proxy_auth with pytest.raises(AssertionError) as ct: await aiosocks.create_connection(None, addr, addr, dst) assert 'proxy_auth must be None or Socks4Auth()' in str(ct) # dst with pytest.raises(AssertionError) as ct: await aiosocks.create_connection(None, addr, auth, None) assert 'invalid dst format, tuple("dst_host", dst_port))' in str(ct) # addr and auth compatibility with pytest.raises(ValueError) as ct: await aiosocks.create_connection( None, addr, aiosocks.Socks4Auth(''), dst) assert 'proxy is Socks5Addr but proxy_auth is not Socks5Auth' in str(ct) with pytest.raises(ValueError) as ct: await aiosocks.create_connection( None, aiosocks.Socks4Addr(''), auth, dst) assert 'proxy is Socks4Addr but proxy_auth is not Socks4Auth' in str(ct) # test ssl, server_hostname with pytest.raises(ValueError) as ct: await aiosocks.create_connection( None, addr, auth, dst, server_hostname='python.org') assert 'server_hostname is only meaningful with ssl' in str(ct) async def test_connection_fail(): addr = aiosocks.Socks5Addr('localhost') auth = aiosocks.Socks5Auth('usr', 'pwd') dst = ('python.org', 80) loop_mock = mock.Mock() loop_mock.create_connection = make_mocked_coro(raise_exception=OSError()) with pytest.raises(aiosocks.SocksConnectionError): await aiosocks.create_connection( None, addr, auth, dst, loop=loop_mock) async def test_negotiate_fail(): addr = aiosocks.Socks5Addr('localhost') auth = aiosocks.Socks5Auth('usr', 'pwd') dst = ('python.org', 80) loop_mock = mock.Mock() loop_mock.create_connection = make_mocked_coro((mock.Mock(), mock.Mock())) with mock.patch('aiosocks.asyncio.Future') as future_mock: future_mock.side_effect = make_mocked_coro( raise_exception=aiosocks.SocksError()) with pytest.raises(aiosocks.SocksError): await aiosocks.create_connection( None, addr, auth, dst, loop=loop_mock) async def test_open_connection(): addr = aiosocks.Socks5Addr('localhost') auth = aiosocks.Socks5Auth('usr', 'pwd') dst = ('python.org', 80) transp, proto = mock.Mock(), mock.Mock() reader, writer = mock.Mock(), mock.Mock() proto.app_protocol.reader, proto.app_protocol.writer = reader, writer loop_mock = mock.Mock() loop_mock.create_connection = make_mocked_coro((transp, proto)) with mock.patch('aiosocks.asyncio.Future') as future_mock: future_mock.side_effect = make_mocked_coro(True) r, w = await aiosocks.open_connection(addr, auth, dst, loop=loop_mock) assert reader is r assert writer is w