|
- 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
|