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 return_single_item_list(self):
20 return [42]
21 return_single_item_list.exposed = True
22
23 def return_string(self):
24 return "here is a string"
25 return_string.exposed = True
26
27 def return_tuple(self):
28 return ('here', 'is', 1, 'tuple')
29 return_tuple.exposed = True
30
31 def return_dict(self):
32 return dict(a=1, b=2, c=3)
33 return_dict.exposed = True
34
35 def return_composite(self):
36 return dict(a=1,z=26), 'hi', ['welcome', 'friend']
37 return_composite.exposed = True
38
39 def return_int(self):
40 return 42
41 return_int.exposed = True
42
43 def return_float(self):
44 return 3.14
45 return_float.exposed = True
46
47 def return_datetime(self):
48 return xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1))
49 return_datetime.exposed = True
50
51 def return_boolean(self):
52 return True
53 return_boolean.exposed = True
54
55 def test_argument_passing(self, num):
56 return num * 2
57 test_argument_passing.exposed = True
58
59 root = Root()
60 root.xmlrpc = XmlRpc()
61 cherrypy.tree.mount(root, config={'/': {
62 'request.dispatch': cherrypy.dispatch.XMLRPCDispatcher(),
63 }})
64 cherrypy.config.update({'environment': 'test_suite'})
65
66
68 """Subclass of SafeTransport to fix sock.recv errors (by using file)."""
69
70 - def request(self, host, handler, request_body, verbose=0):
71
72 h = self.make_connection(host)
73 if verbose:
74 h.set_debuglevel(1)
75
76 self.send_request(h, handler, request_body)
77 self.send_host(h, host)
78 self.send_user_agent(h)
79 self.send_content(h, request_body)
80
81 errcode, errmsg, headers = h.getreply()
82 if errcode != 200:
83 raise xmlrpclib.ProtocolError(host + handler, errcode, errmsg,
84 headers)
85
86 self.verbose = verbose
87 return self.parse_response(h.getfile())
88
89
90 from cherrypy.test import helper
91
94
95
96 if getattr(self.harness, "scheme", "http") == "https":
97 url = 'https://%s:%s/xmlrpc/' % (self.HOST, self.PORT)
98 proxy = xmlrpclib.ServerProxy(url, transport=HTTPSTransport())
99 else:
100 url = 'http://%s:%s/xmlrpc/' % (self.HOST, self.PORT)
101 proxy = xmlrpclib.ServerProxy(url)
102
103
104 self.assertEqual(proxy.return_single_item_list(), [42])
105 self.assertNotEqual(proxy.return_single_item_list(), 'one bazillion')
106 self.assertEqual(proxy.return_string(), "here is a string")
107 self.assertEqual(proxy.return_tuple(), list(('here', 'is', 1, 'tuple')))
108 self.assertEqual(proxy.return_dict(), {'a': 1, 'c': 3, 'b': 2})
109 self.assertEqual(proxy.return_composite(),
110 [{'a': 1, 'z': 26}, 'hi', ['welcome', 'friend']])
111 self.assertEqual(proxy.return_int(), 42)
112 self.assertEqual(proxy.return_float(), 3.14)
113 self.assertEqual(proxy.return_datetime(),
114 xmlrpclib.DateTime((2003, 10, 7, 8, 1, 0, 1, 280, -1)))
115 self.assertEqual(proxy.return_boolean(), True)
116 self.assertEqual(proxy.test_argument_passing(22), 22 * 2)
117
118
119 try:
120 proxy.test_argument_passing({})
121 except Exception, x:
122 self.assertEqual(x.__class__, xmlrpclib.Fault)
123 self.assertEqual(x.faultString, ("unsupported operand type(s) "
124 "for *: 'dict' and 'int'"))
125 else:
126 self.fail("Expected xmlrpclib.Fault")
127
128
129
130 try:
131 proxy.non_method()
132 except Exception, x:
133 self.assertEqual(x.__class__, xmlrpclib.Fault)
134 self.assertEqual(x.faultString, 'method "non_method" is not supported')
135 else:
136 self.fail("Expected xmlrpclib.Fault")
137
138
139 if __name__ == '__main__':
140 setup_server()
141 helper.testmain()
142