~ubuntu-branches/ubuntu/hardy/ruby1.8/hardy-updates

« back to all changes in this revision

Viewing changes to test/soap/test_streamhandler.rb

  • Committer: Bazaar Package Importer
  • Author(s): akira yamada
  • Date: 2007-03-13 22:11:58 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20070313221158-h3oql37brlaf2go2
Tags: 1.8.6-1
* new upstream version, 1.8.6.
* libruby1.8 conflicts with libopenssl-ruby1.8 (< 1.8.6) (closes: #410018)
* changed packaging style to cdbs from dbs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
require 'test/unit'
 
2
require 'soap/rpc/driver'
 
3
require 'webrick'
 
4
require 'webrick/httpproxy'
 
5
require 'logger'
 
6
 
 
7
 
 
8
module SOAP
 
9
 
 
10
 
 
11
class TestStreamHandler < Test::Unit::TestCase
 
12
  Port = 17171
 
13
  ProxyPort = 17172
 
14
 
 
15
  def setup
 
16
    @logger = Logger.new(STDERR)
 
17
    @logger.level = Logger::Severity::ERROR
 
18
    @url = "http://localhost:#{Port}/"
 
19
    @proxyurl = "http://localhost:#{ProxyPort}/"
 
20
    @server = @proxyserver = @client = nil
 
21
    @server_thread = @proxyserver_thread = nil
 
22
    setup_server
 
23
    setup_client
 
24
  end
 
25
 
 
26
  def teardown
 
27
    teardown_client
 
28
    teardown_proxyserver if @proxyserver
 
29
    teardown_server
 
30
  end
 
31
 
 
32
  def setup_server
 
33
    @server = WEBrick::HTTPServer.new(
 
34
      :BindAddress => "0.0.0.0",
 
35
      :Logger => @logger,
 
36
      :Port => Port,
 
37
      :AccessLog => [],
 
38
      :DocumentRoot => File.dirname(File.expand_path(__FILE__))
 
39
    )
 
40
    @server.mount(
 
41
      '/',
 
42
      WEBrick::HTTPServlet::ProcHandler.new(method(:do_server_proc).to_proc)
 
43
    )
 
44
    @server_thread = start_server_thread(@server)
 
45
  end
 
46
 
 
47
  def setup_proxyserver
 
48
    @proxyserver = WEBrick::HTTPProxyServer.new(
 
49
      :BindAddress => "0.0.0.0",
 
50
      :Logger => @logger,
 
51
      :Port => ProxyPort,
 
52
      :AccessLog => []
 
53
    )
 
54
    @proxyserver_thread = start_server_thread(@proxyserver)
 
55
  end
 
56
 
 
57
  def setup_client
 
58
    @client = SOAP::RPC::Driver.new(@url, '')
 
59
    @client.add_method("do_server_proc")
 
60
  end
 
61
 
 
62
  def teardown_server
 
63
    @server.shutdown
 
64
    @server_thread.kill
 
65
    @server_thread.join
 
66
  end
 
67
 
 
68
  def teardown_proxyserver
 
69
    @proxyserver.shutdown
 
70
    @proxyserver_thread.kill
 
71
    @proxyserver_thread.join
 
72
  end
 
73
 
 
74
  def teardown_client
 
75
    @client.reset_stream
 
76
  end
 
77
 
 
78
  def start_server_thread(server)
 
79
    t = Thread.new {
 
80
      Thread.current.abort_on_exception = true
 
81
      server.start
 
82
    }
 
83
    t
 
84
  end
 
85
 
 
86
  def do_server_proc(req, res)
 
87
    res['content-type'] = 'text/xml'
 
88
    res.body = <<__EOX__
 
89
<?xml version="1.0" encoding="utf-8" ?>
 
90
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
91
  <env:Body>
 
92
    <n1:do_server_proc xmlns:n1="urn:foo" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
 
93
      <return xsi:nil="true"/>
 
94
    </n1:do_server_proc>
 
95
  </env:Body>
 
96
</env:Envelope>
 
97
__EOX__
 
98
  end
 
99
 
 
100
  def parse_req_header(str)
 
101
    if ::SOAP::HTTPStreamHandler::Client.to_s == 'SOAP::NetHttpClient'
 
102
      str = eval(str.split(/\r?\n/)[4][3..-1])
 
103
    end
 
104
    parse_req_header_http_access2(str)
 
105
  end
 
106
 
 
107
  def parse_req_header_http_access2(str)
 
108
    headerp = false
 
109
    headers = {}
 
110
    req = nil
 
111
    str.split(/(?:\r?\n)/).each do |line|
 
112
      if headerp and /^$/ =~line
 
113
        headerp = false
 
114
        break
 
115
      end
 
116
      if headerp
 
117
        k, v = line.scan(/^([^:]+):\s*(.*)$/)[0]
 
118
        headers[k.downcase] = v
 
119
      end
 
120
      if /^POST/ =~ line
 
121
        req = line
 
122
        headerp = true
 
123
      end
 
124
    end
 
125
    return req, headers
 
126
  end
 
127
 
 
128
  def test_normal
 
129
    str = ""
 
130
    @client.wiredump_dev = str
 
131
    assert_nil(@client.do_server_proc)
 
132
    r, h = parse_req_header(str)
 
133
    assert_match(%r"POST / HTTP/1.", r)
 
134
    assert(/^text\/xml;/ =~ h["content-type"])
 
135
  end
 
136
 
 
137
  def test_uri
 
138
    # initialize client with URI object
 
139
    @client = SOAP::RPC::Driver.new(URI.parse(@url), '')
 
140
    @client.add_method("do_server_proc")
 
141
    # same as test_normal
 
142
    str = ""
 
143
    @client.wiredump_dev = str
 
144
    assert_nil(@client.do_server_proc)
 
145
    r, h = parse_req_header(str)
 
146
    assert_match(%r"POST / HTTP/1.", r)
 
147
    assert(/^text\/xml;/ =~ h["content-type"])
 
148
  end
 
149
 
 
150
  def test_basic_auth
 
151
    unless Object.const_defined?('HTTPAccess2')
 
152
      # soap4r + net/http + basic_auth is not supported.
 
153
      # use http-access2 instead.
 
154
      assert(true)
 
155
      return
 
156
    end
 
157
    str = ""
 
158
    @client.wiredump_dev = str
 
159
    @client.options["protocol.http.basic_auth"] << [@url, "foo", "bar"]
 
160
    assert_nil(@client.do_server_proc)
 
161
    r, h = parse_req_header(str)
 
162
    assert_equal("Basic Zm9vOmJhcg==", h["authorization"])
 
163
  end
 
164
 
 
165
  def test_proxy
 
166
    if Object.const_defined?('HTTPAccess2')
 
167
      backup = HTTPAccess2::Client::NO_PROXY_HOSTS.dup
 
168
      HTTPAccess2::Client::NO_PROXY_HOSTS.clear
 
169
    else
 
170
      backup = SOAP::NetHttpClient::NO_PROXY_HOSTS.dup
 
171
      SOAP::NetHttpClient::NO_PROXY_HOSTS.clear
 
172
    end
 
173
    setup_proxyserver
 
174
    str = ""
 
175
    @client.wiredump_dev = str
 
176
    @client.options["protocol.http.proxy"] = @proxyurl
 
177
    assert_nil(@client.do_server_proc)
 
178
    r, h = parse_req_header(str)
 
179
    assert_match(%r"POST http://localhost:17171/ HTTP/1.", r)
 
180
    # illegal proxy uri
 
181
    assert_raise(ArgumentError) do
 
182
      @client.options["protocol.http.proxy"] = 'ftp://foo:8080'
 
183
    end
 
184
  ensure
 
185
    if Object.const_defined?('HTTPAccess2')
 
186
      HTTPAccess2::Client::NO_PROXY_HOSTS.replace(backup)
 
187
    else
 
188
      SOAP::NetHttpClient::NO_PROXY_HOSTS.replace(backup)
 
189
    end
 
190
  end
 
191
 
 
192
  def test_charset
 
193
    str = ""
 
194
    @client.wiredump_dev = str
 
195
    @client.options["protocol.http.charset"] = "iso-8859-8"
 
196
    assert_nil(@client.do_server_proc)
 
197
    r, h = parse_req_header(str)
 
198
    assert_equal("text/xml; charset=iso-8859-8", h["content-type"])
 
199
    #
 
200
    str.replace("")
 
201
    @client.options["protocol.http.charset"] = "iso-8859-3"
 
202
    assert_nil(@client.do_server_proc)
 
203
    r, h = parse_req_header(str)
 
204
    assert_equal("text/xml; charset=iso-8859-3", h["content-type"])
 
205
  end
 
206
end
 
207
 
 
208
 
 
209
end