1require 'test/unit'
2require 'time'
3require 'webrick'
4require_relative 'webrick_testing'
5require "xmlrpc/server"
6require 'xmlrpc/client'
7
8class TestCookie < Test::Unit::TestCase
9  include WEBrick_Testing
10
11  def create_servlet
12    s = XMLRPC::WEBrickServlet.new
13
14    def s.logged_in_users
15      @logged_in_users ||= {}
16    end
17    def s.request
18      @request
19    end
20    def s.response
21      @response
22    end
23    def s.service(request, response)
24      @request = request
25      @response = response
26      super
27    ensure
28      @request = nil
29      @response = nil
30    end
31
32    key = Time.now.to_i.to_s
33    valid_user = "valid-user"
34    s.add_handler("test.login") do |user, password|
35      ok = (user == valid_user and password == "secret")
36      if ok
37        s.logged_in_users[key] = user
38        expires = (Time.now + 60 * 60).httpdate
39        cookies = s.response.cookies
40        cookies << "key=\"#{key}\"; path=\"/RPC2\"; expires=#{expires}"
41        cookies << "user=\"#{user}\"; path=\"/RPC2\""
42      end
43      ok
44    end
45
46    s.add_handler("test.require_authenticate_echo") do |string|
47      cookies = {}
48      s.request.cookies.each do |cookie|
49        cookies[cookie.name] = cookie.value
50      end
51      if cookies == {"key" => key, "user" => valid_user}
52        string
53      else
54        raise XMLRPC::FaultException.new(29, "Authentication required")
55      end
56    end
57
58    s.set_default_handler do |name, *args|
59      raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
60            " or wrong number of parameters!")
61    end
62
63    s.add_introspection
64
65    s
66  end
67
68  def setup_http_server(port)
69    option = {:Port => port}
70
71    start_server(option) {|w| w.mount('/RPC2', create_servlet) }
72
73    @s = XMLRPC::Client.new3(:port => port)
74  end
75
76  PORT = 8070
77  def test_cookie
78    begin
79      setup_http_server(PORT)
80      do_test
81    ensure
82      stop_server
83    end
84  end
85
86  def do_test
87    assert(!@s.call("test.login", "invalid-user", "invalid-password"))
88    exception = assert_raise(XMLRPC::FaultException) do
89      @s.call("test.require_authenticate_echo", "Hello")
90    end
91    assert_equal(29, exception.faultCode)
92
93    assert(@s.call("test.login", "valid-user", "secret"))
94    assert_equal("Hello", @s.call("test.require_authenticate_echo", "Hello"))
95  end
96end
97