test_streaming.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # -*- coding: utf-8 -*-
  2. from unittest import TestCase
  3. import httplib
  4. import poster
  5. import urllib2, urllib
  6. import threading, time, signal
  7. import sys
  8. import os
  9. import subprocess
  10. import tempfile
  11. port = 5123
  12. class TestStreaming(TestCase):
  13. disable_https = True
  14. def setUp(self):
  15. self.opener = poster.streaminghttp.register_openers()
  16. if self.disable_https:
  17. # Disable HTTPS support for these tests to excercise the non-https code
  18. # HTTPS is tested in test_streaming_https.py
  19. if hasattr(httplib, "HTTPS"):
  20. self.https = getattr(httplib, "HTTPS")
  21. delattr(httplib, "HTTPS")
  22. reload(poster.streaminghttp)
  23. else:
  24. self.https = None
  25. else:
  26. self.https = None
  27. # Hard code to python2.6 for now, since python2.7 can't run the test server reliably
  28. cmd = ["python2.6", os.path.join(os.path.dirname(__file__), 'test_server.py'), str(port)]
  29. if not self.disable_https:
  30. cmd.append("ssl")
  31. null = open(os.devnull, "w")
  32. self.server_output = tempfile.TemporaryFile()
  33. self.server_proc = None
  34. try:
  35. self.server_proc = subprocess.Popen(cmd, stdout=self.server_output, stderr=self.server_output, close_fds=True)
  36. for i in range(20):
  37. try:
  38. if self.disable_https:
  39. urllib2.urlopen("http://localhost:%i/" % port).read()
  40. else:
  41. urllib2.urlopen("https://localhost:%i/" % port).read()
  42. time.sleep(0.1)
  43. break
  44. except:
  45. #import traceback
  46. #traceback.print_exc()
  47. time.sleep(0.1)
  48. else:
  49. self.server_output.seek(0)
  50. print self.server_output.read()
  51. raise OSError("Error starting server")
  52. except:
  53. if self.server_proc:
  54. os.kill(self.server_proc.pid, signal.SIGINT)
  55. self.server_proc.wait()
  56. raise
  57. def tearDown(self):
  58. if self.https:
  59. setattr(httplib, "HTTPS", self.https)
  60. os.kill(self.server_proc.pid, signal.SIGINT)
  61. self.server_proc.wait()
  62. self.server_output.seek(0)
  63. print self.server_output.read()
  64. def _open(self, url, params=None, headers=None):
  65. try:
  66. if headers is None:
  67. headers = {}
  68. req = urllib2.Request("http://localhost:%i/%s" % (port, url), params,
  69. headers)
  70. return urllib2.urlopen(req).read()
  71. except:
  72. self._opened = False
  73. raise
  74. def test_basic(self):
  75. response = self._open("testing123")
  76. self.assertEqual(response, "Path: /testing123")
  77. def test_basic2(self):
  78. response = self._open("testing?foo=bar")
  79. self.assertEqual(response, "Path: /testing\nfoo: bar")
  80. def test_nonstream_uploadfile(self):
  81. datagen, headers = poster.encode.multipart_encode([
  82. poster.encode.MultipartParam.from_file("file", __file__),
  83. poster.encode.MultipartParam("foo", "bar")])
  84. data = "".join(datagen)
  85. response = self._open("upload", data, headers)
  86. self.assertEqual(response, "Path: /upload\nfile: %s\nfoo: bar" % open(__file__).read())
  87. def test_stream_upload_generator(self):
  88. datagen, headers = poster.encode.multipart_encode([
  89. poster.encode.MultipartParam.from_file("file", __file__),
  90. poster.encode.MultipartParam("foo", "bar")])
  91. response = self._open("upload", datagen, headers)
  92. self.assertEqual(response, "Path: /upload\nfile: %s\nfoo: bar" % open(__file__).read())
  93. def test_stream_upload_file(self):
  94. data = open("poster/__init__.py")
  95. headers = {"Content-Length": str(os.path.getsize("poster/__init__.py"))}
  96. response = self._open("upload", data, headers)
  97. self.assertEquals(response, "Path: /upload\n%s" % open("poster/__init__.py").read().replace(" = ", " : "))
  98. def test_stream_upload_file_no_len(self):
  99. data = open(__file__)
  100. self.assertRaises(ValueError, self._open, "upload", data, {})
  101. def test_stream_upload_generator_no_len(self):
  102. def data():
  103. yield ""
  104. self.assertRaises(ValueError, self._open, "upload", data(), {})
  105. def test_redirect(self):
  106. response = self._open("redirect")
  107. self.assertEqual(response, "Path: /foo")
  108. def test_login(self):
  109. password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
  110. password_manager.add_password(
  111. None, "http://localhost:%i/needs_auth" % port, 'john', 'secret'
  112. )
  113. auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
  114. auth_handler.handler_order = 0
  115. self.opener.add_handler(auth_handler)
  116. data = open("poster/__init__.py")
  117. headers = {"Content-Length": str(os.path.getsize("poster/__init__.py"))}
  118. response = self._open("needs_auth", data, headers)
  119. self.assertEqual(response, "Path: /needs_auth\n%s" % open("poster/__init__.py").read().replace(" = ", " : "))
  120. class TestStreamingHTTPS(TestStreaming):
  121. disable_https = False
  122. def _open(self, url, params=None, headers=None):
  123. try:
  124. if headers is None:
  125. headers = {}
  126. req = urllib2.Request("https://localhost:%i/%s" % (port, url), params,
  127. headers)
  128. return urllib2.urlopen(req).read()
  129. except:
  130. self._opened = False
  131. raise