PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/greentest/test__examples.py

https://code.google.com/p/gevent/
Python | 279 lines | 210 code | 67 blank | 2 comment | 36 complexity | 57d8d5278f626b52d1627191898cf3d8 MD5 | raw file
Possible License(s): BSD-2-Clause
  1. import sys
  2. import os
  3. import glob
  4. from os.path import join, abspath, dirname, normpath, basename
  5. import unittest
  6. try:
  7. import urllib2
  8. except ImportError:
  9. from urllib import request as urllib2
  10. import time
  11. import signal
  12. import re
  13. import gevent
  14. from gevent import socket
  15. import mysubprocess as subprocess
  16. from gevent.server import DatagramServer, StreamServer
  17. # Ignore tracebacks: KeyboardInterrupt
  18. examples_directory = normpath(join(dirname(abspath(__file__)), '..', 'examples'))
  19. examples = [basename(x) for x in glob.glob(examples_directory + '/*.py')]
  20. simple_examples = []
  21. for example in examples:
  22. if 'serve_forever' not in open(join(examples_directory, example)).read():
  23. simple_examples.append(example)
  24. def make_test(path):
  25. if sys.platform == 'win32' and os.path.basename(path) in ('geventsendfile.py', 'processes.py'):
  26. print 'Ignoring', path
  27. return
  28. if ' ' in path:
  29. path = '"%s"' % path
  30. class Test(unittest.TestCase):
  31. def test(self):
  32. run_script(self.path)
  33. Test.__name__ = 'Test_' + basename(path).split('.')[0]
  34. assert Test.__name__ not in globals(), Test.__name__
  35. Test.path = path
  36. return Test
  37. def run_script(path, *args):
  38. cmd = [sys.executable, join(examples_directory, path)] + list(args)
  39. popen = subprocess.Popen(cmd)
  40. result = popen.gevent_wait()
  41. if result != 0:
  42. raise AssertionError('%r failed with code %s' % (cmd, result))
  43. class BaseTestServer(unittest.TestCase):
  44. args = []
  45. def setUp(self):
  46. self.process = subprocess.Popen([sys.executable, join(examples_directory, self.path)] + self.args, cwd=examples_directory)
  47. time.sleep(1)
  48. def tearDown(self):
  49. self.assertEqual(self.process.poll(), None)
  50. self.process.interrupt()
  51. time.sleep(0.05)
  52. class Test_httpserver(BaseTestServer):
  53. URL = 'http://localhost:8088'
  54. not_found_message = '<h1>Not Found</h1>'
  55. def read(self, path='/'):
  56. url = self.URL + path
  57. try:
  58. response = urllib2.urlopen(url)
  59. except urllib2.HTTPError:
  60. response = sys.exc_info()[1]
  61. return '%s %s' % (response.code, response.msg), response.read()
  62. def _test_hello(self):
  63. status, data = self.read('/')
  64. self.assertEqual(status, '200 OK')
  65. self.assertEqual(data, "<b>hello world</b>")
  66. def _test_not_found(self):
  67. status, data = self.read('/xxx')
  68. self.assertEqual(status, '404 Not Found')
  69. self.assertEqual(data, self.not_found_message)
  70. def test(self):
  71. # running all the test methods now so that we don't set up a server more than once
  72. for method in dir(self):
  73. if method.startswith('_test'):
  74. function = getattr(self, method)
  75. if callable(function):
  76. function()
  77. class Test_wsgiserver(Test_httpserver):
  78. path = 'wsgiserver.py'
  79. if hasattr(socket, 'ssl'):
  80. class Test_wsgiserver_ssl(Test_httpserver):
  81. path = 'wsgiserver_ssl.py'
  82. URL = 'https://localhost:8443'
  83. else:
  84. class Test_wsgiserver_ssl(unittest.TestCase):
  85. path = 'wsgiserver_ssl.py'
  86. def setUp(self):
  87. self.process = subprocess.Popen([sys.executable, join(examples_directory, self.path)],
  88. cwd=examples_directory, stderr=subprocess.PIPE)
  89. time.sleep(1)
  90. def test(self):
  91. self.assertEqual(self.process.poll(), 1)
  92. stderr = self.process.stderr.read().strip()
  93. m = re.match('Traceback \(most recent call last\):.*?ImportError: .*?ssl.*', stderr, re.DOTALL)
  94. assert m is not None, repr(stderr)
  95. def tearDown(self):
  96. if self.process.poll() is None:
  97. try:
  98. SIGINT = getattr(signal, 'SIGINT', None)
  99. if SIGINT is not None:
  100. os.kill(self.process.pid, SIGINT)
  101. time.sleep(0.1)
  102. self.assertEqual(self.process.poll(), 1)
  103. finally:
  104. if self.process.poll() is None:
  105. self.process.kill()
  106. class Test_webpy(Test_httpserver):
  107. path = 'webpy.py'
  108. not_found_message = 'not found'
  109. def _test_hello(self):
  110. status, data = self.read('/')
  111. self.assertEqual(status, '200 OK')
  112. assert "Hello, world" in data, repr(data)
  113. def _test_long(self):
  114. start = time.time()
  115. status, data = self.read('/long')
  116. delay = time.time() - start
  117. assert 10 - 0.1 < delay < 10 + 0.1, delay
  118. self.assertEqual(status, '200 OK')
  119. self.assertEqual(data, 'Hello, 10 seconds later')
  120. class Test_webproxy(Test_httpserver):
  121. path = 'webproxy.py'
  122. def test(self):
  123. status, data = self.read('/')
  124. self.assertEqual(status, '200 OK')
  125. assert "gevent example" in data, repr(data)
  126. status, data = self.read('/http://www.google.com')
  127. self.assertEqual(status, '200 OK')
  128. assert 'google' in data.lower(), repr(data)
  129. class Test_echoserver(BaseTestServer):
  130. path = 'echoserver.py'
  131. def test(self):
  132. def test_client(message):
  133. conn = socket.create_connection(('127.0.0.1', 6000)).makefile(bufsize=1)
  134. welcome = conn.readline()
  135. assert 'Welcome' in welcome, repr(welcome)
  136. conn.write(message)
  137. received = conn.read(len(message))
  138. self.assertEqual(received, message)
  139. conn._sock.settimeout(0.1)
  140. self.assertRaises(socket.timeout, conn.read, 1)
  141. client1 = gevent.spawn(test_client, 'hello\r\n')
  142. client2 = gevent.spawn(test_client, 'world\r\n')
  143. gevent.joinall([client1, client2], raise_error=True)
  144. class Test_udp_client(unittest.TestCase):
  145. path = 'udp_client.py'
  146. def test(self):
  147. log = []
  148. def handle(message, address):
  149. log.append(message)
  150. server.sendto('reply-from-server', address)
  151. server = DatagramServer('127.0.0.1:9000', handle)
  152. server.start()
  153. try:
  154. run_script(self.path, 'Test_udp_client')
  155. finally:
  156. server.close()
  157. self.assertEqual(log, ['Test_udp_client'])
  158. class Test_udp_server(BaseTestServer):
  159. path = 'udp_server.py'
  160. def test(self):
  161. address = ('localhost', 9000)
  162. sock = socket.socket(type=socket.SOCK_DGRAM)
  163. sock.connect(address)
  164. sock.send('Test_udp_server')
  165. data, address = sock.recvfrom(8192)
  166. self.assertEqual(data, 'Received 15 bytes')
  167. class Test_portforwarder(BaseTestServer):
  168. path = 'portforwarder.py'
  169. args = ['127.0.0.5:9999', '127.0.0.6:9999']
  170. def test(self):
  171. log = []
  172. def handle(socket, address):
  173. while True:
  174. data = socket.recv(1024)
  175. log.append(data)
  176. if not data:
  177. break
  178. server = StreamServer('127.0.0.6:9999', handle)
  179. server.start()
  180. try:
  181. conn = socket.create_connection(('127.0.0.5', 9999))
  182. conn.sendall('msg1')
  183. gevent.sleep(0.01)
  184. self.assertEqual(log, ['msg1'])
  185. conn.sendall('msg2')
  186. conn.close()
  187. finally:
  188. server.close()
  189. gevent.sleep(0.01)
  190. tests = set()
  191. for klass in globals().keys():
  192. if klass.startswith('Test'):
  193. path = getattr(globals()[klass], 'path', None)
  194. if path is not None:
  195. tests.add(path)
  196. for example in simple_examples:
  197. if example in tests:
  198. continue
  199. test = make_test(example)
  200. if test is not None:
  201. globals()[test.__name__] = test
  202. print ('Added %s' % test.__name__)
  203. del test
  204. class TestAllTested(unittest.TestCase):
  205. def test(self):
  206. untested = set(examples) - set(simple_examples)
  207. untested = set(basename(path) for path in untested) - tests
  208. if untested:
  209. raise AssertionError('The following examples have not been tested: %s\n - %s' % (len(untested), '\n - '.join(untested)))
  210. del Test_httpserver
  211. if __name__ == '__main__':
  212. unittest.main()