/test/test_reader.rb

https://github.com/vzmind/net-http · Ruby · 364 lines · 269 code · 95 blank · 0 comment · 0 complexity · ed42ff55486e74d5077ebe43e74b65a2 MD5 · raw file

  1. require "test/unit"
  2. require "utils"
  3. require "net2/http/readers"
  4. require "zlib"
  5. require "stringio"
  6. module Net2
  7. class TestBodyReader < Test::Unit::TestCase
  8. def setup
  9. @body = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
  10. @read, @write = IO.pipe
  11. @buf = ""
  12. @reader = Net2::HTTP::BodyReader.new(@read, @buf, @body.bytesize)
  13. end
  14. def teardown
  15. @read.close
  16. @write.close
  17. end
  18. def test_simple_read
  19. @write.write @body
  20. @reader.read_to_endpoint
  21. assert_equal @body, @buf
  22. end
  23. def test_read_chunks
  24. @write.write @body
  25. @reader.read_to_endpoint 50
  26. assert_equal @body.slice(0,50), @buf
  27. end
  28. def test_read_over
  29. @write.write @body
  30. @reader.read_to_endpoint 50
  31. assert_equal @body.slice(0,50), @buf
  32. @reader.read_to_endpoint @body.size
  33. assert_equal @body, @buf
  34. assert_raises EOFError do
  35. @reader.read_to_endpoint 10
  36. end
  37. end
  38. def test_blocking
  39. @write.write @body.slice(0,50)
  40. @reader.read_to_endpoint 100
  41. assert_equal @body.slice(0,50), @buf
  42. @reader.read_to_endpoint 100
  43. assert_equal @body.slice(0,50), @buf
  44. @write.write @body.slice(50..-1)
  45. @reader.read_to_endpoint
  46. assert_equal @body, @buf
  47. assert_raises EOFError do
  48. @reader.read_to_endpoint 10
  49. end
  50. end
  51. class TestBuffer
  52. def initialize(queue)
  53. @queue = queue
  54. @string = ""
  55. end
  56. def <<(str)
  57. @string << str
  58. @queue.push :continue
  59. end
  60. def to_str
  61. @string
  62. end
  63. end
  64. def test_read_entire_body
  65. read_queue = Queue.new
  66. write_queue = Queue.new
  67. Thread.new do
  68. @write.write @body.slice(0,50)
  69. read_queue.push :continue
  70. write_queue.pop
  71. @write.write @body[50..-2]
  72. write_queue.pop
  73. @write.write @body[-1..-1]
  74. end
  75. read_queue.pop
  76. buffer = TestBuffer.new(write_queue)
  77. @reader = Net2::HTTP::BodyReader.new(@read, buffer, @body.bytesize)
  78. out = @reader.read
  79. assert_equal @body, out.to_str
  80. end
  81. def test_read_nonblock
  82. buf = ""
  83. @reader = Net2::HTTP::BodyReader.new(@read, buf, @body.bytesize)
  84. @write.write @body.slice(0,50)
  85. @reader.read_nonblock(20)
  86. @reader.read_nonblock(35)
  87. assert_raises Errno::EWOULDBLOCK do
  88. @reader.read_nonblock(10)
  89. end
  90. @write.write @body[50..-2]
  91. @reader.read_nonblock(1000)
  92. assert_raises Errno::EWOULDBLOCK do
  93. @reader.read_nonblock(10)
  94. end
  95. @write.write @body[-1..-1]
  96. @reader.read_nonblock(100)
  97. assert_raises EOFError do
  98. @reader.read_nonblock(10)
  99. end
  100. assert_raises EOFError do
  101. @reader.read_nonblock(10)
  102. end
  103. assert_equal @body, buf
  104. end
  105. def test_read_nonblock_gzip
  106. inflated_body = @body
  107. io = StringIO.new
  108. gzip = Zlib::GzipWriter.new(io)
  109. gzip.write @body
  110. gzip.close
  111. @body = io.string
  112. buf = ""
  113. endpoint = Net2::HTTP::Response::StringAdapter.new(buf)
  114. endpoint = Net2::HTTP::Response::DecompressionMiddleware.new(endpoint, { "Content-Encoding" => "gzip"})
  115. @reader = Net2::HTTP::BodyReader.new(@read, endpoint, @body.bytesize)
  116. @write.write @body.slice(0,50)
  117. @reader.read_nonblock(20)
  118. @reader.read_nonblock(35)
  119. assert_raises Errno::EWOULDBLOCK do
  120. @reader.read_nonblock(10)
  121. end
  122. @write.write @body[50..-2]
  123. @reader.read_nonblock(1000)
  124. assert_raises Errno::EWOULDBLOCK do
  125. @reader.read_nonblock(10)
  126. end
  127. @write.write @body[-1..-1]
  128. @reader.read_nonblock(100)
  129. assert_raises EOFError do
  130. @reader.read_nonblock(10)
  131. end
  132. assert_raises EOFError do
  133. @reader.read_nonblock(10)
  134. end
  135. assert_equal inflated_body, buf
  136. end
  137. end
  138. class TestChunkedBodyReader < Test::Unit::TestCase
  139. def setup
  140. @body = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
  141. @read, @write = IO.pipe
  142. @buf = ""
  143. @reader = Net2::HTTP::ChunkedBodyReader.new(@read, @buf)
  144. end
  145. def teardown
  146. @read.close
  147. @write.close
  148. end
  149. def test_simple_read
  150. @write.write "#{@body.size.to_s(16)}\r\n#{@body}\r\n0\r\n"
  151. @reader.read_to_endpoint
  152. assert_equal @body, @buf
  153. end
  154. def test_read_chunks
  155. @write.write "#{@body.size.to_s(16)}\r\n#{@body}\r\n0\r\n"
  156. @reader.read_to_endpoint 50
  157. assert_equal @body.slice(0,50), @buf
  158. end
  159. def test_read_over
  160. @write.write "#{@body.size.to_s(16)}\r\n#{@body}\r\n0\r\n\r\n"
  161. @reader.read_to_endpoint 50
  162. assert_equal @body.slice(0,50), @buf
  163. @reader.read_to_endpoint @body.size
  164. assert_equal @body, @buf
  165. assert_raises EOFError do
  166. @reader.read_to_endpoint 10
  167. end
  168. end
  169. def test_blocking
  170. size = @body.size.to_s(16)
  171. body = "#{size}\r\n#{@body}\r\n0\r\n\r\n"
  172. @write.write body.slice(0,50 + size.size + 2)
  173. @reader.read_to_endpoint 100
  174. assert_equal @body.slice(0,50), @buf
  175. @reader.read_to_endpoint 100
  176. assert_equal @body.slice(0,50), @buf
  177. @write.write body.slice((50 + size.size + 2)..-1)
  178. @reader.read_to_endpoint
  179. assert_equal @body, @buf
  180. assert_raises EOFError do
  181. @reader.read_to_endpoint 10
  182. end
  183. end
  184. def test_multi_chunks
  185. @write.write 50.to_s(16)
  186. @write.write "\r\n"
  187. @write.write @body.slice(0,50)
  188. @reader.read_to_endpoint 100
  189. assert_equal @body.slice(0,50), @buf
  190. @write.write "\r\n"
  191. rest = @body[50..-1]
  192. @write.write rest.size.to_s(16)
  193. @write.write "\r\n"
  194. @write.write rest
  195. @reader.read_to_endpoint
  196. assert_equal @body, @buf
  197. @write.write "\r\n0\r\n\r\n"
  198. @reader.read_to_endpoint
  199. assert_equal @body, @buf
  200. assert_raises EOFError do
  201. @reader.read_to_endpoint
  202. end
  203. end
  204. def test_read_nonblock
  205. @write.write 50.to_s(16)
  206. @write.write "\r\n"
  207. @write.write @body.slice(0,50)
  208. @reader.read_nonblock(20)
  209. @reader.read_nonblock(35)
  210. assert_raises Errno::EWOULDBLOCK do
  211. @reader.read_nonblock 10
  212. end
  213. @write.write "\r\n"
  214. rest = @body[50..-1]
  215. @write.write rest.size.to_s(16)
  216. @write.write "\r\n"
  217. @write.write rest
  218. @reader.read_nonblock(1000)
  219. assert_raises Errno::EWOULDBLOCK do
  220. @reader.read_nonblock 10
  221. end
  222. @write.write "\r\n0\r\n\r\n"
  223. @reader.read_nonblock 10
  224. assert_raises EOFError do
  225. @reader.read_nonblock(100)
  226. end
  227. assert_equal @body, @buf
  228. assert_raises EOFError do
  229. @reader.read_nonblock(100)
  230. end
  231. end
  232. class TestBuffer
  233. def initialize(queue)
  234. @write_queue = queue
  235. @string = ""
  236. end
  237. def <<(str)
  238. @string << str
  239. @write_queue.push :continue
  240. end
  241. def to_str
  242. @string
  243. end
  244. end
  245. def test_read_entire_body
  246. write_queue = Queue.new
  247. read_queue = Queue.new
  248. Thread.new do
  249. @write.write 50.to_s(16)
  250. @write.write "\r\n"
  251. @write.write @body.slice(0,50)
  252. read_queue.push :continue
  253. write_queue.pop
  254. @write.write "\r\n"
  255. rest = @body[50..-1]
  256. @write.write rest.size.to_s(16)
  257. @write.write "\r\n"
  258. @write.write rest
  259. write_queue.pop
  260. @write.write "\r\n0\r\n\r\n"
  261. end
  262. read_queue.pop
  263. buffer = TestBuffer.new(write_queue)
  264. @reader = Net2::HTTP::ChunkedBodyReader.new(@read, buffer)
  265. out = @reader.read
  266. assert_equal @body, out.to_str
  267. end
  268. end
  269. end