blob: 9282581a827018fb920eb3d5a28b82cad94a251f [file] [log] [blame]
Facundo Batista5a3b5242007-07-13 10:43:44 +00001import base64
Fred Drakeba613c32005-02-10 18:33:30 +00002import datetime
Skip Montanaro3e7bba92001-10-19 16:06:52 +00003import sys
Facundo Batista5a3b5242007-07-13 10:43:44 +00004import time
Skip Montanaro419abda2001-10-01 17:47:44 +00005import unittest
6import xmlrpclib
Facundo Batistaa53872b2007-08-14 13:35:00 +00007import SimpleXMLRPCServer
8import threading
Facundo Batista7f686fc2007-08-17 19:16:44 +00009import mimetools
Barry Warsaw04f357c2002-07-23 19:04:11 +000010from test import test_support
Skip Montanaro419abda2001-10-01 17:47:44 +000011
Fred Drake22c07062005-02-11 17:59:08 +000012try:
13 unicode
14except NameError:
15 have_unicode = False
16else:
17 have_unicode = True
18
Skip Montanaro419abda2001-10-01 17:47:44 +000019alist = [{'astring': 'foo@bar.baz.spam',
20 'afloat': 7283.43,
Skip Montanaro3e7bba92001-10-19 16:06:52 +000021 'anint': 2**20,
22 'ashortlong': 2L,
Skip Montanaro419abda2001-10-01 17:47:44 +000023 'anotherlist': ['.zyx.41'],
24 'abase64': xmlrpclib.Binary("my dog has fleas"),
25 'boolean': xmlrpclib.False,
Andrew M. Kuchlingb12d97c2004-06-05 12:33:27 +000026 'unicode': u'\u4000\u6000\u8000',
27 u'ukey\u4000': 'regular value',
Fred Drakeba613c32005-02-10 18:33:30 +000028 'datetime1': xmlrpclib.DateTime('20050210T11:41:23'),
29 'datetime2': xmlrpclib.DateTime(
30 (2005, 02, 10, 11, 41, 23, 0, 1, -1)),
31 'datetime3': xmlrpclib.DateTime(
32 datetime.datetime(2005, 02, 10, 11, 41, 23)),
Facundo Batista5a3b5242007-07-13 10:43:44 +000033 'datetime4': xmlrpclib.DateTime(
34 datetime.date(2005, 02, 10)),
35 'datetime5': xmlrpclib.DateTime(
36 datetime.time(11, 41, 23)),
Skip Montanaro419abda2001-10-01 17:47:44 +000037 }]
38
39class XMLRPCTestCase(unittest.TestCase):
40
41 def test_dump_load(self):
42 self.assertEquals(alist,
43 xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0])
44
Fred Drakeba613c32005-02-10 18:33:30 +000045 def test_dump_bare_datetime(self):
Skip Montanaro174dd222005-05-14 20:54:16 +000046 # This checks that an unwrapped datetime.date object can be handled
47 # by the marshalling code. This can't be done via test_dump_load()
48 # since with use_datetime set to 1 the unmarshaller would create
49 # datetime objects for the 'datetime[123]' keys as well
Fred Drakeba613c32005-02-10 18:33:30 +000050 dt = datetime.datetime(2005, 02, 10, 11, 41, 23)
51 s = xmlrpclib.dumps((dt,))
Skip Montanaro174dd222005-05-14 20:54:16 +000052 (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
53 self.assertEquals(newdt, dt)
Fred Drakeba613c32005-02-10 18:33:30 +000054 self.assertEquals(m, None)
55
Skip Montanaro174dd222005-05-14 20:54:16 +000056 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
57 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23'))
58
59 def test_dump_bare_date(self):
60 # This checks that an unwrapped datetime.date object can be handled
61 # by the marshalling code. This can't be done via test_dump_load()
62 # since the unmarshaller produces a datetime object
63 d = datetime.datetime(2005, 02, 10, 11, 41, 23).date()
64 s = xmlrpclib.dumps((d,))
65 (newd,), m = xmlrpclib.loads(s, use_datetime=1)
66 self.assertEquals(newd.date(), d)
67 self.assertEquals(newd.time(), datetime.time(0, 0, 0))
68 self.assertEquals(m, None)
69
70 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
71 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00'))
72
73 def test_dump_bare_time(self):
74 # This checks that an unwrapped datetime.time object can be handled
75 # by the marshalling code. This can't be done via test_dump_load()
76 # since the unmarshaller produces a datetime object
77 t = datetime.datetime(2005, 02, 10, 11, 41, 23).time()
78 s = xmlrpclib.dumps((t,))
79 (newt,), m = xmlrpclib.loads(s, use_datetime=1)
80 today = datetime.datetime.now().date().strftime("%Y%m%d")
81 self.assertEquals(newt.time(), t)
82 self.assertEquals(newt.date(), datetime.datetime.now().date())
83 self.assertEquals(m, None)
84
85 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
86 self.assertEquals(newdt, xmlrpclib.DateTime('%sT11:41:23'%today))
87
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000088 def test_bug_1164912 (self):
89 d = xmlrpclib.DateTime()
Tim Peters536cf992005-12-25 23:18:31 +000090 ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,),
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000091 methodresponse=True))
92 self.assert_(isinstance(new_d.value, str))
93
94 # Check that the output of dumps() is still an 8-bit string
95 s = xmlrpclib.dumps((new_d,), methodresponse=True)
96 self.assert_(isinstance(s, str))
97
Martin v. Löwis07529352006-11-19 18:51:54 +000098 def test_newstyle_class(self):
99 class T(object):
100 pass
101 t = T()
102 t.x = 100
103 t.y = "Hello"
104 ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
105 self.assertEquals(t2, t.__dict__)
106
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000107 def test_dump_big_long(self):
108 self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,))
109
110 def test_dump_bad_dict(self):
111 self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},))
112
Facundo Batista5a3b5242007-07-13 10:43:44 +0000113 def test_dump_recursive_seq(self):
114 l = [1,2,3]
115 t = [3,4,5,l]
116 l.append(t)
117 self.assertRaises(TypeError, xmlrpclib.dumps, (l,))
118
119 def test_dump_recursive_dict(self):
120 d = {'1':1, '2':1}
121 t = {'3':3, 'd':d}
122 d['t'] = t
123 self.assertRaises(TypeError, xmlrpclib.dumps, (d,))
124
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000125 def test_dump_big_int(self):
126 if sys.maxint > 2L**31-1:
127 self.assertRaises(OverflowError, xmlrpclib.dumps,
128 (int(2L**34),))
129
Facundo Batista5a3b5242007-07-13 10:43:44 +0000130 xmlrpclib.dumps((xmlrpclib.MAXINT, xmlrpclib.MININT))
131 self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MAXINT+1,))
132 self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MININT-1,))
133
134 def dummy_write(s):
135 pass
136
137 m = xmlrpclib.Marshaller()
138 m.dump_int(xmlrpclib.MAXINT, dummy_write)
139 m.dump_int(xmlrpclib.MININT, dummy_write)
140 self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MAXINT+1, dummy_write)
141 self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MININT-1, dummy_write)
142
143
Andrew M. Kuchling0b852032003-04-25 00:27:24 +0000144 def test_dump_none(self):
145 value = alist + [None]
146 arg1 = (alist + [None],)
147 strg = xmlrpclib.dumps(arg1, allow_none=True)
148 self.assertEquals(value,
149 xmlrpclib.loads(strg)[0][0])
150 self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
151
Fred Drake22c07062005-02-11 17:59:08 +0000152 def test_default_encoding_issues(self):
153 # SF bug #1115989: wrong decoding in '_stringify'
154 utf8 = """<?xml version='1.0' encoding='iso-8859-1'?>
155 <params>
156 <param><value>
157 <string>abc \x95</string>
158 </value></param>
159 <param><value>
160 <struct>
161 <member>
162 <name>def \x96</name>
163 <value><string>ghi \x97</string></value>
164 </member>
165 </struct>
166 </value></param>
167 </params>
168 """
Tim Petersf754f5f2005-04-08 18:00:59 +0000169
170 # sys.setdefaultencoding() normally doesn't exist after site.py is
171 # loaded. reload(sys) is the way to get it back.
Fred Drake22c07062005-02-11 17:59:08 +0000172 old_encoding = sys.getdefaultencoding()
Tim Petersf754f5f2005-04-08 18:00:59 +0000173 setdefaultencoding_existed = hasattr(sys, "setdefaultencoding")
Fred Drake22c07062005-02-11 17:59:08 +0000174 reload(sys) # ugh!
175 sys.setdefaultencoding("iso-8859-1")
176 try:
177 (s, d), m = xmlrpclib.loads(utf8)
178 finally:
179 sys.setdefaultencoding(old_encoding)
Tim Petersf754f5f2005-04-08 18:00:59 +0000180 if not setdefaultencoding_existed:
181 del sys.setdefaultencoding
182
Fred Drake22c07062005-02-11 17:59:08 +0000183 items = d.items()
184 if have_unicode:
185 self.assertEquals(s, u"abc \x95")
186 self.assert_(isinstance(s, unicode))
187 self.assertEquals(items, [(u"def \x96", u"ghi \x97")])
188 self.assert_(isinstance(items[0][0], unicode))
189 self.assert_(isinstance(items[0][1], unicode))
190 else:
191 self.assertEquals(s, "abc \xc2\x95")
192 self.assertEquals(items, [("def \xc2\x96", "ghi \xc2\x97")])
193
Facundo Batista5a3b5242007-07-13 10:43:44 +0000194
195class HelperTestCase(unittest.TestCase):
196 def test_escape(self):
197 self.assertEqual(xmlrpclib.escape("a&b"), "a&amp;b")
198 self.assertEqual(xmlrpclib.escape("a<b"), "a&lt;b")
199 self.assertEqual(xmlrpclib.escape("a>b"), "a&gt;b")
200
201class FaultTestCase(unittest.TestCase):
202 def test_repr(self):
203 f = xmlrpclib.Fault(42, 'Test Fault')
204 self.assertEqual(repr(f), "<Fault 42: 'Test Fault'>")
205 self.assertEqual(repr(f), str(f))
206
207 def test_dump_fault(self):
208 f = xmlrpclib.Fault(42, 'Test Fault')
209 s = xmlrpclib.dumps((f,))
210 (newf,), m = xmlrpclib.loads(s)
211 self.assertEquals(newf, {'faultCode': 42, 'faultString': 'Test Fault'})
212 self.assertEquals(m, None)
213
214 s = xmlrpclib.Marshaller().dumps(f)
215 self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s)
216
217
218class DateTimeTestCase(unittest.TestCase):
219 def test_default(self):
220 t = xmlrpclib.DateTime()
221
222 def test_time(self):
223 d = 1181399930.036952
224 t = xmlrpclib.DateTime(d)
225 self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", time.localtime(d)))
226
227 def test_time_tuple(self):
228 d = (2007,6,9,10,38,50,5,160,0)
229 t = xmlrpclib.DateTime(d)
230 self.assertEqual(str(t), '20070609T10:38:50')
231
232 def test_time_struct(self):
233 d = time.localtime(1181399930.036952)
234 t = xmlrpclib.DateTime(d)
235 self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", d))
236
237 def test_datetime_datetime(self):
238 d = datetime.datetime(2007,1,2,3,4,5)
239 t = xmlrpclib.DateTime(d)
240 self.assertEqual(str(t), '20070102T03:04:05')
241
242 def test_datetime_date(self):
243 d = datetime.date(2007,9,8)
244 t = xmlrpclib.DateTime(d)
245 self.assertEqual(str(t), '20070908T00:00:00')
246
247 def test_datetime_time(self):
248 d = datetime.time(13,17,19)
249 # allow for date rollover by checking today's or tomorrow's dates
250 dd1 = datetime.datetime.now().date()
251 dd2 = dd1 + datetime.timedelta(days=1)
252 vals = (dd1.strftime('%Y%m%dT13:17:19'),
253 dd2.strftime('%Y%m%dT13:17:19'))
254 t = xmlrpclib.DateTime(d)
255 self.assertEqual(str(t) in vals, True)
256
257 def test_repr(self):
258 d = datetime.datetime(2007,1,2,3,4,5)
259 t = xmlrpclib.DateTime(d)
260 val ="<DateTime '20070102T03:04:05' at %x>" % id(t)
261 self.assertEqual(repr(t), val)
262
263 def test_decode(self):
264 d = ' 20070908T07:11:13 '
265 t1 = xmlrpclib.DateTime()
266 t1.decode(d)
267 tref = xmlrpclib.DateTime(datetime.datetime(2007,9,8,7,11,13))
268 self.assertEqual(t1, tref)
269
270 t2 = xmlrpclib._datetime(d)
271 self.assertEqual(t1, tref)
272
273class BinaryTestCase(unittest.TestCase):
274 def test_default(self):
275 t = xmlrpclib.Binary()
276 self.assertEqual(str(t), '')
277
278 def test_string(self):
279 d = '\x01\x02\x03abc123\xff\xfe'
280 t = xmlrpclib.Binary(d)
281 self.assertEqual(str(t), d)
282
283 def test_decode(self):
284 d = '\x01\x02\x03abc123\xff\xfe'
285 de = base64.encodestring(d)
286 t1 = xmlrpclib.Binary()
287 t1.decode(de)
288 self.assertEqual(str(t1), d)
289
290 t2 = xmlrpclib._binary(de)
291 self.assertEqual(str(t2), d)
292
293
Facundo Batistaa53872b2007-08-14 13:35:00 +0000294PORT = None
Skip Montanaro419abda2001-10-01 17:47:44 +0000295
Facundo Batistaa53872b2007-08-14 13:35:00 +0000296def http_server(evt, numrequests):
297 class TestInstanceClass:
298 def div(self, x, y):
299 '''This is the div function'''
300 return x // y
301
Facundo Batistaa53872b2007-08-14 13:35:00 +0000302 try:
Facundo Batista7f686fc2007-08-17 19:16:44 +0000303 serv = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0),
304 logRequests=False, bind_and_activate=False)
Facundo Batistaa53872b2007-08-14 13:35:00 +0000305 serv.socket.settimeout(3)
306 serv.server_bind()
307 global PORT
308 PORT = serv.socket.getsockname()[1]
309 serv.server_activate()
310 serv.register_introspection_functions()
311 serv.register_multicall_functions()
312 serv.register_function(pow)
313 serv.register_function(lambda x,y: x+y, 'add')
314 serv.register_instance(TestInstanceClass())
315
316 # handle up to 'numrequests' requests
317 while numrequests > 0:
318 serv.handle_request()
319 numrequests -= 1
320
321 except socket.timeout:
322 pass
323 finally:
324 serv.socket.close()
325 PORT = None
326 evt.set()
327
328
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000329def is_unavailable_exception(e):
330 '''Returns True if the given ProtocolError is the product of a server-side
331 exception caused by the 'temporarily unavailable' response sometimes
332 given by operations on non-blocking sockets.'''
333 # sometimes we get a -1 error code and/or empty headers
334 if e.errcode == -1 or e.headers is None:
335 return True
336
337 exc_mess = e.headers.get('X-exception')
338 if exc_mess and 'temporarily unavailable' in exc_mess.lower():
339 return True
340
341 return False
342
343# NOTE: The tests in SimpleServerTestCase will ignore failures caused by
344# "temporarily unavailable" exceptions raised in SimpleXMLRPCServer. This
345# condition occurs infrequently on some platforms, frequently on others, and
346# is apparently caused by using SimpleXMLRPCServer with a non-blocking socket.
347# If the server class is updated at some point in the future to handle this
348# situation more gracefully, these tests should be modified appropriately.
349
Facundo Batista7f686fc2007-08-17 19:16:44 +0000350class SimpleServerTestCase(unittest.TestCase):
Facundo Batistaa53872b2007-08-14 13:35:00 +0000351 def setUp(self):
Facundo Batista7f686fc2007-08-17 19:16:44 +0000352 # enable traceback reporting
353 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
354
Facundo Batistaa53872b2007-08-14 13:35:00 +0000355 self.evt = threading.Event()
Facundo Batista7f686fc2007-08-17 19:16:44 +0000356 # start server thread to handle requests
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000357 serv_args = (self.evt, 1)
Facundo Batista7f686fc2007-08-17 19:16:44 +0000358 threading.Thread(target=http_server, args=serv_args).start()
Facundo Batistaa53872b2007-08-14 13:35:00 +0000359
360 # wait for port to be assigned to server
361 n = 1000
362 while n > 0 and PORT is None:
363 time.sleep(0.001)
364 n -= 1
365
366 time.sleep(0.5)
367
368 def tearDown(self):
369 # wait on the server thread to terminate
370 self.evt.wait()
371
Facundo Batista7f686fc2007-08-17 19:16:44 +0000372 # disable traceback reporting
373 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False
374
Facundo Batistaa53872b2007-08-14 13:35:00 +0000375 def test_simple1(self):
Facundo Batistac65a5f12007-08-21 00:16:21 +0000376 try:
377 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
378 self.assertEqual(p.pow(6,8), 6**8)
379 except xmlrpclib.ProtocolError, e:
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000380 # ignore failures due to non-blocking socket 'unavailable' errors
381 if not is_unavailable_exception(e):
382 # protocol error; provide additional information in test output
383 self.fail("%s\n%s" % (e, e.headers))
Facundo Batistaa53872b2007-08-14 13:35:00 +0000384
385 def test_introspection1(self):
Facundo Batistac65a5f12007-08-21 00:16:21 +0000386 try:
387 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
388 meth = p.system.listMethods()
389 expected_methods = set(['pow', 'div', 'add', 'system.listMethods',
390 'system.methodHelp', 'system.methodSignature', 'system.multicall'])
391 self.assertEqual(set(meth), expected_methods)
392 except xmlrpclib.ProtocolError, e:
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000393 # ignore failures due to non-blocking socket 'unavailable' errors
394 if not is_unavailable_exception(e):
395 # protocol error; provide additional information in test output
396 self.fail("%s\n%s" % (e, e.headers))
Facundo Batistaa53872b2007-08-14 13:35:00 +0000397
398 def test_introspection2(self):
Facundo Batistac65a5f12007-08-21 00:16:21 +0000399 try:
400 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
401 divhelp = p.system.methodHelp('div')
402 self.assertEqual(divhelp, 'This is the div function')
403 except xmlrpclib.ProtocolError, e:
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000404 # ignore failures due to non-blocking socket 'unavailable' errors
405 if not is_unavailable_exception(e):
406 # protocol error; provide additional information in test output
407 self.fail("%s\n%s" % (e, e.headers))
Facundo Batistaa53872b2007-08-14 13:35:00 +0000408
409 def test_introspection3(self):
410 # the SimpleXMLRPCServer doesn't support signatures, but
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000411 # at least check that we can try making the call
Facundo Batistac65a5f12007-08-21 00:16:21 +0000412 try:
413 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
414 divsig = p.system.methodSignature('div')
415 self.assertEqual(divsig, 'signatures not supported')
416 except xmlrpclib.ProtocolError, e:
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000417 # ignore failures due to non-blocking socket 'unavailable' errors
418 if not is_unavailable_exception(e):
419 # protocol error; provide additional information in test output
420 self.fail("%s\n%s" % (e, e.headers))
Facundo Batistaa53872b2007-08-14 13:35:00 +0000421
422 def test_multicall(self):
Facundo Batistac65a5f12007-08-21 00:16:21 +0000423 try:
424 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
425 multicall = xmlrpclib.MultiCall(p)
426 multicall.add(2,3)
427 multicall.pow(6,8)
428 multicall.div(127,42)
429 add_result, pow_result, div_result = multicall()
430 self.assertEqual(add_result, 2+3)
431 self.assertEqual(pow_result, 6**8)
432 self.assertEqual(div_result, 127//42)
433 except xmlrpclib.ProtocolError, e:
Facundo Batistaf91ad6a2007-08-27 01:15:34 +0000434 # ignore failures due to non-blocking socket 'unavailable' errors
435 if not is_unavailable_exception(e):
436 # protocol error; provide additional information in test output
437 self.fail("%s\n%s" % (e, e.headers))
Facundo Batistaa53872b2007-08-14 13:35:00 +0000438
439
Facundo Batista7f686fc2007-08-17 19:16:44 +0000440# This is a contrived way to make a failure occur on the server side
441# in order to test the _send_traceback_header flag on the server
442class FailingMessageClass(mimetools.Message):
443 def __getitem__(self, key):
444 key = key.lower()
445 if key == 'content-length':
446 return 'I am broken'
447 return mimetools.Message.__getitem__(self, key)
448
449
450class FailingServerTestCase(unittest.TestCase):
451 def setUp(self):
452 self.evt = threading.Event()
453 # start server thread to handle requests
454 serv_args = (self.evt, 2)
455 threading.Thread(target=http_server, args=serv_args).start()
456
457 # wait for port to be assigned to server
458 n = 1000
459 while n > 0 and PORT is None:
460 time.sleep(0.001)
461 n -= 1
462
463 time.sleep(0.5)
464
465 def tearDown(self):
466 # wait on the server thread to terminate
467 self.evt.wait()
468 # reset flag
469 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False
470 # reset message class
471 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = mimetools.Message
472
473 def test_basic(self):
474 # check that flag is false by default
475 flagval = SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header
476 self.assertEqual(flagval, False)
477
Facundo Batistac65a5f12007-08-21 00:16:21 +0000478 # enable traceback reporting
479 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
480
481 # test a call that shouldn't fail just as a smoke test
482 try:
483 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
484 self.assertEqual(p.pow(6,8), 6**8)
485 except xmlrpclib.ProtocolError, e:
486 # protocol error; provide additional information in test output
487 self.fail("%s\n%s" % (e, e.headers))
Facundo Batista7f686fc2007-08-17 19:16:44 +0000488
489 def test_fail_no_info(self):
490 # use the broken message class
491 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass
492
493 try:
494 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
495 p.pow(6,8)
496 except xmlrpclib.ProtocolError, e:
497 # The two server-side error headers shouldn't be sent back in this case
498 self.assertTrue(e.headers.get("X-exception") is None)
499 self.assertTrue(e.headers.get("X-traceback") is None)
500 else:
501 self.fail('ProtocolError not raised')
502
503 def test_fail_with_info(self):
504 # use the broken message class
505 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass
506
507 # Check that errors in the server send back exception/traceback
508 # info when flag is set
509 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
510
511 try:
512 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
513 p.pow(6,8)
514 except xmlrpclib.ProtocolError, e:
515 # We should get error info in the response
516 expected_err = "invalid literal for int() with base 10: 'I am broken'"
517 self.assertEqual(e.headers.get("x-exception"), expected_err)
518 self.assertTrue(e.headers.get("x-traceback") is not None)
519 else:
520 self.fail('ProtocolError not raised')
521
522
Facundo Batistaa53872b2007-08-14 13:35:00 +0000523def test_main():
524 xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
525 BinaryTestCase, FaultTestCase]
526
527 # The test cases against a SimpleXMLRPCServer raise a socket error
528 # 10035 (WSAEWOULDBLOCK) in the server thread handle_request call when
529 # run on Windows. This only happens on the first test to run, but it
530 # fails every time and so these tests are skipped on win32 platforms.
531 if sys.platform != 'win32':
Facundo Batista7f686fc2007-08-17 19:16:44 +0000532 xmlrpc_tests.append(SimpleServerTestCase)
533 xmlrpc_tests.append(FailingServerTestCase)
Facundo Batistaa53872b2007-08-14 13:35:00 +0000534
535 test_support.run_unittest(*xmlrpc_tests)
Skip Montanaro419abda2001-10-01 17:47:44 +0000536
537if __name__ == "__main__":
538 test_main()