import unittest import asyncio import aiosocks import aiohttp from unittest import mock from aiohttp.client_reqrep import ClientRequest from aiosocks.connector import SocksConnector from .helpers import fake_coroutine class TestSocksConnector(unittest.TestCase): def setUp(self): self.loop = asyncio.new_event_loop() asyncio.set_event_loop(None) def tearDown(self): self.loop.close() def test_properties(self): addr = aiosocks.Socks4Addr('localhost') auth = aiosocks.Socks4Auth('login') conn = SocksConnector(addr, auth, loop=self.loop) self.assertIs(conn.proxy, addr) self.assertIs(conn.proxy_auth, auth) @mock.patch('aiosocks.connector.create_connection') def test_connect_proxy_ip(self, cr_conn_mock): tr, proto = mock.Mock(name='transport'), mock.Mock(name='protocol') cr_conn_mock.side_effect = \ fake_coroutine((tr, proto)).side_effect loop_mock = mock.Mock() req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('127.0.0.1'), None, loop=loop_mock) loop_mock.getaddrinfo = fake_coroutine([mock.MagicMock()]) conn = self.loop.run_until_complete(connector.connect(req)) self.assertTrue(loop_mock.getaddrinfo.is_called) self.assertIs(conn._transport, tr) conn.close() @mock.patch('aiosocks.connector.create_connection') def test_connect_proxy_domain(self, cr_conn_mock): tr, proto = mock.Mock(name='transport'), mock.Mock(name='protocol') cr_conn_mock.side_effect = \ fake_coroutine((tr, proto)).side_effect loop_mock = mock.Mock() req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('proxy.example'), None, loop=loop_mock) connector._resolve_host = fake_coroutine([mock.MagicMock()]) conn = self.loop.run_until_complete(connector.connect(req)) self.assertTrue(connector._resolve_host.is_called) self.assertEqual(connector._resolve_host.call_count, 1) self.assertIs(conn._transport, tr) conn.close() @mock.patch('aiosocks.connector.create_connection') def test_connect_remote_resolve(self, cr_conn_mock): tr, proto = mock.Mock(name='transport'), mock.Mock(name='protocol') cr_conn_mock.side_effect = \ fake_coroutine((tr, proto)).side_effect req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('127.0.0.1'), None, loop=self.loop, remote_resolve=True) connector._resolve_host = fake_coroutine([mock.MagicMock()]) conn = self.loop.run_until_complete(connector.connect(req)) self.assertEqual(connector._resolve_host.call_count, 0) conn.close() @mock.patch('aiosocks.connector.create_connection') def test_connect_locale_resolve(self, cr_conn_mock): tr, proto = mock.Mock(name='transport'), mock.Mock(name='protocol') cr_conn_mock.side_effect = \ fake_coroutine((tr, proto)).side_effect req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('proxy.example'), None, loop=self.loop, remote_resolve=False) connector._resolve_host = fake_coroutine([mock.MagicMock()]) conn = self.loop.run_until_complete(connector.connect(req)) self.assertTrue(connector._resolve_host.is_called) self.assertEqual(connector._resolve_host.call_count, 2) conn.close() @mock.patch('aiosocks.connector.create_connection') def test_proxy_connect_fail(self, cr_conn_mock): loop_mock = mock.Mock() cr_conn_mock.side_effect = \ fake_coroutine(aiosocks.SocksConnectionError()).side_effect req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('127.0.0.1'), None, loop=loop_mock) loop_mock.getaddrinfo = fake_coroutine([mock.MagicMock()]) with self.assertRaises(aiohttp.ProxyConnectionError): self.loop.run_until_complete(connector.connect(req)) @mock.patch('aiosocks.connector.create_connection') def test_proxy_negotiate_fail(self, cr_conn_mock): loop_mock = mock.Mock() cr_conn_mock.side_effect = \ fake_coroutine(aiosocks.SocksError()).side_effect req = ClientRequest('GET', 'http://python.org', loop=self.loop) connector = SocksConnector(aiosocks.Socks5Addr('127.0.0.1'), None, loop=loop_mock) loop_mock.getaddrinfo = fake_coroutine([mock.MagicMock()]) with self.assertRaises(aiosocks.SocksError): self.loop.run_until_complete(connector.connect(req))