PageRenderTime 72ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/test/rubygems/test_gem_server.rb

https://gitlab.com/lfauts/ruby
Ruby | 409 lines | 293 code | 115 blank | 1 comment | 0 complexity | 0638a97fc2d97a7ddb89101e271aceae MD5 | raw file
  1. # frozen_string_literal: true
  2. require 'rubygems/test_case'
  3. require 'rubygems/server'
  4. require 'stringio'
  5. class Gem::Server
  6. attr_reader :server
  7. end
  8. class TestGemServer < Gem::TestCase
  9. def process_based_port
  10. 0
  11. end
  12. def setup
  13. super
  14. @a1 = quick_gem 'a', '1'
  15. @a2 = quick_gem 'a', '2'
  16. @a3_p = quick_gem 'a', '3.a'
  17. @server = Gem::Server.new Gem.dir, process_based_port, false
  18. @req = WEBrick::HTTPRequest.new :Logger => nil
  19. @res = WEBrick::HTTPResponse.new :HTTPVersion => '1.0'
  20. end
  21. def test_doc_root_3
  22. orig_rdoc_version = Gem::RDoc.rdoc_version
  23. Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('3.12')
  24. assert_equal '/doc_root/X-1/rdoc/index.html', @server.doc_root('X-1')
  25. ensure
  26. Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
  27. end
  28. def test_doc_root_4
  29. orig_rdoc_version = Gem::RDoc.rdoc_version
  30. Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('4.0')
  31. assert_equal '/doc_root/X-1/', @server.doc_root('X-1')
  32. ensure
  33. Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
  34. end
  35. def test_have_rdoc_4_plus_eh
  36. orig_rdoc_version = Gem::RDoc.rdoc_version
  37. Gem::RDoc.instance_variable_set(:@rdoc_version, Gem::Version.new('4.0'))
  38. server = Gem::Server.new Gem.dir, 0, false
  39. assert server.have_rdoc_4_plus?
  40. Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('3.12')
  41. server = Gem::Server.new Gem.dir, 0, false
  42. refute server.have_rdoc_4_plus?
  43. Gem::RDoc.instance_variable_set(:@rdoc_version,
  44. Gem::Version.new('4.0.0.preview2'))
  45. server = Gem::Server.new Gem.dir, 0, false
  46. assert server.have_rdoc_4_plus?
  47. ensure
  48. Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
  49. end
  50. def test_spec_dirs
  51. s = Gem::Server.new Gem.dir, process_based_port, false
  52. assert_equal [File.join(Gem.dir, 'specifications')], s.spec_dirs
  53. s = Gem::Server.new [Gem.dir, Gem.dir], process_based_port, false
  54. assert_equal [File.join(Gem.dir, 'specifications'),
  55. File.join(Gem.dir, 'specifications')], s.spec_dirs
  56. end
  57. def test_latest_specs
  58. data = StringIO.new "GET /latest_specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
  59. @req.parse data
  60. Gem::Deprecate.skip_during do
  61. @server.latest_specs @req, @res
  62. end
  63. assert_equal 200, @res.status, @res.body
  64. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  65. assert_equal 'application/octet-stream', @res['content-type']
  66. assert_equal [['a', Gem::Version.new(2), Gem::Platform::RUBY]],
  67. Marshal.load(@res.body)
  68. end
  69. def test_latest_specs_gemdirs
  70. data = StringIO.new "GET /latest_specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
  71. dir = "#{@gemhome}2"
  72. spec = util_spec 'z', 9
  73. specs_dir = File.join dir, 'specifications'
  74. FileUtils.mkdir_p specs_dir
  75. open File.join(specs_dir, spec.spec_name), 'w' do |io|
  76. io.write spec.to_ruby
  77. end
  78. server = Gem::Server.new dir, process_based_port, false
  79. @req.parse data
  80. server.latest_specs @req, @res
  81. assert_equal 200, @res.status
  82. assert_equal [['z', v(9), Gem::Platform::RUBY]], Marshal.load(@res.body)
  83. end
  84. def test_latest_specs_gz
  85. data = StringIO.new "GET /latest_specs.#{Gem.marshal_version}.gz HTTP/1.0\r\n\r\n"
  86. @req.parse data
  87. Gem::Deprecate.skip_during do
  88. @server.latest_specs @req, @res
  89. end
  90. assert_equal 200, @res.status, @res.body
  91. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  92. assert_equal 'application/x-gzip', @res['content-type']
  93. assert_equal [['a', Gem::Version.new(2), Gem::Platform::RUBY]],
  94. Marshal.load(Gem.gunzip(@res.body))
  95. end
  96. def test_listen
  97. util_listen
  98. capture_io do
  99. @server.listen
  100. end
  101. assert_equal 1, @server.server.listeners.length
  102. end
  103. def test_listen_addresses
  104. util_listen
  105. capture_io do
  106. @server.listen %w[a b]
  107. end
  108. assert_equal 2, @server.server.listeners.length
  109. end
  110. def test_prerelease_specs
  111. data = StringIO.new "GET /prerelease_specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
  112. @req.parse data
  113. Gem::Deprecate.skip_during do
  114. @server.prerelease_specs @req, @res
  115. end
  116. assert_equal 200, @res.status, @res.body
  117. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  118. assert_equal 'application/octet-stream', @res['content-type']
  119. assert_equal [['a', v('3.a'), Gem::Platform::RUBY]],
  120. Marshal.load(@res.body)
  121. end
  122. def test_prerelease_specs_gz
  123. data = StringIO.new "GET /prerelease_specs.#{Gem.marshal_version}.gz HTTP/1.0\r\n\r\n"
  124. @req.parse data
  125. Gem::Deprecate.skip_during do
  126. @server.prerelease_specs @req, @res
  127. end
  128. assert_equal 200, @res.status, @res.body
  129. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  130. assert_equal 'application/x-gzip', @res['content-type']
  131. assert_equal [['a', v('3.a'), Gem::Platform::RUBY]],
  132. Marshal.load(Gem.gunzip(@res.body))
  133. end
  134. def test_quick_gemdirs
  135. data = StringIO.new "GET /quick/Marshal.4.8/z-9.gemspec.rz HTTP/1.0\r\n\r\n"
  136. dir = "#{@gemhome}2"
  137. server = Gem::Server.new dir, process_based_port, false
  138. @req.parse data
  139. server.quick @req, @res
  140. assert_equal 404, @res.status
  141. spec = util_spec 'z', 9
  142. specs_dir = File.join dir, 'specifications'
  143. FileUtils.mkdir_p specs_dir
  144. open File.join(specs_dir, spec.spec_name), 'w' do |io|
  145. io.write spec.to_ruby
  146. end
  147. data.rewind
  148. req = WEBrick::HTTPRequest.new :Logger => nil
  149. res = WEBrick::HTTPResponse.new :HTTPVersion => '1.0'
  150. req.parse data
  151. server.quick req, res
  152. assert_equal 200, res.status
  153. end
  154. def test_quick_missing
  155. data = StringIO.new "GET /quick/Marshal.4.8/z-9.gemspec.rz HTTP/1.0\r\n\r\n"
  156. @req.parse data
  157. @server.quick @req, @res
  158. assert_equal 404, @res.status, @res.body
  159. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  160. assert_equal 'text/plain', @res['content-type']
  161. assert_equal 'No gems found matching "z" "9" nil', @res.body
  162. assert_equal 404, @res.status
  163. end
  164. def test_quick_marshal_a_1_gemspec_rz
  165. data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-1.gemspec.rz HTTP/1.0\r\n\r\n"
  166. @req.parse data
  167. @server.quick @req, @res
  168. assert_equal 200, @res.status, @res.body
  169. assert @res['date']
  170. assert_equal 'application/x-deflate', @res['content-type']
  171. spec = Marshal.load Gem.inflate(@res.body)
  172. assert_equal 'a', spec.name
  173. assert_equal Gem::Version.new(1), spec.version
  174. end
  175. def test_quick_marshal_a_1_mswin32_gemspec_rz
  176. quick_gem 'a', '1' do |s| s.platform = Gem::Platform.local end
  177. data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-1-#{Gem::Platform.local}.gemspec.rz HTTP/1.0\r\n\r\n"
  178. @req.parse data
  179. @server.quick @req, @res
  180. assert_equal 200, @res.status, @res.body
  181. assert @res['date']
  182. assert_equal 'application/x-deflate', @res['content-type']
  183. spec = Marshal.load Gem.inflate(@res.body)
  184. assert_equal 'a', spec.name
  185. assert_equal Gem::Version.new(1), spec.version
  186. assert_equal Gem::Platform.local, spec.platform
  187. end
  188. def test_quick_marshal_a_3_a_gemspec_rz
  189. data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-3.a.gemspec.rz HTTP/1.0\r\n\r\n"
  190. @req.parse data
  191. @server.quick @req, @res
  192. assert_equal 200, @res.status, @res.body
  193. assert @res['date']
  194. assert_equal 'application/x-deflate', @res['content-type']
  195. spec = Marshal.load Gem.inflate(@res.body)
  196. assert_equal 'a', spec.name
  197. assert_equal v('3.a'), spec.version
  198. end
  199. def test_quick_marshal_a_b_3_a_gemspec_rz
  200. quick_gem 'a-b', '3.a'
  201. data = StringIO.new "GET /quick/Marshal.#{Gem.marshal_version}/a-b-3.a.gemspec.rz HTTP/1.0\r\n\r\n"
  202. @req.parse data
  203. @server.quick @req, @res
  204. assert_equal 200, @res.status, @res.body
  205. assert @res['date']
  206. assert_equal 'application/x-deflate', @res['content-type']
  207. spec = Marshal.load Gem.inflate(@res.body)
  208. assert_equal 'a-b', spec.name
  209. assert_equal v('3.a'), spec.version
  210. end
  211. def test_rdoc
  212. data = StringIO.new "GET /rdoc?q=a HTTP/1.0\r\n\r\n"
  213. @req.parse data
  214. @server.rdoc @req, @res
  215. assert_equal 200, @res.status, @res.body
  216. assert_match %r|No documentation found|, @res.body
  217. assert_equal 'text/html', @res['content-type']
  218. end
  219. def test_root
  220. data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
  221. @req.parse data
  222. @server.root @req, @res
  223. assert_equal 200, @res.status, @res.body
  224. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  225. assert_equal 'text/html', @res['content-type']
  226. end
  227. def test_root_gemdirs
  228. data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
  229. dir = "#{@gemhome}2"
  230. spec = util_spec 'z', 9
  231. specs_dir = File.join dir, 'specifications'
  232. FileUtils.mkdir_p specs_dir
  233. open File.join(specs_dir, spec.spec_name), 'w' do |io|
  234. io.write spec.to_ruby
  235. end
  236. server = Gem::Server.new dir, process_based_port, false
  237. @req.parse data
  238. server.root @req, @res
  239. assert_equal 200, @res.status
  240. assert_match 'z 9', @res.body
  241. end
  242. def test_specs
  243. data = StringIO.new "GET /specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
  244. @req.parse data
  245. @server.specs @req, @res
  246. assert_equal 200, @res.status, @res.body
  247. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  248. assert_equal 'application/octet-stream', @res['content-type']
  249. assert_equal [['a', Gem::Version.new(1), Gem::Platform::RUBY],
  250. ['a', Gem::Version.new(2), Gem::Platform::RUBY],
  251. ['a', v('3.a'), Gem::Platform::RUBY]],
  252. Marshal.load(@res.body)
  253. end
  254. def test_specs_gemdirs
  255. data = StringIO.new "GET /specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
  256. dir = "#{@gemhome}2"
  257. spec = util_spec 'z', 9
  258. specs_dir = File.join dir, 'specifications'
  259. FileUtils.mkdir_p specs_dir
  260. open File.join(specs_dir, spec.spec_name), 'w' do |io|
  261. io.write spec.to_ruby
  262. end
  263. server = Gem::Server.new dir, process_based_port, false
  264. @req.parse data
  265. server.specs @req, @res
  266. assert_equal 200, @res.status
  267. assert_equal [['z', v(9), Gem::Platform::RUBY]], Marshal.load(@res.body)
  268. end
  269. def test_specs_gz
  270. data = StringIO.new "GET /specs.#{Gem.marshal_version}.gz HTTP/1.0\r\n\r\n"
  271. @req.parse data
  272. @server.specs @req, @res
  273. assert_equal 200, @res.status, @res.body
  274. assert_match %r| \d\d:\d\d:\d\d |, @res['date']
  275. assert_equal 'application/x-gzip', @res['content-type']
  276. assert_equal [['a', Gem::Version.new(1), Gem::Platform::RUBY],
  277. ['a', Gem::Version.new(2), Gem::Platform::RUBY],
  278. ['a', v('3.a'), Gem::Platform::RUBY]],
  279. Marshal.load(Gem.gunzip(@res.body))
  280. end
  281. def util_listen
  282. webrick = Object.new
  283. webrick.instance_variable_set :@listeners, []
  284. def webrick.listeners() @listeners end
  285. def webrick.listen(host, port)
  286. socket = Object.new
  287. socket.instance_variable_set :@host, host
  288. socket.instance_variable_set :@port, port
  289. def socket.addr() [nil, @port, @host] end
  290. @listeners << socket
  291. end
  292. @server.instance_variable_set :@server, webrick
  293. end
  294. end