An attempt at adding UDP support to aiosocks. Untested due to lack of server support.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

133 lines
4.6 KiB

  1. import unittest
  2. import aiosocks
  3. import asyncio
  4. from unittest import mock
  5. try:
  6. from asyncio import ensure_future
  7. except ImportError:
  8. ensure_future = asyncio.async
  9. class TestCreateConnection(unittest.TestCase):
  10. def setUp(self):
  11. self.loop = asyncio.new_event_loop()
  12. asyncio.set_event_loop(None)
  13. def tearDown(self):
  14. self.loop.close()
  15. def _fake_coroutine(self, return_value):
  16. def coro(*args, **kwargs):
  17. if isinstance(return_value, Exception):
  18. raise return_value
  19. return return_value
  20. return mock.Mock(side_effect=asyncio.coroutine(coro))
  21. def test_init(self):
  22. addr = aiosocks.Socks5Addr('localhost')
  23. auth = aiosocks.Socks5Auth('usr', 'pwd')
  24. dst = ('python.org', 80)
  25. # proxy argument
  26. with self.assertRaises(AssertionError) as ct:
  27. conn = aiosocks.create_connection(None, None, auth, dst)
  28. self.loop.run_until_complete(conn)
  29. self.assertEqual(str(ct.exception),
  30. 'proxy must be Socks4Addr() or Socks5Addr() tuple')
  31. with self.assertRaises(AssertionError) as ct:
  32. conn = aiosocks.create_connection(None, auth, auth, dst)
  33. self.loop.run_until_complete(conn)
  34. self.assertEqual(str(ct.exception),
  35. 'proxy must be Socks4Addr() or Socks5Addr() tuple')
  36. # proxy_auth
  37. with self.assertRaises(AssertionError) as ct:
  38. conn = aiosocks.create_connection(None, addr, addr, dst)
  39. self.loop.run_until_complete(conn)
  40. self.assertIn('proxy_auth must be None or Socks4Auth()',
  41. str(ct.exception))
  42. # dst
  43. with self.assertRaises(AssertionError) as ct:
  44. conn = aiosocks.create_connection(None, addr, auth, None)
  45. self.loop.run_until_complete(conn)
  46. self.assertIn('invalid dst format, tuple("dst_host", dst_port))',
  47. str(ct.exception))
  48. # addr and auth compatibility
  49. with self.assertRaises(ValueError) as ct:
  50. conn = aiosocks.create_connection(
  51. None, addr, aiosocks.Socks4Auth(''), dst
  52. )
  53. self.loop.run_until_complete(conn)
  54. self.assertIn('proxy is Socks5Addr but proxy_auth is not Socks5Auth',
  55. str(ct.exception))
  56. with self.assertRaises(ValueError) as ct:
  57. conn = aiosocks.create_connection(
  58. None, aiosocks.Socks4Addr(''), auth, dst
  59. )
  60. self.loop.run_until_complete(conn)
  61. self.assertIn('proxy is Socks4Addr but proxy_auth is not Socks4Auth',
  62. str(ct.exception))
  63. def test_connection_fail(self):
  64. addr = aiosocks.Socks5Addr('localhost')
  65. auth = aiosocks.Socks5Auth('usr', 'pwd')
  66. dst = ('python.org', 80)
  67. loop_mock = mock.Mock()
  68. loop_mock.create_connection = self._fake_coroutine(OSError())
  69. with self.assertRaises(aiosocks.SocksConnectionError):
  70. conn = aiosocks.create_connection(
  71. None, addr, auth, dst, loop=loop_mock
  72. )
  73. self.loop.run_until_complete(conn)
  74. def test_negotiate_fail(self):
  75. addr = aiosocks.Socks5Addr('localhost')
  76. auth = aiosocks.Socks5Auth('usr', 'pwd')
  77. dst = ('python.org', 80)
  78. transp, proto = mock.Mock(), mock.Mock()
  79. proto.negotiate_done = self._fake_coroutine(aiosocks.SocksError())
  80. loop_mock = mock.Mock()
  81. loop_mock.create_connection = self._fake_coroutine((transp, proto))
  82. with self.assertRaises(aiosocks.SocksError) as ct:
  83. conn = aiosocks.create_connection(
  84. None, addr, auth, dst, loop=loop_mock
  85. )
  86. self.loop.run_until_complete(conn)
  87. self.assertIn('Can not connect to python.org:80',
  88. str(ct.exception))
  89. def test_create_protocol(self):
  90. addr = aiosocks.Socks5Addr('localhost')
  91. auth = aiosocks.Socks5Auth('usr', 'pwd')
  92. dst = ('python.org', 80)
  93. transp, proto = mock.Mock(), mock.Mock()
  94. proto.negotiate_done = self._fake_coroutine(True)
  95. loop_mock = mock.Mock()
  96. loop_mock.create_connection = self._fake_coroutine((transp, proto))
  97. user_proto = mock.Mock()
  98. conn = aiosocks.create_connection(
  99. lambda: user_proto, addr, auth, dst, loop=loop_mock
  100. )
  101. fut = ensure_future(conn, loop=self.loop)
  102. self.loop.run_until_complete(fut)
  103. transport, protocol = fut.result()
  104. self.assertIs(transport, transp)
  105. self.assertIs(protocol, user_proto)
  106. self.assertIs(transport._protocol, user_proto)