summaryrefslogtreecommitdiff
path: root/test/wsdl
diff options
context:
space:
mode:
author(no author) <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-05-22 13:20:28 +0000
committer(no author) <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-05-22 13:20:28 +0000
commit15b7d439885f4aa97e0f508ef485cadab4b23577 (patch)
tree82c8688f0c59072692095d904460e9d33d42c747 /test/wsdl
parent7c95e34533ddc68692e2f811de159a81b94af3d4 (diff)
This commit was manufactured by cvs2svn to create branch 'ruby_1_8'.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8501 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/wsdl')
-rw-r--r--test/wsdl/document/document.wsdl74
-rw-r--r--test/wsdl/document/echo.rb92
-rw-r--r--test/wsdl/document/number.wsdl54
-rw-r--r--test/wsdl/document/ping_nosoapaction.wsdl66
-rw-r--r--test/wsdl/document/test_nosoapaction.rb109
-rw-r--r--test/wsdl/document/test_number.rb99
-rw-r--r--test/wsdl/document/test_rpc.rb159
-rw-r--r--test/wsdl/marshal/person.wsdl21
-rw-r--r--test/wsdl/marshal/person_org.rb22
-rw-r--r--test/wsdl/marshal/test_wsdlmarshal.rb80
-rw-r--r--test/wsdl/raa/server.rb103
-rw-r--r--test/wsdl/rpc/rpc.wsdl75
-rw-r--r--test/wsdl/rpc/test_rpc.rb118
13 files changed, 1072 insertions, 0 deletions
diff --git a/test/wsdl/document/document.wsdl b/test/wsdl/document/document.wsdl
new file mode 100644
index 0000000000..fbf03fae8b
--- /dev/null
+++ b/test/wsdl/document/document.wsdl
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions
+ name="echo"
+ targetNamespace="urn:docrpc"
+ xmlns:tns="urn:docrpc"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema elementFormDefault="unqualified" targetNamespace="urn:docrpc">
+ <xsd:complexType name="echo_struct">
+ <xsd:sequence>
+ <xsd:element minOccurs="0" maxOccurs="1" name="m_string" type="xsd:string" />
+ <xsd:element minOccurs="0" maxOccurs="1" name="m_datetime" type="xsd:dateTime" />
+ </xsd:sequence>
+ <xsd:attribute name="m_attr" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:element name="echoele">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" maxOccurs="1" name="struct1" type="tns:echo_struct" />
+ <xsd:element minOccurs="0" maxOccurs="1" name="struct-2" type="tns:echo_struct" />
+ </xsd:sequence>
+ <xsd:attribute name="attr_string" type="xsd:string" />
+ <xsd:attribute name="attr-int" type="xsd:int" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="echo_response">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" maxOccurs="1" name="struct1" type="tns:echo_struct" />
+ <xsd:element minOccurs="0" maxOccurs="1" name="struct-2" type="tns:echo_struct" />
+ </xsd:sequence>
+ <xsd:attribute name="attr_string" type="xsd:string" />
+ <xsd:attribute name="attr-int" type="xsd:int" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </types>
+
+ <message name="echo_in">
+ <part name="parameters" element="tns:echoele" />
+ </message>
+ <message name="echo_out">
+ <part name="parameters" element="tns:echo_response" />
+ </message>
+
+ <portType name="docrpc_porttype">
+ <operation name="echo">
+ <input message="tns:echo_in" />
+ <output message="tns:echo_out" />
+ </operation>
+ </portType>
+
+ <binding name="docrpc_binding" type="tns:docrpc_porttype">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
+ <operation name="echo">
+ <soap:operation soapAction="urn:docrpc:echo" style="document" />
+ <input>
+ <soap:body use="literal" />
+ </input>
+ <output>
+ <soap:body use="literal" />
+ </output>
+ </operation>
+ </binding>
+
+ <service name="docrpc_service">
+ <port name="docprc_service_port" binding="tns:docrpc_binding">
+ <soap:address location="http://localhost:17171/" />
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/document/echo.rb b/test/wsdl/document/echo.rb
new file mode 100644
index 0000000000..05f00412f4
--- /dev/null
+++ b/test/wsdl/document/echo.rb
@@ -0,0 +1,92 @@
+require 'xsd/qname'
+
+# {urn:docrpc}echoele
+class Echoele
+ @@schema_type = "echoele"
+ @@schema_ns = "urn:docrpc"
+ @@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"}
+ @@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]]
+
+ attr_accessor :struct1
+ attr_accessor :struct_2
+
+ def xmlattr_attr_string
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")]
+ end
+
+ def xmlattr_attr_string=(value)
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value
+ end
+
+ def xmlattr_attr_int
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")]
+ end
+
+ def xmlattr_attr_int=(value)
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value
+ end
+
+ def initialize(struct1 = nil, struct_2 = nil)
+ @struct1 = struct1
+ @struct_2 = struct_2
+ @__xmlattr = {}
+ end
+end
+
+# {urn:docrpc}echo_response
+class Echo_response
+ @@schema_type = "echo_response"
+ @@schema_ns = "urn:docrpc"
+ @@schema_attribute = {XSD::QName.new(nil, "attr_string") => "SOAP::SOAPString", XSD::QName.new(nil, "attr-int") => "SOAP::SOAPInt"}
+ @@schema_element = [["struct1", "Echo_struct"], ["struct_2", ["Echo_struct", XSD::QName.new(nil, "struct-2")]]]
+
+ attr_accessor :struct1
+ attr_accessor :struct_2
+
+ def xmlattr_attr_string
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")]
+ end
+
+ def xmlattr_attr_string=(value)
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr_string")] = value
+ end
+
+ def xmlattr_attr_int
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")]
+ end
+
+ def xmlattr_attr_int=(value)
+ (@__xmlattr ||= {})[XSD::QName.new(nil, "attr-int")] = value
+ end
+
+ def initialize(struct1 = nil, struct_2 = nil)
+ @struct1 = struct1
+ @struct_2 = struct_2
+ @__xmlattr = {}
+ end
+end
+
+# {urn:docrpc}echo_struct
+class Echo_struct
+ @@schema_type = "echo_struct"
+ @@schema_ns = "urn:docrpc"
+ @@schema_attribute = {XSD::QName.new("urn:docrpc", "m_attr") => "SOAP::SOAPString"}
+ @@schema_element = [["m_string", "SOAP::SOAPString"], ["m_datetime", "SOAP::SOAPDateTime"]]
+
+ attr_accessor :m_string
+ attr_accessor :m_datetime
+
+ def xmlattr_m_attr
+ (@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")]
+ end
+
+ def xmlattr_m_attr=(value)
+ (@__xmlattr ||= {})[XSD::QName.new("urn:docrpc", "m_attr")] = value
+ end
+
+ def initialize(m_string = nil, m_datetime = nil)
+ @m_string = m_string
+ @m_datetime = m_datetime
+ @__xmlattr = {}
+ end
+end
diff --git a/test/wsdl/document/number.wsdl b/test/wsdl/document/number.wsdl
new file mode 100644
index 0000000000..cc3dd8e9f0
--- /dev/null
+++ b/test/wsdl/document/number.wsdl
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions
+ name="foo"
+ targetNamespace="urn:foo"
+ xmlns:tns="urn:foo"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema elementFormDefault="unqualified" targetNamespace="urn:foo">
+ <xsd:element name="get_foo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element minOccurs="0" maxOccurs="1" name="number" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </types>
+
+ <message name="get_foo_in">
+ <part name="parameters" element="tns:get_foo" />
+ </message>
+ <message name="get_foo_out">
+ <part name="parameters" type="xsd:string" />
+ </message>
+
+ <portType name="foo_porttype">
+ <operation name="get_foo">
+ <input message="tns:get_foo_in" />
+ <output message="tns:get_foo_out" />
+ </operation>
+ </portType>
+
+ <binding name="foo_binding" type="tns:foo_porttype">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
+ style="document" />
+ <operation name="get_foo">
+ <soap:operation soapAction="urn:foo:get_foo" style="document" />
+ <input>
+ <soap:body use="literal" />
+ </input>
+ <output>
+ <soap:body use="literal" />
+ </output>
+ </operation>
+ </binding>
+
+ <service name="foo_service">
+ <port name="foo_service_port" binding="tns:foo_binding">
+ <soap:address location="http://localhost:17171/" />
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/document/ping_nosoapaction.wsdl b/test/wsdl/document/ping_nosoapaction.wsdl
new file mode 100644
index 0000000000..ab9529e456
--- /dev/null
+++ b/test/wsdl/document/ping_nosoapaction.wsdl
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions xmlns:tns="http://xmlsoap.org/Ping"
+xmlns="http://schemas.xmlsoap.org/wsdl/"
+xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+targetNamespace="http://xmlsoap.org/Ping" name="Ping">
+ <types>
+ <schema targetNamespace="http://xmlsoap.org/Ping"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified">
+ <complexType name="ping">
+ <sequence>
+ <element name="scenario" type="xsd:string"
+ nillable="true"/>
+ <element name="origin" type="xsd:string"
+ nillable="true"/>
+ <element name="text" type="xsd:string"
+ nillable="true"/>
+ </sequence>
+ </complexType>
+ <complexType name="pingResponse">
+ <sequence>
+ <element name="scenario" type="xsd:string"
+ nillable="true"/>
+ <element name="origin" type="xsd:string"
+ nillable="true"/>
+ <element name="text" type="xsd:string"
+ nillable="true"/>
+ </sequence>
+ </complexType>
+ <element name="Ping" type="tns:ping"/>
+ <element name="PingResponse" type="tns:pingResponse"/>
+ </schema>
+ </types>
+ <message name="PingRequest">
+ <part name="ping" element="tns:Ping"/>
+ </message>
+ <message name="PingResponse">
+ <part name="pingResponse" element="tns:PingResponse"/>
+ </message>
+ <portType name="PingPort">
+ <operation name="Ping">
+ <input message="tns:PingRequest"/>
+ <output message="tns:PingResponse"/>
+ </operation>
+ </portType>
+ <binding name="PingBinding" type="tns:PingPort">
+ <soap:binding style="document"
+ transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="Ping">
+ <soap:operation/>
+ <input>
+ <soap:body use="literal"/>
+ </input>
+ <output>
+ <soap:body use="literal"/>
+ </output>
+ </operation>
+ </binding>
+ <service name="PingService">
+ <port name="PingPort" binding="tns:PingBinding">
+ <soap:address
+ location="http://127.0.0.1:8080/axis/services/PingPort"/>
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/document/test_nosoapaction.rb b/test/wsdl/document/test_nosoapaction.rb
new file mode 100644
index 0000000000..77f642fe1b
--- /dev/null
+++ b/test/wsdl/document/test_nosoapaction.rb
@@ -0,0 +1,109 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'wsdl/soap/wsdl2ruby'
+require 'soap/rpc/standaloneServer'
+require 'soap/wsdlDriver'
+require 'soap/rpc/driver'
+
+
+module WSDL; module Document
+
+
+class TestNoSOAPAction < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::StandaloneServer
+ Namespace = 'http://xmlsoap.org/Ping'
+
+ def on_init
+ add_document_method(
+ self,
+ Namespace + '/ping',
+ 'ping_with_soapaction',
+ XSD::QName.new(Namespace, 'Ping'),
+ XSD::QName.new(Namespace, 'PingResponse')
+ )
+
+ add_document_method(
+ self,
+ nil,
+ 'ping',
+ XSD::QName.new(Namespace, 'Ping'),
+ XSD::QName.new(Namespace, 'PingResponse')
+ )
+
+ # When no SOAPAction given, latter method(ping) is called.
+ end
+
+ def ping(arg)
+ arg.text = 'ping'
+ arg
+ end
+
+ def ping_with_soapaction(arg)
+ arg.text = 'ping_with_soapaction'
+ arg
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ Port = 17171
+
+ def setup
+ setup_server
+ @client = nil
+ end
+
+ def teardown
+ teardown_server
+ @client.reset_stream if @client
+ end
+
+ def setup_server
+ @server = Server.new('Test', Server::Namespace, '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ t
+ end
+
+ def test_with_soapaction
+ wsdl = File.join(DIR, 'ping_nosoapaction.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.wiredump_dev = STDOUT if $DEBUG
+ rv = @client.ping(:scenario => 'scenario', :origin => 'origin',
+ :text => 'text')
+ assert_equal('scenario', rv.scenario)
+ assert_equal('origin', rv.origin)
+ assert_equal('ping', rv.text)
+ end
+
+ def test_without_soapaction
+ @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/",
+ Server::Namespace)
+ @client.add_document_method('ping', Server::Namespace + '/ping',
+ XSD::QName.new(Server::Namespace, 'Ping'),
+ XSD::QName.new(Server::Namespace, 'PingResponse'))
+ @client.wiredump_dev = STDOUT if $DEBUG
+ rv = @client.ping(:scenario => 'scenario', :origin => 'origin',
+ :text => 'text')
+ assert_equal('scenario', rv.scenario)
+ assert_equal('origin', rv.origin)
+ assert_equal('ping_with_soapaction', rv.text)
+ end
+end
+
+
+end; end
diff --git a/test/wsdl/document/test_number.rb b/test/wsdl/document/test_number.rb
new file mode 100644
index 0000000000..a640ef2a25
--- /dev/null
+++ b/test/wsdl/document/test_number.rb
@@ -0,0 +1,99 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'wsdl/soap/wsdl2ruby'
+require 'soap/rpc/standaloneServer'
+require 'soap/wsdlDriver'
+
+
+module WSDL; module Document
+
+
+class TestNumber < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::StandaloneServer
+ Namespace = 'urn:foo'
+
+ def on_init
+ add_document_method(
+ self,
+ Namespace + ':get_foo',
+ 'get_foo',
+ XSD::QName.new(Namespace, 'get_foo'),
+ XSD::QName.new(Namespace, 'get_foo_response')
+ )
+ end
+
+ def get_foo(arg)
+ arg.number
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_classdef
+ @client = nil
+ end
+
+ def teardown
+ teardown_server
+ File.unlink(pathname('foo.rb'))
+ @client.reset_stream if @client
+ end
+
+ def setup_server
+ @server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_classdef
+ gen = WSDL::SOAP::WSDL2Ruby.new
+ gen.location = pathname("number.wsdl")
+ gen.basedir = DIR
+ gen.logger.level = Logger::FATAL
+ gen.opt['classdef'] = nil
+ gen.opt['force'] = true
+ gen.run
+ require pathname('foo')
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ t
+ end
+
+ def pathname(filename)
+ File.join(DIR, filename)
+ end
+
+ def test_wsdl
+ wsdl = File.join(DIR, 'number.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.wiredump_dev = STDOUT if $DEBUG
+
+ # with the Struct defined in foo.rb, which is generated from WSDL
+ assert_equal("12345", @client.get_foo(Get_foo.new("12345")))
+
+ # with Hash
+ assert_equal("12345", @client.get_foo({:number => "12345"}))
+
+ # with Original struct
+ get_foo_struct = Struct.new(:number)
+ assert_equal("12345", @client.get_foo(get_foo_struct.new("12345")))
+ end
+end
+
+
+end; end
diff --git a/test/wsdl/document/test_rpc.rb b/test/wsdl/document/test_rpc.rb
new file mode 100644
index 0000000000..66b804a0f9
--- /dev/null
+++ b/test/wsdl/document/test_rpc.rb
@@ -0,0 +1,159 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'wsdl/soap/wsdl2ruby'
+require 'soap/rpc/standaloneServer'
+require 'soap/wsdlDriver'
+
+
+module WSDL; module Document
+
+
+class TestRPC < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::StandaloneServer
+ Namespace = 'urn:docrpc'
+
+ def on_init
+ add_document_method(
+ self,
+ Namespace + ':echo',
+ 'echo',
+ XSD::QName.new(Namespace, 'echo'),
+ XSD::QName.new(Namespace, 'echo_response')
+ )
+ end
+
+ def echo(arg)
+ if arg.is_a?(Echoele)
+ # swap args
+ tmp = arg.struct1
+ arg.struct1 = arg.struct_2
+ arg.struct_2 = tmp
+ arg
+ else
+ # swap args
+ tmp = arg["struct1"]
+ arg["struct1"] = arg["struct-2"]
+ arg["struct-2"] = tmp
+ arg
+ end
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_classdef
+ @client = nil
+ end
+
+ def teardown
+ teardown_server
+ #File.unlink(pathname('echo.rb'))
+ @client.reset_stream if @client
+ end
+
+ def setup_server
+ @server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_classdef
+ gen = WSDL::SOAP::WSDL2Ruby.new
+ gen.location = pathname("document.wsdl")
+ gen.basedir = DIR
+ gen.logger.level = Logger::FATAL
+ gen.opt['classdef'] = nil
+ gen.opt['force'] = true
+ gen.run
+ require pathname('echo')
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ t
+ end
+
+ def pathname(filename)
+ File.join(DIR, filename)
+ end
+
+ def test_wsdl
+ wsdl = File.join(DIR, 'document.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.wiredump_dev = STDOUT if $DEBUG
+
+ struct1 = Echo_struct.new("mystring1", now1 = Time.now)
+ struct1.xmlattr_m_attr = 'myattr1'
+ struct2 = Echo_struct.new("mystring2", now2 = Time.now)
+ struct2.xmlattr_m_attr = 'myattr2'
+ echo = Echoele.new(struct1, struct2)
+ echo.xmlattr_attr_string = 'attr_string'
+ echo.xmlattr_attr_int = 5
+ ret = @client.echo(echo)
+
+ timeformat = "%Y-%m-%dT%H:%M:%S.%s"
+ assert_equal("mystring2", ret.struct1.m_string)
+ assert_equal(now2.strftime(timeformat), ret.struct1.m_datetime.strftime(timeformat))
+ assert_equal("mystring1", ret.struct_2.m_string)
+ assert_equal(now1.strftime(timeformat), ret.struct_2.m_datetime.strftime(timeformat))
+ assert_equal("attr_string", ret.xmlattr_attr_string)
+ assert_equal(5, ret.xmlattr_attr_int)
+ end
+
+ include ::SOAP
+ def test_naive
+ @client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/")
+ @client.add_document_method('echo', 'urn:docrpc:echo',
+ XSD::QName.new('urn:docrpc', 'echoele'),
+ XSD::QName.new('urn:docrpc', 'echo_response'))
+ @client.wiredump_dev = STDOUT if $DEBUG
+
+ echo = SOAPElement.new('foo')
+ echo.extraattr['attr_string'] = 'attr_string'
+ echo.extraattr['attr-int'] = 5
+ echo.add(struct1 = SOAPElement.new('struct1'))
+ struct1.add(SOAPElement.new('m_string', 'mystring1'))
+ struct1.add(SOAPElement.new('m_datetime', '2005-03-17T19:47:31+01:00'))
+ struct1.extraattr['m_attr'] = 'myattr1'
+ echo.add(struct2 = SOAPElement.new('struct-2'))
+ struct2.add(SOAPElement.new('m_string', 'mystring2'))
+ struct2.add(SOAPElement.new('m_datetime', '2005-03-17T19:47:32+02:00'))
+ struct2.extraattr['m_attr'] = 'myattr2'
+ ret = @client.echo(echo)
+ timeformat = "%Y-%m-%dT%H:%M:%S"
+ assert_equal('mystring2', ret.struct1.m_string)
+ assert_equal('2005-03-17T19:47:32', ret.struct1.m_datetime.strftime(timeformat))
+ #p ret.struct1.class
+ #p ret.struct_2.class
+ assert_equal("mystring1", ret.struct_2.m_string)
+ assert_equal('2005-03-17T19:47:31', ret.struct_2.m_datetime.strftime(timeformat))
+ assert_equal('attr_string', ret.xmlattr_attr_string)
+ assert_equal(5, ret.xmlattr_attr_int)
+
+ echo = {'struct1' => {'m_string' => 'mystring1', 'm_datetime' => '2005-03-17T19:47:31+01:00'},
+ 'struct-2' => {'m_string' => 'mystring2', 'm_datetime' => '2005-03-17T19:47:32+02:00'}}
+ ret = @client.echo(echo)
+ timeformat = "%Y-%m-%dT%H:%M:%S"
+ assert_equal('mystring2', ret.struct1.m_string)
+ assert_equal('2005-03-17T19:47:32', ret.struct1.m_datetime.strftime(timeformat))
+ assert_equal("mystring1", ret.struct_2.m_string)
+ assert_equal('2005-03-17T19:47:31', ret.struct_2.m_datetime.strftime(timeformat))
+ end
+end
+
+
+end; end
diff --git a/test/wsdl/marshal/person.wsdl b/test/wsdl/marshal/person.wsdl
new file mode 100644
index 0000000000..6ea8a04825
--- /dev/null
+++ b/test/wsdl/marshal/person.wsdl
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<definitions name="Person"
+ targetNamespace="http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
+ xmlns:tns="http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.jin.gr.jp/~nahi/xmlns/sample/Person">
+ <complexType name="Person">
+ <all>
+ <element name="familyname" type="xsd:string"/>
+ <element name="givenname" type="xsd:string"/>
+ <element name="var1" type="xsd:int"/>
+ <element name="var2" type="xsd:double"/>
+ <element name="var3" type="xsd:string"/>
+ </all>
+ </complexType>
+ </xsd:schema>
+ </types>
+</definitions>
diff --git a/test/wsdl/marshal/person_org.rb b/test/wsdl/marshal/person_org.rb
new file mode 100644
index 0000000000..55405b658d
--- /dev/null
+++ b/test/wsdl/marshal/person_org.rb
@@ -0,0 +1,22 @@
+require 'xsd/qname'
+
+# {http://www.jin.gr.jp/~nahi/xmlns/sample/Person}Person
+class Person
+ @@schema_type = "Person"
+ @@schema_ns = "http://www.jin.gr.jp/~nahi/xmlns/sample/Person"
+ @@schema_element = [["familyname", "SOAP::SOAPString"], ["givenname", "SOAP::SOAPString"], ["var1", "SOAP::SOAPInt"], ["var2", "SOAP::SOAPDouble"], ["var3", "SOAP::SOAPString"]]
+
+ attr_accessor :familyname
+ attr_accessor :givenname
+ attr_accessor :var1
+ attr_accessor :var2
+ attr_accessor :var3
+
+ def initialize(familyname = nil, givenname = nil, var1 = nil, var2 = nil, var3 = nil)
+ @familyname = familyname
+ @givenname = givenname
+ @var1 = var1
+ @var2 = var2
+ @var3 = var3
+ end
+end
diff --git a/test/wsdl/marshal/test_wsdlmarshal.rb b/test/wsdl/marshal/test_wsdlmarshal.rb
new file mode 100644
index 0000000000..cd2bdb198a
--- /dev/null
+++ b/test/wsdl/marshal/test_wsdlmarshal.rb
@@ -0,0 +1,80 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'soap/mapping/wsdlencodedregistry'
+require 'soap/marshal'
+require 'wsdl/soap/wsdl2ruby'
+
+class WSDLMarshaller
+ include SOAP
+
+ def initialize(wsdlfile)
+ wsdl = WSDL::Parser.new.parse(File.open(wsdlfile) { |f| f.read })
+ types = wsdl.collect_complextypes
+ @opt = {
+ :decode_typemap => types,
+ :generate_explicit_type => false,
+ :pretty => true
+ }
+ @mapping_registry = Mapping::WSDLEncodedRegistry.new(types)
+ end
+
+ def dump(obj, io = nil)
+ type = Mapping.class2element(obj.class)
+ ele = Mapping.obj2soap(obj, @mapping_registry, type)
+ ele.elename = ele.type
+ Processor.marshal(SOAPEnvelope.new(nil, SOAPBody.new(ele)), @opt, io)
+ end
+
+ def load(io)
+ header, body = Processor.unmarshal(io, @opt)
+ Mapping.soap2obj(body.root_node)
+ end
+end
+
+
+require File.join(File.dirname(__FILE__), 'person_org')
+
+class Person
+ def ==(rhs)
+ @familyname == rhs.familyname and @givenname == rhs.givenname and
+ @var1 == rhs.var1 and @var2 == rhs.var2 and @var3 == rhs.var3
+ end
+end
+
+
+class TestWSDLMarshal < Test::Unit::TestCase
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ def test_marshal
+ marshaller = WSDLMarshaller.new(pathname('person.wsdl'))
+ obj = Person.new("NAKAMURA", "Hiroshi", 1, 1.0, "1")
+ str = marshaller.dump(obj)
+ obj2 = marshaller.load(str)
+ assert_equal(obj, obj2)
+ assert_equal(str, marshaller.dump(obj2))
+ end
+
+ def test_classdef
+ gen = WSDL::SOAP::WSDL2Ruby.new
+ gen.location = pathname("person.wsdl")
+ gen.basedir = DIR
+ gen.logger.level = Logger::FATAL
+ gen.opt['classdef'] = nil
+ gen.opt['force'] = true
+ gen.run
+ compare("person_org.rb", "Person.rb")
+ File.unlink(pathname('Person.rb'))
+ end
+
+ def compare(expected, actual)
+ assert_equal(loadfile(expected), loadfile(actual), actual)
+ end
+
+ def loadfile(file)
+ File.open(pathname(file)) { |f| f.read }
+ end
+
+ def pathname(filename)
+ File.join(DIR, filename)
+ end
+end
diff --git a/test/wsdl/raa/server.rb b/test/wsdl/raa/server.rb
new file mode 100644
index 0000000000..87bbc6f569
--- /dev/null
+++ b/test/wsdl/raa/server.rb
@@ -0,0 +1,103 @@
+#!/usr/bin/env ruby
+require 'soap/rpc/standaloneServer'
+require 'RAA.rb'
+
+class RAABaseServicePortType
+ MappingRegistry = SOAP::Mapping::Registry.new
+
+ MappingRegistry.set(
+ StringArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "string") }
+ )
+ MappingRegistry.set(
+ Map,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://xml.apache.org/xml-soap", "Map") }
+ )
+ MappingRegistry.set(
+ Category,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category") }
+ )
+ MappingRegistry.set(
+ InfoArray,
+ ::SOAP::SOAPArray,
+ ::SOAP::Mapping::Registry::TypedArrayFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info") }
+ )
+ MappingRegistry.set(
+ Info,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info") }
+ )
+ MappingRegistry.set(
+ Product,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Product") }
+ )
+ MappingRegistry.set(
+ Owner,
+ ::SOAP::SOAPStruct,
+ ::SOAP::Mapping::Registry::TypedStructFactory,
+ { :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Owner") }
+ )
+
+ Methods = [
+ ["getAllListings", "getAllListings", [
+ ["retval", "return",
+ [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
+ ["getProductTree", "getProductTree", [
+ ["retval", "return",
+ [::SOAP::SOAPStruct, "http://xml.apache.org/xml-soap", "Map"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
+ ["getInfoFromCategory", "getInfoFromCategory", [
+ ["in", "category",
+ [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category"]],
+ ["retval", "return",
+ [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
+ ["getModifiedInfoSince", "getModifiedInfoSince", [
+ ["in", "timeInstant",
+ [SOAP::SOAPDateTime]],
+ ["retval", "return",
+ [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
+ ["getInfoFromName", "getInfoFromName", [
+ ["in", "productName",
+ [SOAP::SOAPString]],
+ ["retval", "return",
+ [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
+ ["getInfoFromOwnerId", "getInfoFromOwnerId", [
+ ["in", "ownerId",
+ [SOAP::SOAPInt]],
+ ["retval", "return",
+ [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
+ "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"]
+ ]
+
+ def getAllListings
+ ["ruby", "soap4r"]
+ end
+end
+
+class RAABaseServiceServer < SOAP::RPC::StandaloneServer
+ def initialize(*arg)
+ super
+
+ servant = RAABaseServicePortType.new
+ RAABaseServicePortType::Methods.each do |name_as, name, params, soapaction, namespace|
+ qname = XSD::QName.new(namespace, name_as)
+ @router.add_method(servant, qname, soapaction, name, params)
+ end
+
+ self.mapping_registry = RAABaseServicePortType::MappingRegistry
+ end
+end
diff --git a/test/wsdl/rpc/rpc.wsdl b/test/wsdl/rpc/rpc.wsdl
new file mode 100644
index 0000000000..b0ee5c5e56
--- /dev/null
+++ b/test/wsdl/rpc/rpc.wsdl
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions name="echo"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="urn:rpc"
+ xmlns:txd="urn:rpc-type"
+ targetNamespace="urn:rpc"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema targetNamespace="urn:rpc-type">
+ <xsd:complexType name="person">
+ <xsd:all>
+ <xsd:element name="family-name" type="xsd:string" />
+ <xsd:element name="given_name" type="xsd:string" />
+ <xsd:element name="age" type="xsd:int" />
+ <xsd:element name="link" type="txd:person" />
+ </xsd:all>
+ </xsd:complexType>
+ </xsd:schema>
+ </types>
+
+ <message name="echo_in">
+ <part name="arg1" type="txd:person"/>
+ <part name="arg2" type="txd:person"/>
+ </message>
+
+ <message name="echo_out">
+ <part name="return" type="txd:person"/>
+ </message>
+
+ <portType name="echo_port_type">
+ <operation name="echo">
+ <input message="tns:echo_in"/>
+ <output message="tns:echo_out"/>
+ </operation>
+
+ <operation name="echo_err">
+ <input message="tns:echo_in"/>
+ <output message="tns:echo_out"/>
+ </operation>
+ </portType>
+
+ <binding name="echo_binding" type="tns:echo_port_type">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
+ <operation name="echo">
+ <soap:operation soapAction=""/>
+ <input>
+ <soap:body use="encoded" namespace="urn:rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+
+ <operation name="echo_err">
+ <soap:operation soapAction=""/>
+ <input>
+ <soap:body use="encoded" namespace="urn:rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="urn:rpc"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ </binding>
+
+ <service name="echo_service">
+ <port name="echo_port" binding="tns:echo_binding">
+ <soap:address location="http://localhost:10080"/>
+ </port>
+ </service>
+</definitions>
diff --git a/test/wsdl/rpc/test_rpc.rb b/test/wsdl/rpc/test_rpc.rb
new file mode 100644
index 0000000000..7c4c3a7ad6
--- /dev/null
+++ b/test/wsdl/rpc/test_rpc.rb
@@ -0,0 +1,118 @@
+require 'test/unit'
+require 'wsdl/parser'
+require 'wsdl/soap/wsdl2ruby'
+require 'soap/rpc/standaloneServer'
+require 'soap/wsdlDriver'
+
+
+module WSDL; module RPC
+
+
+class TestRPC < Test::Unit::TestCase
+ class Server < ::SOAP::RPC::StandaloneServer
+ def on_init
+ self.generate_explicit_type = false
+ add_rpc_method(self, 'echo', 'arg1', 'arg2')
+ add_rpc_method(self, 'echo_err', 'arg1', 'arg2')
+ end
+
+ DummyPerson = Struct.new("family-name".intern, :given_name)
+ def echo(arg1, arg2)
+ case arg1.family_name
+ when 'normal'
+ arg1.family_name = arg2.family_name
+ arg1.given_name = arg2.given_name
+ arg1.age = arg2.age
+ arg1
+ when 'dummy'
+ DummyPerson.new("family-name", "given_name")
+ else
+ raise
+ end
+ end
+
+ ErrPerson = Struct.new(:given_name, :no_such_element)
+ def echo_err(arg1, arg2)
+ ErrPerson.new(58, Time.now)
+ end
+ end
+
+ DIR = File.dirname(File.expand_path(__FILE__))
+
+ Port = 17171
+
+ def setup
+ setup_server
+ setup_classdef
+ @client = nil
+ end
+
+ def teardown
+ teardown_server
+ File.unlink(pathname('echo.rb'))
+ @client.reset_stream if @client
+ end
+
+ def setup_server
+ @server = Server.new('Test', "urn:rpc", '0.0.0.0', Port)
+ @server.level = Logger::Severity::ERROR
+ @server_thread = start_server_thread(@server)
+ end
+
+ def setup_classdef
+ gen = WSDL::SOAP::WSDL2Ruby.new
+ gen.location = pathname("rpc.wsdl")
+ gen.basedir = DIR
+ gen.logger.level = Logger::FATAL
+ gen.opt['classdef'] = nil
+ gen.opt['force'] = true
+ gen.run
+ require pathname('echo')
+ end
+
+ def teardown_server
+ @server.shutdown
+ @server_thread.kill
+ @server_thread.join
+ end
+
+ def start_server_thread(server)
+ t = Thread.new {
+ Thread.current.abort_on_exception = true
+ server.start
+ }
+ t
+ end
+
+ def pathname(filename)
+ File.join(DIR, filename)
+ end
+
+ def test_wsdl
+ wsdl = File.join(DIR, 'rpc.wsdl')
+ @client = ::SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
+ @client.endpoint_url = "http://localhost:#{Port}/"
+ @client.wiredump_dev = STDOUT if $DEBUG
+
+ ret = @client.echo(Person.new("normal", "", 12), Person.new("Hi", "Na", 21))
+ assert_equal(Person, ret.class)
+ assert_equal("Hi", ret.family_name)
+ assert_equal("Na", ret.given_name)
+ assert_equal(21, ret.age)
+
+ ret = @client.echo(Person.new("dummy", "", 12), Person.new("Hi", "Na", 21))
+ assert_equal(Person, ret.class)
+ assert_equal("family-name", ret.family_name)
+ assert_equal("given_name", ret.given_name)
+ assert_equal(nil, ret.age)
+
+ ret = @client.echo_err(Person.new("Na", "Hi"), Person.new("Hi", "Na"))
+ assert_equal(Person, ret.class)
+ assert_equal("58", ret.given_name)
+ assert_equal(nil, ret.family_name)
+ assert_equal(nil, ret.age)
+ end
+end
+
+
+end; end