PageRenderTime 26ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/mri/xmlrpc/test_client.rb

http://github.com/jruby/jruby
Ruby | 318 lines | 245 code | 71 blank | 2 comment | 3 complexity | c97b1cba3a8aaecc8b7188f7f32d7a93 MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, GPL-2.0, JSON, LGPL-2.1
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'xmlrpc/client'
  4. require 'net/http'
  5. begin
  6. require 'openssl'
  7. rescue LoadError
  8. end
  9. module XMLRPC
  10. class ClientTest < Test::Unit::TestCase
  11. module Fake
  12. class HTTP
  13. attr_accessor :read_timeout, :open_timeout, :use_ssl
  14. def initialize responses = {}
  15. @started = false
  16. @responses = responses
  17. end
  18. def started?
  19. @started
  20. end
  21. def start
  22. @started = true
  23. if block_given?
  24. begin
  25. return yield(self)
  26. ensure
  27. @started = false
  28. end
  29. end
  30. self
  31. end
  32. def request_post path, request, headers
  33. @responses[path].shift
  34. end
  35. end
  36. class Client < XMLRPC::Client
  37. attr_reader :args, :http
  38. def initialize(*args)
  39. @args = args
  40. super
  41. end
  42. private
  43. def net_http host, port, proxy_host, proxy_port
  44. HTTP.new
  45. end
  46. end
  47. class Response
  48. def self.new body, fields = [], status = '200'
  49. klass = Class.new(Net::HTTPResponse::CODE_TO_OBJ[status]) {
  50. def initialize(*args)
  51. super
  52. @read = true
  53. end
  54. }
  55. resp = klass.new '1.1', status, 'OK'
  56. resp.body = body
  57. fields.each do |k,v|
  58. resp.add_field k, v
  59. end
  60. resp
  61. end
  62. end
  63. end
  64. def test_new2_host_path_port
  65. client = Fake::Client.new2 'http://example.org/foo'
  66. host, path, port, *rest = client.args
  67. assert_equal 'example.org', host
  68. assert_equal '/foo', path
  69. assert_equal 80, port
  70. rest.each { |x| refute x }
  71. end
  72. def test_new2_custom_port
  73. client = Fake::Client.new2 'http://example.org:1234/foo'
  74. host, path, port, *rest = client.args
  75. assert_equal 'example.org', host
  76. assert_equal '/foo', path
  77. assert_equal 1234, port
  78. rest.each { |x| refute x }
  79. end
  80. def test_new2_ssl
  81. client = Fake::Client.new2 'https://example.org/foo'
  82. host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
  83. assert_equal 'example.org', host
  84. assert_equal '/foo', path
  85. assert_equal 443, port
  86. assert use_ssl
  87. refute proxy_host
  88. refute proxy_port
  89. refute user
  90. refute password
  91. refute timeout
  92. end if defined?(OpenSSL)
  93. def test_new2_ssl_custom_port
  94. client = Fake::Client.new2 'https://example.org:1234/foo'
  95. host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
  96. assert_equal 'example.org', host
  97. assert_equal '/foo', path
  98. assert_equal 1234, port
  99. assert use_ssl
  100. refute proxy_host
  101. refute proxy_port
  102. refute user
  103. refute password
  104. refute timeout
  105. end if defined?(OpenSSL)
  106. def test_new2_user_password
  107. client = Fake::Client.new2 'http://aaron:tenderlove@example.org/foo'
  108. host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
  109. [ host, path, port ].each { |x| assert x }
  110. assert_equal 'aaron', user
  111. assert_equal 'tenderlove', password
  112. [ proxy_host, proxy_port, use_ssl, timeout ].each { |x| refute x }
  113. end
  114. def test_new2_proxy_host
  115. client = Fake::Client.new2 'http://example.org/foo', 'example.com'
  116. host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
  117. [ host, path, port ].each { |x| assert x }
  118. assert_equal 'example.com', proxy_host
  119. [ user, password, proxy_port, use_ssl, timeout ].each { |x| refute x }
  120. end
  121. def test_new2_proxy_port
  122. client = Fake::Client.new2 'http://example.org/foo', 'example.com:1234'
  123. host, path, port, proxy_host, proxy_port, user, password, use_ssl, timeout = client.args
  124. [ host, path, port ].each { |x| assert x }
  125. assert_equal 'example.com', proxy_host
  126. assert_equal 1234, proxy_port
  127. [ user, password, use_ssl, timeout ].each { |x| refute x }
  128. end
  129. def test_new2_no_path
  130. client = Fake::Client.new2 'http://example.org'
  131. host, path, port, *rest = client.args
  132. assert_equal 'example.org', host
  133. assert_nil path
  134. assert port
  135. rest.each { |x| refute x }
  136. end
  137. def test_new2_slash_path
  138. client = Fake::Client.new2 'http://example.org/'
  139. host, path, port, *rest = client.args
  140. assert_equal 'example.org', host
  141. assert_equal '/', path
  142. assert port
  143. rest.each { |x| refute x }
  144. end
  145. def test_new2_bad_protocol
  146. assert_raise(ArgumentError) do
  147. XMLRPC::Client.new2 'ftp://example.org'
  148. end
  149. end
  150. def test_new2_bad_uri
  151. assert_raise(ArgumentError) do
  152. XMLRPC::Client.new2 ':::::'
  153. end
  154. end
  155. def test_new2_path_with_query
  156. client = Fake::Client.new2 'http://example.org/foo?bar=baz'
  157. host, path, port, *rest = client.args
  158. assert_equal 'example.org', host
  159. assert_equal '/foo?bar=baz', path
  160. assert port
  161. rest.each { |x| refute x }
  162. end
  163. def test_request
  164. fh = read 'blog.xml'
  165. responses = {
  166. '/foo' => [ Fake::Response.new(fh, [['Content-Type', 'text/xml']]) ]
  167. }
  168. client = fake_client(responses).new2 'http://example.org/foo'
  169. resp = client.call('wp.getUsersBlogs', 'tlo', 'omg')
  170. expected = [{
  171. "isAdmin" => true,
  172. "url" => "http://tenderlovemaking.com/",
  173. "blogid" => "1",
  174. "blogName" => "Tender Lovemaking",
  175. "xmlrpc" => "http://tenderlovemaking.com/xmlrpc.php"
  176. }]
  177. assert_equal expected, resp
  178. end
  179. def test_async_request
  180. fh = read 'blog.xml'
  181. responses = {
  182. '/foo' => [ Fake::Response.new(fh, [['Content-Type', 'text/xml']]) ]
  183. }
  184. client = fake_client(responses).new2 'http://example.org/foo'
  185. resp = client.call_async('wp.getUsersBlogs', 'tlo', 'omg')
  186. expected = [{
  187. "isAdmin" => true,
  188. "url" => "http://tenderlovemaking.com/",
  189. "blogid" => "1",
  190. "blogName" => "Tender Lovemaking",
  191. "xmlrpc" => "http://tenderlovemaking.com/xmlrpc.php"
  192. }]
  193. assert_equal expected, resp
  194. end
  195. # make a request without content-type header
  196. def test_bad_content_type
  197. fh = read 'blog.xml'
  198. responses = {
  199. '/foo' => [ Fake::Response.new(fh) ]
  200. }
  201. client = fake_client(responses).new2 'http://example.org/foo'
  202. resp = client.call('wp.getUsersBlogs', 'tlo', 'omg')
  203. expected = [{
  204. "isAdmin" => true,
  205. "url" => "http://tenderlovemaking.com/",
  206. "blogid" => "1",
  207. "blogName" => "Tender Lovemaking",
  208. "xmlrpc" => "http://tenderlovemaking.com/xmlrpc.php"
  209. }]
  210. assert_equal expected, resp
  211. end
  212. def test_i8_tag
  213. fh = read('blog.xml').gsub(/string/, 'i8')
  214. responses = {
  215. '/foo' => [ Fake::Response.new(fh) ]
  216. }
  217. client = fake_client(responses).new2 'http://example.org/foo'
  218. resp = client.call('wp.getUsersBlogs', 'tlo', 'omg')
  219. assert_equal 1, resp.first['blogid']
  220. end
  221. def test_cookie_simple
  222. client = Fake::Client.new2('http://example.org/cookie')
  223. assert_nil(client.cookie)
  224. client.send(:parse_set_cookies, ["param1=value1", "param2=value2"])
  225. assert_equal("param1=value1; param2=value2", client.cookie)
  226. end
  227. def test_cookie_override
  228. client = Fake::Client.new2('http://example.org/cookie')
  229. client.send(:parse_set_cookies,
  230. [
  231. "param1=value1",
  232. "param2=value2",
  233. "param1=value3",
  234. ])
  235. assert_equal("param2=value2; param1=value3", client.cookie)
  236. end
  237. private
  238. def read filename
  239. File.read File.expand_path(File.join(__FILE__, '..', 'data', filename))
  240. end
  241. def fake_client responses
  242. Class.new(Fake::Client) {
  243. define_method(:net_http) { |*_| Fake::HTTP.new(responses) }
  244. }
  245. end
  246. end
  247. end