1
from cherrypy.test import test
2
test.prefer_parent_path()
9
from cherrypy import _cptools
13
return "I'm a standard index!"
17
class XmlRpc(_cptools.XMLRPCController):
23
def return_single_item_list(self):
25
return_single_item_list.exposed = True
27
def return_string(self):
28
return "here is a string"
29
return_string.exposed = True
31
def return_tuple(self):
32
return ('here', 'is', 1, 'tuple')
33
return_tuple.exposed = True
35
def return_dict(self):
36
return dict(a=1, b=2, c=3)
37
return_dict.exposed = True
39
def return_composite(self):
40
return dict(a=1,z=26), 'hi', ['welcome', 'friend']
41
return_composite.exposed = True
45
return_int.exposed = True
47
def return_float(self):
49
return_float.exposed = True
51
def return_datetime(self):
52
return xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1))
53
return_datetime.exposed = True
55
def return_boolean(self):
57
return_boolean.exposed = True
59
def test_argument_passing(self, num):
61
test_argument_passing.exposed = True
63
def test_returning_Fault(self):
64
return xmlrpclib.Fault(1, "custom Fault response")
65
test_returning_Fault.exposed = True
68
root.xmlrpc = XmlRpc()
69
cherrypy.tree.mount(root, config={'/': {
70
'request.dispatch': cherrypy.dispatch.XMLRPCDispatcher(),
71
'tools.xmlrpc.allow_none': 0,
75
class HTTPSTransport(xmlrpclib.SafeTransport):
76
"""Subclass of SafeTransport to fix sock.recv errors (by using file)."""
78
def request(self, host, handler, request_body, verbose=0):
79
# issue XML-RPC request
80
h = self.make_connection(host)
84
self.send_request(h, handler, request_body)
85
self.send_host(h, host)
86
self.send_user_agent(h)
87
self.send_content(h, request_body)
89
errcode, errmsg, headers = h.getreply()
91
raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg,
94
self.verbose = verbose
96
# Here's where we differ from the superclass. It says:
99
# except AttributeError:
101
# return self._parse_response(h.getfile(), sock)
103
return self.parse_response(h.getfile())
106
from cherrypy.test import helper
108
class XmlRpcTest(helper.CPWebCase):
109
def testXmlRpc(self):
111
# load the appropriate xmlrpc proxy
114
scheme = self.harness.scheme
115
except AttributeError:
118
if scheme == "https":
119
url = 'https://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
120
proxy = xmlrpclib.ServerProxy(url, transport=HTTPSTransport())
122
url = 'http://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
123
proxy = xmlrpclib.ServerProxy(url)
125
# begin the tests ...
126
self.getPage("/xmlrpc/foo")
127
self.assertBody("Hello world!")
129
self.assertEqual(proxy.return_single_item_list(), [42])
130
self.assertNotEqual(proxy.return_single_item_list(), 'one bazillion')
131
self.assertEqual(proxy.return_string(), "here is a string")
132
self.assertEqual(proxy.return_tuple(), list(('here', 'is', 1, 'tuple')))
133
self.assertEqual(proxy.return_dict(), {'a': 1, 'c': 3, 'b': 2})
134
self.assertEqual(proxy.return_composite(),
135
[{'a': 1, 'z': 26}, 'hi', ['welcome', 'friend']])
136
self.assertEqual(proxy.return_int(), 42)
137
self.assertEqual(proxy.return_float(), 3.14)
138
self.assertEqual(proxy.return_datetime(),
139
xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1)))
140
self.assertEqual(proxy.return_boolean(), True)
141
self.assertEqual(proxy.test_argument_passing(22), 22 * 2)
143
# Test an error in the page handler (should raise an xmlrpclib.Fault)
145
proxy.test_argument_passing({})
147
self.assertEqual(x.__class__, xmlrpclib.Fault)
148
self.assertEqual(x.faultString, ("unsupported operand type(s) "
149
"for *: 'dict' and 'int'"))
151
self.fail("Expected xmlrpclib.Fault")
153
# http://www.cherrypy.org/ticket/533
154
# if a method is not found, an xmlrpclib.Fault should be raised
158
self.assertEqual(x.__class__, xmlrpclib.Fault)
159
self.assertEqual(x.faultString, 'method "non_method" is not supported')
161
self.fail("Expected xmlrpclib.Fault")
163
# Test returning a Fault from the page handler.
165
proxy.test_returning_Fault()
167
self.assertEqual(x.__class__, xmlrpclib.Fault)
168
self.assertEqual(x.faultString, ("custom Fault response"))
170
self.fail("Expected xmlrpclib.Fault")
173
if __name__ == '__main__':