/tests/net/test_udp.py

https://bitbucket.org/prologic/circuits/ · Python · 102 lines · 70 code · 31 blank · 1 comment · 11 complexity · 99e7c7fcdaf9c369d86fcd03fad49823 MD5 · raw file

  1. #!/usr/bin/env python
  2. import pytest
  3. import socket
  4. import select
  5. from circuits import Manager
  6. from circuits.net.events import close, write
  7. from circuits.core.pollers import Select, Poll, EPoll, KQueue
  8. from circuits.net.sockets import UDPServer, UDPClient, UDP6Server, UDP6Client
  9. from .client import Client
  10. from .server import Server
  11. def wait_host(server):
  12. def checker(obj, attr):
  13. return all((getattr(obj, a) for a in attr))
  14. assert pytest.wait_for(server, ("host", "port"), checker)
  15. def _pytest_generate_tests(metafunc, ipv6):
  16. metafunc.addcall(funcargs={"Poller": Select, "ipv6": ipv6})
  17. if hasattr(select, "poll"):
  18. metafunc.addcall(funcargs={"Poller": Poll, "ipv6": ipv6})
  19. if hasattr(select, "epoll"):
  20. metafunc.addcall(funcargs={"Poller": EPoll, "ipv6": ipv6})
  21. if hasattr(select, "kqueue"):
  22. metafunc.addcall(funcargs={"Poller": KQueue, "ipv6": ipv6})
  23. def pytest_generate_tests(metafunc):
  24. _pytest_generate_tests(metafunc, ipv6=False)
  25. if socket.has_ipv6:
  26. _pytest_generate_tests(metafunc, ipv6=True)
  27. def test_basic(Poller, ipv6):
  28. m = Manager() + Poller()
  29. if ipv6:
  30. udp_server = UDP6Server(("::1", 0))
  31. udp_client = UDP6Client(("::1", 0), channel="client")
  32. else:
  33. udp_server = UDPServer(0)
  34. udp_client = UDPClient(0, channel="client")
  35. server = Server() + udp_server
  36. client = Client() + udp_client
  37. server.register(m)
  38. client.register(m)
  39. m.start()
  40. try:
  41. assert pytest.wait_for(server, "ready")
  42. assert pytest.wait_for(client, "ready")
  43. wait_host(server)
  44. client.fire(write((server.host, server.port), b"foo"))
  45. assert pytest.wait_for(server, "data", b"foo")
  46. client.fire(close())
  47. assert pytest.wait_for(client, "closed")
  48. server.fire(close())
  49. assert pytest.wait_for(server, "closed")
  50. finally:
  51. m.stop()
  52. def test_close(Poller, ipv6):
  53. m = Manager() + Poller()
  54. server = Server() + UDPServer(0)
  55. server.register(m)
  56. m.start()
  57. try:
  58. assert pytest.wait_for(server, "ready")
  59. wait_host(server)
  60. host, port = server.host, server.port
  61. server.fire(close())
  62. assert pytest.wait_for(server, "disconnected")
  63. server.unregister()
  64. def test(obj, attr):
  65. return attr not in obj.components
  66. assert pytest.wait_for(m, server, value=test)
  67. server = Server() + UDPServer((host, port))
  68. server.register(m)
  69. assert pytest.wait_for(server, "ready", timeout=30.0)
  70. finally:
  71. m.stop()