PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/_multiprocessing/test/test_connection.py

https://bitbucket.org/pypy/pypy/
Python | 199 lines | 157 code | 32 blank | 10 comment | 21 complexity | 452d7ecb9f72b48bd6d8bc41d5547978 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import py
  2. import sys
  3. from pypy.interpreter.gateway import interp2app, W_Root
  4. class TestImport:
  5. def test_simple(self):
  6. from pypy.module._multiprocessing import interp_connection
  7. from pypy.module._multiprocessing import interp_semaphore
  8. class AppTestBufferTooShort:
  9. spaceconfig = {'usemodules': ['_multiprocessing', 'thread', 'signal',
  10. 'itertools', 'select', 'struct', 'binascii']}
  11. if sys.platform == 'win32':
  12. spaceconfig['usemodules'].append('_rawffi')
  13. else:
  14. spaceconfig['usemodules'].append('fcntl')
  15. def setup_class(cls):
  16. if cls.runappdirect:
  17. def raiseBufferTooShort(self, data):
  18. import multiprocessing
  19. raise multiprocessing.BufferTooShort(data)
  20. cls.w_raiseBufferTooShort = raiseBufferTooShort
  21. else:
  22. from pypy.module._multiprocessing import interp_connection
  23. def raiseBufferTooShort(space, w_data):
  24. raise interp_connection.BufferTooShort(space, w_data)
  25. cls.w_raiseBufferTooShort = cls.space.wrap(
  26. interp2app(raiseBufferTooShort))
  27. def test_exception(self):
  28. import multiprocessing
  29. try:
  30. self.raiseBufferTooShort("data")
  31. except multiprocessing.BufferTooShort as e:
  32. assert isinstance(e, multiprocessing.ProcessError)
  33. assert e.args == ("data",)
  34. class BaseConnectionTest(object):
  35. def test_connection(self):
  36. rhandle, whandle = self.make_pair()
  37. whandle.send_bytes("abc")
  38. assert rhandle.recv_bytes(100) == "abc"
  39. obj = [1, 2.0, "hello"]
  40. whandle.send(obj)
  41. obj2 = rhandle.recv()
  42. assert obj == obj2
  43. def test_poll(self):
  44. rhandle, whandle = self.make_pair()
  45. assert rhandle.poll() == False
  46. assert rhandle.poll(1) == False
  47. whandle.send(1)
  48. import time; time.sleep(0.1) # give it time to arrive :-)
  49. assert rhandle.poll() == True
  50. assert rhandle.poll(None) == True
  51. assert rhandle.recv() == 1
  52. assert rhandle.poll() == False
  53. raises(IOError, whandle.poll)
  54. def test_read_into(self):
  55. import array, multiprocessing
  56. rhandle, whandle = self.make_pair()
  57. obj = [1, 2.0, "hello"]
  58. whandle.send(obj)
  59. buffer = array.array('b', [0]*10)
  60. raises(multiprocessing.BufferTooShort, rhandle.recv_bytes_into, buffer)
  61. assert rhandle.readable
  62. class AppTestWinpipeConnection(BaseConnectionTest):
  63. spaceconfig = {
  64. "usemodules": [
  65. '_multiprocessing', 'thread', 'signal', 'struct', 'array',
  66. 'itertools', '_socket', 'binascii',
  67. ]
  68. }
  69. if sys.platform == 'win32':
  70. spaceconfig['usemodules'].append('_rawffi')
  71. def setup_class(cls):
  72. if sys.platform != "win32":
  73. py.test.skip("win32 only")
  74. if not cls.runappdirect:
  75. space = cls.space
  76. # stubs for some modules,
  77. # just for multiprocessing to import correctly on Windows
  78. w_modules = space.sys.get('modules')
  79. space.setitem(w_modules, space.wrap('msvcrt'), space.sys)
  80. else:
  81. import _multiprocessing
  82. def w_make_pair(self):
  83. import multiprocessing
  84. return multiprocessing.Pipe(duplex=False)
  85. class AppTestSocketConnection(BaseConnectionTest):
  86. spaceconfig = {
  87. "usemodules": [
  88. '_multiprocessing', 'thread', 'signal', 'struct', 'array',
  89. 'itertools', '_socket', 'binascii', 'select' ]
  90. }
  91. if sys.platform == 'win32':
  92. spaceconfig['usemodules'].append('_rawffi')
  93. else:
  94. spaceconfig['usemodules'].append('fcntl')
  95. def setup_class(cls):
  96. cls.w_connections = cls.space.newlist([])
  97. def w_socketpair(self):
  98. "A socket.socketpair() that works on Windows"
  99. import errno
  100. import socket
  101. serverSocket = socket.socket()
  102. serverSocket.bind(('127.0.0.1', 0))
  103. serverSocket.listen(1)
  104. client = socket.socket()
  105. client.setblocking(False)
  106. try:
  107. client.connect(('127.0.0.1', serverSocket.getsockname()[1]))
  108. except socket.error as e:
  109. assert e.args[0] in (errno.EINPROGRESS, errno.EWOULDBLOCK)
  110. server, addr = serverSocket.accept()
  111. # keep sockets alive during the test
  112. self.connections.append(server)
  113. self.connections.append(client)
  114. return server.fileno(), client.fileno()
  115. def w_make_pair(self):
  116. import _multiprocessing
  117. fd1, fd2 = self.socketpair()
  118. rhandle = _multiprocessing.Connection(fd1, writable=False)
  119. whandle = _multiprocessing.Connection(fd2, readable=False)
  120. self.connections.append(rhandle)
  121. self.connections.append(whandle)
  122. return rhandle, whandle
  123. def teardown_method(self, func):
  124. # Work hard to close all sockets and connections now!
  125. # since the fd is probably already closed, another unrelated
  126. # part of the program will probably reuse it;
  127. # And any object forgotten here will close it on destruction...
  128. try:
  129. w_connections = self.w_connections
  130. except AttributeError:
  131. return
  132. space = self.space
  133. for c in space.unpackiterable(w_connections):
  134. if isinstance(c, W_Root):
  135. space.call_method(c, "close")
  136. else:
  137. c.close()
  138. space.delslice(w_connections, space.wrap(0), space.wrap(100))
  139. def test_bad_fd(self):
  140. import _multiprocessing
  141. raises(IOError, _multiprocessing.Connection, -1)
  142. raises(IOError, _multiprocessing.Connection, -15)
  143. def test_byte_order(self):
  144. import socket
  145. if not 'fromfd' in dir(socket):
  146. skip('No fromfd in socket')
  147. # The exact format of net strings (length in network byte
  148. # order) is important for interoperation with others
  149. # implementations.
  150. rhandle, whandle = self.make_pair()
  151. whandle.send_bytes("abc")
  152. whandle.send_bytes("defg")
  153. sock = socket.fromfd(rhandle.fileno(),
  154. socket.AF_INET, socket.SOCK_STREAM)
  155. data1 = sock.recv(7)
  156. assert data1 == '\x00\x00\x00\x03abc'
  157. data2 = sock.recv(8)
  158. assert data2 == '\x00\x00\x00\x04defg'
  159. def test_repr(self):
  160. import _multiprocessing, os
  161. fd = os.dup(1) # closed by Connection.__del__
  162. c = _multiprocessing.Connection(fd)
  163. assert repr(c) == '<read-write Connection, handle %d>' % fd
  164. if hasattr(_multiprocessing, 'PipeConnection'):
  165. fd = os.dup(1) # closed by PipeConnection.__del__
  166. c = _multiprocessing.PipeConnection(fd)
  167. assert repr(c) == '<read-write PipeConnection, handle %d>' % fd