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

Source Code for Module cherrypy.test.test_xmlrpc

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