1 from cherrypy.test import test
2 test.prefer_parent_path()
3 import xmlrpclib
4
5 import cherrypy
6
7
9 from cherrypy import _cptools
10
11 class Root:
12 def index(self):
13 return "I'm a standard index!"
14 index.exposed = True
15
16
17 class XmlRpc(_cptools.XMLRPCController):
18
19 def foo(self):
20 return "Hello world!"
21 foo.exposed = True
22
23 def return_single_item_list(self):
24 return [42]
25 return_single_item_list.exposed = True
26
27 def return_string(self):
28 return "here is a string"
29 return_string.exposed = True
30
31 def return_tuple(self):
32 return ('here', 'is', 1, 'tuple')
33 return_tuple.exposed = True
34
35 def return_dict(self):
36 return dict(a=1, b=2, c=3)
37 return_dict.exposed = True
38
39 def return_composite(self):
40 return dict(a=1,z=26), 'hi', ['welcome', 'friend']
41 return_composite.exposed = True
42
43 def return_int(self):
44 return 42
45 return_int.exposed = True
46
47 def return_float(self):
48 return 3.14
49 return_float.exposed = True
50
51 def return_datetime(self):
52 return xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1))
53 return_datetime.exposed = True
54
55 def return_boolean(self):
56 return True
57 return_boolean.exposed = True
58
59 def test_argument_passing(self, num):
60 return num * 2
61 test_argument_passing.exposed = True
62
63 def test_returning_Fault(self):
64 return xmlrpclib.Fault(1, "custom Fault response")
65 test_returning_Fault.exposed = True
66
67 root = Root()
68 root.xmlrpc = XmlRpc()
69 cherrypy.tree.mount(root, config={'/': {
70 'request.dispatch': cherrypy.dispatch.XMLRPCDispatcher(),
71 'tools.xmlrpc.allow_none': 0,
72 }})
73 cherrypy.config.update({'environment': 'test_suite'})
74
75
77 """Subclass of SafeTransport to fix sock.recv errors (by using file)."""
78
79 - def request(self, host, handler, request_body, verbose=0):
80
81 h = self.make_connection(host)
82 if verbose:
83 h.set_debuglevel(1)
84
85 self.send_request(h, handler, request_body)
86 self.send_host(h, host)
87 self.send_user_agent(h)
88 self.send_content(h, request_body)
89
90 errcode, errmsg, headers = h.getreply()
91 if errcode != 200:
92 raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg,
93 headers)
94
95 self.verbose = verbose
96
97
98
99
100
101
102
103
104 return self.parse_response(h.getfile())
105
106
107 from cherrypy.test import helper
108
111
112
113 scheme = "http"
114 try:
115 scheme = self.harness.scheme
116 except AttributeError:
117 pass
118
119 if scheme == "https":
120 url = 'https://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
121 proxy = xmlrpclib.ServerProxy(url, transport=HTTPSTransport())
122 else:
123 url = 'http://%s:%s/xmlrpc/' % (self.interface(), self.PORT)
124 proxy = xmlrpclib.ServerProxy(url)
125
126
127 self.getPage("/xmlrpc/foo")
128 self.assertBody("Hello world!")
129
130 self.assertEqual(proxy.return_single_item_list(), [42])
131 self.assertNotEqual(proxy.return_single_item_list(), 'one bazillion')
132 self.assertEqual(proxy.return_string(), "here is a string")
133 self.assertEqual(proxy.return_tuple(), list(('here', 'is', 1, 'tuple')))
134 self.assertEqual(proxy.return_dict(), {'a': 1, 'c': 3, 'b': 2})
135 self.assertEqual(proxy.return_composite(),
136 [{'a': 1, 'z': 26}, 'hi', ['welcome', 'friend']])
137 self.assertEqual(proxy.return_int(), 42)
138 self.assertEqual(proxy.return_float(), 3.14)
139 self.assertEqual(proxy.return_datetime(),
140 xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1)))
141 self.assertEqual(proxy.return_boolean(), True)
142 self.assertEqual(proxy.test_argument_passing(22), 22 * 2)
143
144
145 try:
146 proxy.test_argument_passing({})
147 except Exception, x:
148 self.assertEqual(x.__class__, xmlrpclib.Fault)
149 self.assertEqual(x.faultString, ("unsupported operand type(s) "
150 "for *: 'dict' and 'int'"))
151 else:
152 self.fail("Expected xmlrpclib.Fault")
153
154
155
156 try:
157 proxy.non_method()
158 except Exception, x:
159 self.assertEqual(x.__class__, xmlrpclib.Fault)
160 self.assertEqual(x.faultString, 'method "non_method" is not supported')
161 else:
162 self.fail("Expected xmlrpclib.Fault")
163
164
165 try:
166 proxy.test_returning_Fault()
167 except Exception, x:
168 self.assertEqual(x.__class__, xmlrpclib.Fault)
169 self.assertEqual(x.faultString, ("custom Fault response"))
170 else:
171 self.fail("Expected xmlrpclib.Fault")
172
173
174 if __name__ == '__main__':
175 setup_server()
176 helper.testmain()
177