2
require 'soap/rpc/httpserver'
3
require 'soap/rpc/driver'
9
class TestStyleUse < Test::Unit::TestCase
10
# rpc driver: obj in(Hash allowed for literal), obj out
12
# style: not visible from user
13
# rpc: wrapped element
14
# document: unwrappted element
17
# encoding: a graph (SOAP Data Model)
18
# literal: not a graph (SOAPElement)
20
# rpc stub: obj in, obj out(Hash is allowed for literal)
22
# style: not visible from user
23
# rpc: wrapped element
24
# document: unwrappted element
27
# encoding: a graph (SOAP Data Model)
28
# literal: not a graph (SOAPElement)
30
# document driver: SOAPElement in, SOAPElement out? [not implemented]
36
# document stub: SOAPElement in, SOAPElement out? [not implemented]
42
# method name style: requeststyle_requestuse_responsestyle_responseuse
45
def rpc_enc_rpc_enc(obj1, obj2)
50
def rpc_lit_rpc_enc(obj1, obj2)
54
# 2 params -> 2 params
55
def rpc_enc_rpc_lit(obj1, obj2)
56
klass = [obj1.class.name, obj2.class.name]
61
def rpc_lit_rpc_lit(obj1, obj2)
66
def doc_enc_doc_enc(obj1, obj2)
71
def doc_lit_doc_enc(obj1, obj2)
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}}
83
def doc_lit_doc_lit(obj1, obj2)
88
Namespace = "urn:styleuse"
91
def self.opt(request_style, request_use, response_style, response_use)
93
:request_style => request_style,
94
:request_use => request_use,
95
:response_style => response_style,
96
:response_use => response_use
100
Op_rpc_enc_rpc_enc = [
101
XSD::QName.new(Namespace, 'rpc_enc_rpc_enc'),
106
['retval', 'return', nil]],
107
opt(:rpc, :encoded, :rpc, :encoded)
110
Op_rpc_lit_rpc_enc = [
111
XSD::QName.new(Namespace, 'rpc_lit_rpc_enc'),
116
['retval', 'return', nil]],
117
opt(:rpc, :literal, :rpc, :encoded)
120
Op_rpc_enc_rpc_lit = [
121
XSD::QName.new(Namespace, 'rpc_enc_rpc_lit'),
126
['retval', 'ret1', nil],
127
['out', 'ret2', nil]],
128
opt(:rpc, :encoded, :rpc, :literal)
131
Op_rpc_lit_rpc_lit = [
132
XSD::QName.new(Namespace, 'rpc_lit_rpc_lit'),
137
['retval', 'ret1', nil],
138
['out', 'ret2', nil]],
139
opt(:rpc, :literal, :rpc, :literal)
142
Op_doc_enc_doc_enc = [
143
Namespace + '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)
152
Op_doc_lit_doc_enc = [
153
Namespace + '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)
162
Op_doc_enc_doc_lit = [
163
Namespace + '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)
172
Op_doc_lit_doc_lit = [
173
Namespace + '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)
185
class Server < ::SOAP::RPC::HTTPServer
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)
209
@server = Server.new(
210
:BindAddress => "0.0.0.0",
213
:SOAPDefaultNamespace => Namespace
215
@server.level = Logger::Severity::ERROR
216
@server_thread = start_server_thread(@server)
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)
247
def start_server_thread(server)
249
Thread.current.abort_on_exception = true
255
def test_rpc_enc_rpc_enc
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])
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)
278
@client.rpc_lit_rpc_enc('a', 1)
282
def test_rpc_enc_rpc_lit
285
@client.rpc_enc_rpc_lit('a', '1')
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"])
295
def test_doc_enc_doc_enc
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])
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)
311
@client.doc_lit_doc_enc(1, 'a')
315
def test_doc_enc_doc_lit
316
ret1, ret2 = @client.doc_enc_doc_lit('a', 1)
318
assert_equal(['String', 'Fixnum'], ret1['obj1']['klass'])
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'])
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"])