Package cherrypy :: Package test :: Module test_xmlrpc
[hide private]
[frames] | no frames]

Source Code for Module cherrypy.test.test_xmlrpc

  1  from cherrypy.test import test 
  2  test.prefer_parent_path() 
  3  import xmlrpclib 
  4   
  5  import cherrypy 
  6   
  7   
8 -def setup_server():
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
76 -class HTTPSTransport(xmlrpclib.SafeTransport):
77 """Subclass of SafeTransport to fix sock.recv errors (by using file).""" 78
79 - def request(self, host, handler, request_body, verbose=0):
80 # issue XML-RPC request 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 # Here's where we differ from the superclass. It says: 98 # try: 99 # sock = h._conn.sock 100 # except AttributeError: 101 # sock = None 102 # return self._parse_response(h.getfile(), sock) 103 104 return self.parse_response(h.getfile())
105 106 107 from cherrypy.test import helper 108
109 -class XmlRpcTest(helper.CPWebCase):
110 - def testXmlRpc(self):
111 112 # load the appropriate xmlrpc proxy 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 # begin the tests ... 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 # Test an error in the page handler (should raise an xmlrpclib.Fault) 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 # http://www.cherrypy.org/ticket/533 155 # if a method is not found, an xmlrpclib.Fault should be raised 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 # Test returning a Fault from the page handler. 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