test_socket.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import errno
  2. import unittest
  3. from .test_sslsocket import ServerAcceptor
  4. from thrift.transport.TSocket import TServerSocket
  5. from thrift.transport.TSocket import TSocket
  6. from thrift.transport.TTransport import TTransportException
  7. class TSocketTest(unittest.TestCase):
  8. def test_isOpen_checks_for_readability(self):
  9. # https://docs.python.org/3/library/socket.html#notes-on-socket-timeouts
  10. # https://docs.python.org/3/library/socket.html#socket.socket.settimeout
  11. timeouts = [
  12. None, # blocking mode
  13. 0, # non-blocking mode
  14. 1.0, # timeout mode
  15. ]
  16. for timeout in timeouts:
  17. acc = ServerAcceptor(TServerSocket(port=0))
  18. acc.start()
  19. sock = TSocket(host="localhost", port=acc.port)
  20. self.assertFalse(sock.isOpen())
  21. sock.open()
  22. sock.setTimeout(timeout)
  23. # the socket shows as open immediately after connecting
  24. self.assertTrue(sock.isOpen())
  25. # and remains open during usage
  26. sock.write(b"hello")
  27. self.assertTrue(sock.isOpen())
  28. while True:
  29. try:
  30. sock.read(5)
  31. except TTransportException as exc:
  32. if exc.inner.errno == errno.EAGAIN:
  33. # try again when we're in non-blocking mode
  34. continue
  35. raise
  36. break
  37. self.assertTrue(sock.isOpen())
  38. # once the server side closes, it no longer shows open
  39. acc.client.close() # this also blocks until the other thread is done
  40. acc.close()
  41. self.assertFalse(sock.isOpen())
  42. sock.close()
  43. if __name__ == "__main__":
  44. unittest.main()