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

« back to all changes in this revision

Viewing changes to test/soap/test_styleuse.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/httpserver'
 
3
require 'soap/rpc/driver'
 
4
 
 
5
 
 
6
module SOAP
 
7
 
 
8
 
 
9
class TestStyleUse < Test::Unit::TestCase
 
10
  # rpc driver: obj in(Hash allowed for literal), obj out
 
11
  # 
 
12
  #   style: not visible from user
 
13
  #     rpc: wrapped element
 
14
  #     document: unwrappted element
 
15
  #
 
16
  #   use:
 
17
  #     encoding: a graph (SOAP Data Model)
 
18
  #     literal: not a graph (SOAPElement)
 
19
  #
 
20
  # rpc stub: obj in, obj out(Hash is allowed for literal)
 
21
  #
 
22
  #   style: not visible from user
 
23
  #     rpc: wrapped element
 
24
  #     document: unwrappted element
 
25
  #
 
26
  #   use:
 
27
  #     encoding: a graph (SOAP Data Model)
 
28
  #     literal: not a graph (SOAPElement)
 
29
  #
 
30
  # document driver: SOAPElement in, SOAPElement out? [not implemented]
 
31
  #
 
32
  #   style: ditto
 
33
  #   use: ditto
 
34
  #
 
35
  #
 
36
  # document stub: SOAPElement in, SOAPElement out? [not implemented]
 
37
  #
 
38
  #   style: ditto
 
39
  #   use: ditto
 
40
  #
 
41
  class GenericServant
 
42
    # method name style: requeststyle_requestuse_responsestyle_responseuse
 
43
 
 
44
    # 2 params -> array
 
45
    def rpc_enc_rpc_enc(obj1, obj2)
 
46
      [obj1, [obj1, obj2]]
 
47
    end
 
48
 
 
49
    # 2 objs -> array
 
50
    def rpc_lit_rpc_enc(obj1, obj2)
 
51
      [obj2, obj1]
 
52
    end
 
53
 
 
54
    # 2 params -> 2 params
 
55
    def rpc_enc_rpc_lit(obj1, obj2)
 
56
      klass = [obj1.class.name, obj2.class.name]
 
57
      [obj2, obj1]
 
58
    end
 
59
 
 
60
    # 2 objs -> 2 objs
 
61
    def rpc_lit_rpc_lit(obj1, obj2)
 
62
      [obj1, obj2]
 
63
    end
 
64
 
 
65
    # 2 params -> array
 
66
    def doc_enc_doc_enc(obj1, obj2)
 
67
      [obj1, [obj1, obj2]]
 
68
    end
 
69
 
 
70
    # 2 objs -> array
 
71
    def doc_lit_doc_enc(obj1, obj2)
 
72
      [obj2, obj1]
 
73
    end
 
74
 
 
75
    # 2 params -> 2 hashes
 
76
    def doc_enc_doc_lit(obj1, obj2)
 
77
      klass = [obj1.class.name, obj2.class.name]
 
78
      return {'obj1' => {'klass' => klass}, 'misc' => 'hash does not have an order'},
 
79
        {'obj2' => {'klass' => klass}}
 
80
    end
 
81
 
 
82
    # 2 objs -> 2 objs
 
83
    def doc_lit_doc_lit(obj1, obj2)
 
84
      return obj1, obj2
 
85
    end
 
86
  end
 
87
 
 
88
  Namespace = "urn:styleuse"
 
89
 
 
90
  module Op
 
91
    def self.opt(request_style, request_use, response_style, response_use)
 
92
      {
 
93
        :request_style => request_style,
 
94
        :request_use => request_use,
 
95
        :response_style => response_style,
 
96
        :response_use => response_use
 
97
      }
 
98
    end
 
99
 
 
100
    Op_rpc_enc_rpc_enc = [
 
101
      XSD::QName.new(Namespace, 'rpc_enc_rpc_enc'),
 
102
      nil,
 
103
      'rpc_enc_rpc_enc', [
 
104
        ['in', 'obj1', nil],
 
105
        ['in', 'obj2', nil],
 
106
        ['retval', 'return', nil]],
 
107
      opt(:rpc, :encoded, :rpc, :encoded)
 
108
    ]
 
109
 
 
110
    Op_rpc_lit_rpc_enc = [
 
111
      XSD::QName.new(Namespace, 'rpc_lit_rpc_enc'),
 
112
      nil,
 
113
      'rpc_lit_rpc_enc', [
 
114
        ['in', 'obj1', nil],
 
115
        ['in', 'obj2', nil],
 
116
        ['retval', 'return', nil]],
 
117
      opt(:rpc, :literal, :rpc, :encoded)
 
118
    ]
 
119
 
 
120
    Op_rpc_enc_rpc_lit = [
 
121
      XSD::QName.new(Namespace, 'rpc_enc_rpc_lit'),
 
122
      nil,
 
123
      'rpc_enc_rpc_lit', [
 
124
        ['in', 'obj1', nil],
 
125
        ['in', 'obj2', nil],
 
126
        ['retval', 'ret1', nil],
 
127
        ['out', 'ret2', nil]],
 
128
      opt(:rpc, :encoded, :rpc, :literal)
 
129
    ]
 
130
 
 
131
    Op_rpc_lit_rpc_lit = [
 
132
      XSD::QName.new(Namespace, 'rpc_lit_rpc_lit'),
 
133
      nil,
 
134
      'rpc_lit_rpc_lit', [
 
135
        ['in', 'obj1', nil],
 
136
        ['in', 'obj2', nil],
 
137
        ['retval', 'ret1', nil],
 
138
        ['out', 'ret2', nil]],
 
139
      opt(:rpc, :literal, :rpc, :literal)
 
140
    ]
 
141
 
 
142
    Op_doc_enc_doc_enc = [
 
143
      Namespace + 'doc_enc_doc_enc',
 
144
      'doc_enc_doc_enc', [
 
145
        ['in', 'obj1', [nil, Namespace, 'obj1']],
 
146
        ['in', 'obj2', [nil, Namespace, 'obj2']],
 
147
        ['out', 'ret1', [nil, Namespace, 'ret1']],
 
148
        ['out', 'ret2', [nil, Namespace, 'ret2']]],
 
149
      opt(:document, :encoded, :document, :encoded)
 
150
    ]
 
151
 
 
152
    Op_doc_lit_doc_enc = [
 
153
      Namespace + 'doc_lit_doc_enc',
 
154
      'doc_lit_doc_enc', [
 
155
        ['in', 'obj1', [nil, Namespace, 'obj1']],
 
156
        ['in', 'obj2', [nil, Namespace, 'obj2']],
 
157
        ['out', 'ret1', [nil, Namespace, 'ret1']],
 
158
        ['out', 'ret2', [nil, Namespace, 'ret2']]],
 
159
      opt(:document, :literal, :document, :encoded)
 
160
    ]
 
161
 
 
162
    Op_doc_enc_doc_lit = [
 
163
      Namespace + 'doc_enc_doc_lit',
 
164
      'doc_enc_doc_lit', [
 
165
        ['in', 'obj1', [nil, Namespace, 'obj1']],
 
166
        ['in', 'obj2', [nil, Namespace, 'obj2']],
 
167
        ['out', 'ret1', [nil, Namespace, 'ret1']],
 
168
        ['out', 'ret2', [nil, Namespace, 'ret2']]],
 
169
      opt(:document, :encoded, :document, :literal)
 
170
    ]
 
171
 
 
172
    Op_doc_lit_doc_lit = [
 
173
      Namespace + 'doc_lit_doc_lit',
 
174
      'doc_lit_doc_lit', [
 
175
        ['in', 'obj1', [nil, Namespace, 'obj1']],
 
176
        ['in', 'obj2', [nil, Namespace, 'obj2']],
 
177
        ['out', 'ret1', [nil, Namespace, 'ret1']],
 
178
        ['out', 'ret2', [nil, Namespace, 'ret2']]],
 
179
      opt(:document, :literal, :document, :literal)
 
180
    ]
 
181
  end
 
182
 
 
183
  include Op
 
184
 
 
185
  class Server < ::SOAP::RPC::HTTPServer
 
186
    include Op
 
187
 
 
188
    def on_init
 
189
      @servant = GenericServant.new
 
190
      add_rpc_operation(@servant, *Op_rpc_enc_rpc_enc)
 
191
      add_rpc_operation(@servant, *Op_rpc_lit_rpc_enc)
 
192
      add_rpc_operation(@servant, *Op_rpc_enc_rpc_lit)
 
193
      add_rpc_operation(@servant, *Op_rpc_lit_rpc_lit)
 
194
      add_document_operation(@servant, *Op_doc_enc_doc_enc)
 
195
      add_document_operation(@servant, *Op_doc_lit_doc_enc)
 
196
      add_document_operation(@servant, *Op_doc_enc_doc_lit)
 
197
      add_document_operation(@servant, *Op_doc_lit_doc_lit)
 
198
    end
 
199
  end
 
200
 
 
201
  Port = 17171
 
202
 
 
203
  def setup
 
204
    setup_server
 
205
    setup_client
 
206
  end
 
207
 
 
208
  def setup_server
 
209
    @server = Server.new(
 
210
      :BindAddress => "0.0.0.0",
 
211
      :Port => Port,
 
212
      :AccessLog => [],
 
213
      :SOAPDefaultNamespace => Namespace
 
214
    )
 
215
    @server.level = Logger::Severity::ERROR
 
216
    @server_thread = start_server_thread(@server)
 
217
  end
 
218
 
 
219
  def setup_client
 
220
    @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/", Namespace)
 
221
    @client.wiredump_dev = STDERR if $DEBUG
 
222
    @client.add_rpc_operation(*Op_rpc_enc_rpc_enc)
 
223
    @client.add_rpc_operation(*Op_rpc_lit_rpc_enc)
 
224
    @client.add_rpc_operation(*Op_rpc_enc_rpc_lit)
 
225
    @client.add_rpc_operation(*Op_rpc_lit_rpc_lit)
 
226
    @client.add_document_operation(*Op_doc_enc_doc_enc)
 
227
    @client.add_document_operation(*Op_doc_lit_doc_enc)
 
228
    @client.add_document_operation(*Op_doc_enc_doc_lit)
 
229
    @client.add_document_operation(*Op_doc_lit_doc_lit)
 
230
  end
 
231
 
 
232
  def teardown
 
233
    teardown_server
 
234
    teardown_client
 
235
  end
 
236
 
 
237
  def teardown_server
 
238
    @server.shutdown
 
239
    @server_thread.kill
 
240
    @server_thread.join
 
241
  end
 
242
 
 
243
  def teardown_client
 
244
    @client.reset_stream
 
245
  end
 
246
 
 
247
  def start_server_thread(server)
 
248
    t = Thread.new {
 
249
      Thread.current.abort_on_exception = true
 
250
      server.start
 
251
    }
 
252
    t
 
253
  end
 
254
 
 
255
  def test_rpc_enc_rpc_enc
 
256
    o = "hello"
 
257
    obj1 = o
 
258
    obj2 = [1]
 
259
    ret = @client.rpc_enc_rpc_enc(obj1, obj2)
 
260
    # server returns [obj1, [obj1, obj2]]
 
261
    assert_equal([obj1, [obj1, obj2]], ret)
 
262
    assert_same(ret[0], ret[1][0])
 
263
  end
 
264
 
 
265
  S1 = ::Struct.new(:a)
 
266
  S2 = ::Struct.new(:c)
 
267
  def test_rpc_lit_rpc_enc
 
268
    ret1, ret2 = @client.rpc_lit_rpc_enc(S1.new('b'), S2.new('d'))
 
269
    assert_equal('d', ret1.c)
 
270
    assert_equal('b', ret2.a)
 
271
    # Hash is allowed for literal
 
272
    ret1, ret2 = @client.rpc_lit_rpc_enc({'a' => 'b'}, {'c' => 'd'})
 
273
    assert_equal('d', ret1.c)
 
274
    assert_equal('b', ret2.a)
 
275
    # simple value
 
276
    assert_equal(
 
277
      ['1', 'a'],
 
278
      @client.rpc_lit_rpc_enc('a', 1)
 
279
    )
 
280
  end
 
281
 
 
282
  def test_rpc_enc_rpc_lit
 
283
    assert_equal(
 
284
      ['1', 'a'],
 
285
      @client.rpc_enc_rpc_lit('a', '1')
 
286
    )
 
287
  end
 
288
 
 
289
  def test_rpc_lit_rpc_lit
 
290
    ret1, ret2 = @client.rpc_lit_rpc_lit({'a' => 'b'}, {'c' => 'd'})
 
291
    assert_equal('b', ret1["a"])
 
292
    assert_equal('d', ret2["c"])
 
293
  end
 
294
 
 
295
  def test_doc_enc_doc_enc
 
296
    o = "hello"
 
297
    obj1 = o
 
298
    obj2 = [1]
 
299
    ret = @client.rpc_enc_rpc_enc(obj1, obj2)
 
300
    # server returns [obj1, [obj1, obj2]]
 
301
    assert_equal([obj1, [obj1, obj2]], ret)
 
302
    assert_same(ret[0], ret[1][0])
 
303
  end
 
304
 
 
305
  def test_doc_lit_doc_enc
 
306
    ret1, ret2 = @client.doc_lit_doc_enc({'a' => 'b'}, {'c' => 'd'})
 
307
    assert_equal('d', ret1.c)
 
308
    assert_equal('b', ret2.a)
 
309
    assert_equal(
 
310
      ['a', '1'],
 
311
      @client.doc_lit_doc_enc(1, 'a')
 
312
    )
 
313
  end
 
314
 
 
315
  def test_doc_enc_doc_lit
 
316
    ret1, ret2 = @client.doc_enc_doc_lit('a', 1)
 
317
    # literal Array
 
318
    assert_equal(['String', 'Fixnum'], ret1['obj1']['klass'])
 
319
    # same value
 
320
    assert_equal(ret1['obj1']['klass'], ret2['obj2']['klass'])
 
321
    # not the same object (not encoded)
 
322
    assert_not_same(ret1['obj1']['klass'], ret2['obj2']['klass'])
 
323
  end
 
324
 
 
325
  def test_doc_lit_doc_lit
 
326
    ret1, ret2 = @client.doc_lit_doc_lit({'a' => 'b'}, {'c' => 'd'})
 
327
    assert_equal('b', ret1["a"])
 
328
    assert_equal('d', ret2["c"])
 
329
  end
 
330
end
 
331
 
 
332
 
 
333
end