blob: e54ca19f93db88ff39d6ed7a473f9cea295acf99 [file] [log] [blame]
Guido van Rossumb5a755e2007-07-18 18:15:48 +00001import base64
Fred Drakeba613c32005-02-10 18:33:30 +00002import datetime
Skip Montanaro3e7bba92001-10-19 16:06:52 +00003import sys
Guido van Rossumb5a755e2007-07-18 18:15:48 +00004import time
Skip Montanaro419abda2001-10-01 17:47:44 +00005import unittest
6import xmlrpclib
Guido van Rossumaf554a02007-08-16 23:48:43 +00007import SimpleXMLRPCServer
8import threading
Guido van Rossum61e21b52007-08-20 19:06:03 +00009import mimetools
Barry Warsaw04f357c2002-07-23 19:04:11 +000010from test import test_support
Skip Montanaro419abda2001-10-01 17:47:44 +000011
12alist = [{'astring': 'foo@bar.baz.spam',
13 'afloat': 7283.43,
Skip Montanaro3e7bba92001-10-19 16:06:52 +000014 'anint': 2**20,
Guido van Rossume2a383d2007-01-15 16:59:06 +000015 'ashortlong': 2,
Skip Montanaro419abda2001-10-01 17:47:44 +000016 'anotherlist': ['.zyx.41'],
Guido van Rossum54a40cb2007-08-27 22:27:41 +000017 'abase64': xmlrpclib.Binary(b"my dog has fleas"),
Guido van Rossume7ba4952007-06-06 23:52:48 +000018 'boolean': False,
Guido van Rossumef87d6e2007-05-02 19:09:54 +000019 'unicode': '\u4000\u6000\u8000',
20 'ukey\u4000': 'regular value',
Fred Drakeba613c32005-02-10 18:33:30 +000021 'datetime1': xmlrpclib.DateTime('20050210T11:41:23'),
22 'datetime2': xmlrpclib.DateTime(
Guido van Rossumcd16bf62007-06-13 18:07:49 +000023 (2005, 2, 10, 11, 41, 23, 0, 1, -1)),
Fred Drakeba613c32005-02-10 18:33:30 +000024 'datetime3': xmlrpclib.DateTime(
Guido van Rossumcd16bf62007-06-13 18:07:49 +000025 datetime.datetime(2005, 2, 10, 11, 41, 23)),
Guido van Rossumb5a755e2007-07-18 18:15:48 +000026 'datetime4': xmlrpclib.DateTime(
27 datetime.date(2005, 2, 10)),
28 'datetime5': xmlrpclib.DateTime(
29 datetime.time(11, 41, 23)),
Skip Montanaro419abda2001-10-01 17:47:44 +000030 }]
31
32class XMLRPCTestCase(unittest.TestCase):
33
34 def test_dump_load(self):
Guido van Rossum54a40cb2007-08-27 22:27:41 +000035 dump = xmlrpclib.dumps((alist,))
36 load = xmlrpclib.loads(dump)
37 self.assertEquals(alist, load[0][0])
Skip Montanaro419abda2001-10-01 17:47:44 +000038
Fred Drakeba613c32005-02-10 18:33:30 +000039 def test_dump_bare_datetime(self):
Skip Montanaro174dd222005-05-14 20:54:16 +000040 # This checks that an unwrapped datetime.date object can be handled
41 # by the marshalling code. This can't be done via test_dump_load()
42 # since with use_datetime set to 1 the unmarshaller would create
43 # datetime objects for the 'datetime[123]' keys as well
Guido van Rossumcd16bf62007-06-13 18:07:49 +000044 dt = datetime.datetime(2005, 2, 10, 11, 41, 23)
Fred Drakeba613c32005-02-10 18:33:30 +000045 s = xmlrpclib.dumps((dt,))
Skip Montanaro174dd222005-05-14 20:54:16 +000046 (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
47 self.assertEquals(newdt, dt)
Fred Drakeba613c32005-02-10 18:33:30 +000048 self.assertEquals(m, None)
49
Skip Montanaro174dd222005-05-14 20:54:16 +000050 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
51 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23'))
52
53 def test_dump_bare_date(self):
54 # This checks that an unwrapped datetime.date object can be handled
55 # by the marshalling code. This can't be done via test_dump_load()
56 # since the unmarshaller produces a datetime object
Guido van Rossumcd16bf62007-06-13 18:07:49 +000057 d = datetime.datetime(2005, 2, 10, 11, 41, 23).date()
Skip Montanaro174dd222005-05-14 20:54:16 +000058 s = xmlrpclib.dumps((d,))
59 (newd,), m = xmlrpclib.loads(s, use_datetime=1)
60 self.assertEquals(newd.date(), d)
61 self.assertEquals(newd.time(), datetime.time(0, 0, 0))
62 self.assertEquals(m, None)
63
64 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
65 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00'))
66
67 def test_dump_bare_time(self):
68 # This checks that an unwrapped datetime.time object can be handled
69 # by the marshalling code. This can't be done via test_dump_load()
70 # since the unmarshaller produces a datetime object
Guido van Rossumcd16bf62007-06-13 18:07:49 +000071 t = datetime.datetime(2005, 2, 10, 11, 41, 23).time()
Skip Montanaro174dd222005-05-14 20:54:16 +000072 s = xmlrpclib.dumps((t,))
73 (newt,), m = xmlrpclib.loads(s, use_datetime=1)
74 today = datetime.datetime.now().date().strftime("%Y%m%d")
75 self.assertEquals(newt.time(), t)
76 self.assertEquals(newt.date(), datetime.datetime.now().date())
77 self.assertEquals(m, None)
78
79 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
80 self.assertEquals(newdt, xmlrpclib.DateTime('%sT11:41:23'%today))
81
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000082 def test_bug_1164912 (self):
83 d = xmlrpclib.DateTime()
Tim Peters536cf992005-12-25 23:18:31 +000084 ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,),
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000085 methodresponse=True))
86 self.assert_(isinstance(new_d.value, str))
87
88 # Check that the output of dumps() is still an 8-bit string
89 s = xmlrpclib.dumps((new_d,), methodresponse=True)
90 self.assert_(isinstance(s, str))
91
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 def test_newstyle_class(self):
93 class T(object):
94 pass
95 t = T()
96 t.x = 100
97 t.y = "Hello"
98 ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
99 self.assertEquals(t2, t.__dict__)
100
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000101 def test_dump_big_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000102 self.assertRaises(OverflowError, xmlrpclib.dumps, (2**99,))
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000103
104 def test_dump_bad_dict(self):
105 self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},))
106
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000107 def test_dump_recursive_seq(self):
108 l = [1,2,3]
109 t = [3,4,5,l]
110 l.append(t)
111 self.assertRaises(TypeError, xmlrpclib.dumps, (l,))
112
113 def test_dump_recursive_dict(self):
114 d = {'1':1, '2':1}
115 t = {'3':3, 'd':d}
116 d['t'] = t
117 self.assertRaises(TypeError, xmlrpclib.dumps, (d,))
118
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000119 def test_dump_big_int(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000120 if sys.maxint > 2**31-1:
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000121 self.assertRaises(OverflowError, xmlrpclib.dumps,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000122 (int(2**34),))
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000123
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000124 xmlrpclib.dumps((xmlrpclib.MAXINT, xmlrpclib.MININT))
125 self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MAXINT+1,))
126 self.assertRaises(OverflowError, xmlrpclib.dumps, (xmlrpclib.MININT-1,))
127
128 def dummy_write(s):
129 pass
130
131 m = xmlrpclib.Marshaller()
132 m.dump_int(xmlrpclib.MAXINT, dummy_write)
133 m.dump_int(xmlrpclib.MININT, dummy_write)
134 self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MAXINT+1, dummy_write)
135 self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MININT-1, dummy_write)
136
137
Andrew M. Kuchling0b852032003-04-25 00:27:24 +0000138 def test_dump_none(self):
139 value = alist + [None]
140 arg1 = (alist + [None],)
141 strg = xmlrpclib.dumps(arg1, allow_none=True)
142 self.assertEquals(value,
143 xmlrpclib.loads(strg)[0][0])
144 self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
145
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000146
147class HelperTestCase(unittest.TestCase):
148 def test_escape(self):
149 self.assertEqual(xmlrpclib.escape("a&b"), "a&b")
150 self.assertEqual(xmlrpclib.escape("a<b"), "a&lt;b")
151 self.assertEqual(xmlrpclib.escape("a>b"), "a&gt;b")
152
153class FaultTestCase(unittest.TestCase):
154 def test_repr(self):
155 f = xmlrpclib.Fault(42, 'Test Fault')
156 self.assertEqual(repr(f), "<Fault 42: 'Test Fault'>")
157 self.assertEqual(repr(f), str(f))
158
159 def test_dump_fault(self):
160 f = xmlrpclib.Fault(42, 'Test Fault')
161 s = xmlrpclib.dumps((f,))
162 (newf,), m = xmlrpclib.loads(s)
163 self.assertEquals(newf, {'faultCode': 42, 'faultString': 'Test Fault'})
164 self.assertEquals(m, None)
165
166 s = xmlrpclib.Marshaller().dumps(f)
167 self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s)
168
169
170class DateTimeTestCase(unittest.TestCase):
171 def test_default(self):
172 t = xmlrpclib.DateTime()
173
174 def test_time(self):
175 d = 1181399930.036952
176 t = xmlrpclib.DateTime(d)
177 self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", time.localtime(d)))
178
179 def test_time_tuple(self):
180 d = (2007,6,9,10,38,50,5,160,0)
181 t = xmlrpclib.DateTime(d)
182 self.assertEqual(str(t), '20070609T10:38:50')
183
184 def test_time_struct(self):
185 d = time.localtime(1181399930.036952)
186 t = xmlrpclib.DateTime(d)
187 self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", d))
188
189 def test_datetime_datetime(self):
190 d = datetime.datetime(2007,1,2,3,4,5)
191 t = xmlrpclib.DateTime(d)
192 self.assertEqual(str(t), '20070102T03:04:05')
193
194 def test_datetime_date(self):
195 d = datetime.date(2007,9,8)
196 t = xmlrpclib.DateTime(d)
197 self.assertEqual(str(t), '20070908T00:00:00')
198
199 def test_datetime_time(self):
200 d = datetime.time(13,17,19)
201 # allow for date rollover by checking today's or tomorrow's dates
202 dd1 = datetime.datetime.now().date()
203 dd2 = dd1 + datetime.timedelta(days=1)
204 vals = (dd1.strftime('%Y%m%dT13:17:19'),
205 dd2.strftime('%Y%m%dT13:17:19'))
206 t = xmlrpclib.DateTime(d)
207 self.assertEqual(str(t) in vals, True)
208
209 def test_repr(self):
210 d = datetime.datetime(2007,1,2,3,4,5)
211 t = xmlrpclib.DateTime(d)
212 val ="<DateTime '20070102T03:04:05' at %x>" % id(t)
213 self.assertEqual(repr(t), val)
214
215 def test_decode(self):
216 d = ' 20070908T07:11:13 '
217 t1 = xmlrpclib.DateTime()
218 t1.decode(d)
219 tref = xmlrpclib.DateTime(datetime.datetime(2007,9,8,7,11,13))
220 self.assertEqual(t1, tref)
221
222 t2 = xmlrpclib._datetime(d)
223 self.assertEqual(t1, tref)
224
225class BinaryTestCase(unittest.TestCase):
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000226
227 # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff"
228 # for now (i.e. interpreting the binary data as Latin-1-encoded
229 # text). But this feels very unsatisfactory. Perhaps we should
230 # only define repr(), and return r"Binary(b'\xff')" instead?
231
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000232 def test_default(self):
233 t = xmlrpclib.Binary()
234 self.assertEqual(str(t), '')
235
236 def test_string(self):
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000237 d = b'\x01\x02\x03abc123\xff\xfe'
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000238 t = xmlrpclib.Binary(d)
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000239 self.assertEqual(str(t), str(d, "latin-1"))
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000240
241 def test_decode(self):
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000242 d = b'\x01\x02\x03abc123\xff\xfe'
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000243 de = base64.encodestring(d)
244 t1 = xmlrpclib.Binary()
245 t1.decode(de)
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000246 self.assertEqual(str(t1), str(d, "latin-1"))
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000247
248 t2 = xmlrpclib._binary(de)
Guido van Rossum54a40cb2007-08-27 22:27:41 +0000249 self.assertEqual(str(t2), str(d, "latin-1"))
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000250
251
Guido van Rossumaf554a02007-08-16 23:48:43 +0000252PORT = None
Skip Montanaro419abda2001-10-01 17:47:44 +0000253
Guido van Rossumaf554a02007-08-16 23:48:43 +0000254def http_server(evt, numrequests):
255 class TestInstanceClass:
256 def div(self, x, y):
257 '''This is the div function'''
258 return x // y
259
Guido van Rossumaf554a02007-08-16 23:48:43 +0000260 try:
Guido van Rossum61e21b52007-08-20 19:06:03 +0000261 serv = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0),
262 logRequests=False, bind_and_activate=False)
Guido van Rossumaf554a02007-08-16 23:48:43 +0000263 serv.server_bind()
264 global PORT
265 PORT = serv.socket.getsockname()[1]
266 serv.server_activate()
267 serv.register_introspection_functions()
268 serv.register_multicall_functions()
269 serv.register_function(pow)
270 serv.register_function(lambda x,y: x+y, 'add')
271 serv.register_instance(TestInstanceClass())
272
273 # handle up to 'numrequests' requests
274 while numrequests > 0:
275 serv.handle_request()
276 numrequests -= 1
277
278 except socket.timeout:
279 pass
280 finally:
281 serv.socket.close()
282 PORT = None
283 evt.set()
284
285
Thomas Woutersed03b412007-08-28 21:37:11 +0000286
Thomas Woutersed03b412007-08-28 21:37:11 +0000287
Guido van Rossum61e21b52007-08-20 19:06:03 +0000288class SimpleServerTestCase(unittest.TestCase):
Guido van Rossumaf554a02007-08-16 23:48:43 +0000289 def setUp(self):
Guido van Rossum61e21b52007-08-20 19:06:03 +0000290 # enable traceback reporting
291 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
292
Guido van Rossumaf554a02007-08-16 23:48:43 +0000293 self.evt = threading.Event()
Guido van Rossum61e21b52007-08-20 19:06:03 +0000294 # start server thread to handle requests
Thomas Woutersed03b412007-08-28 21:37:11 +0000295 serv_args = (self.evt, 1)
Guido van Rossum61e21b52007-08-20 19:06:03 +0000296 threading.Thread(target=http_server, args=serv_args).start()
Guido van Rossumaf554a02007-08-16 23:48:43 +0000297
298 # wait for port to be assigned to server
299 n = 1000
300 while n > 0 and PORT is None:
301 time.sleep(0.001)
302 n -= 1
303
304 time.sleep(0.5)
305
306 def tearDown(self):
307 # wait on the server thread to terminate
308 self.evt.wait()
309
Guido van Rossum61e21b52007-08-20 19:06:03 +0000310 # disable traceback reporting
311 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False
312
Guido van Rossumaf554a02007-08-16 23:48:43 +0000313 def test_simple1(self):
Guido van Rossum04110fb2007-08-24 16:32:05 +0000314 try:
315 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
316 self.assertEqual(p.pow(6,8), 6**8)
Guido van Rossum7f19f662007-08-24 16:47:58 +0000317 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000318 # protocol error; provide additional information in test output
319 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossumaf554a02007-08-16 23:48:43 +0000320
321 def test_introspection1(self):
Guido van Rossum04110fb2007-08-24 16:32:05 +0000322 try:
323 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
324 meth = p.system.listMethods()
325 expected_methods = set(['pow', 'div', 'add', 'system.listMethods',
326 'system.methodHelp', 'system.methodSignature', 'system.multicall'])
327 self.assertEqual(set(meth), expected_methods)
Guido van Rossum7f19f662007-08-24 16:47:58 +0000328 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000329 # protocol error; provide additional information in test output
330 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossumaf554a02007-08-16 23:48:43 +0000331
332 def test_introspection2(self):
Guido van Rossum04110fb2007-08-24 16:32:05 +0000333 try:
334 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
335 divhelp = p.system.methodHelp('div')
336 self.assertEqual(divhelp, 'This is the div function')
Guido van Rossum7f19f662007-08-24 16:47:58 +0000337 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000338 # protocol error; provide additional information in test output
339 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossumaf554a02007-08-16 23:48:43 +0000340
341 def test_introspection3(self):
342 # the SimpleXMLRPCServer doesn't support signatures, but
Thomas Woutersed03b412007-08-28 21:37:11 +0000343 # at least check that we can try making the call
Guido van Rossum04110fb2007-08-24 16:32:05 +0000344 try:
345 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
346 divsig = p.system.methodSignature('div')
347 self.assertEqual(divsig, 'signatures not supported')
Guido van Rossum7f19f662007-08-24 16:47:58 +0000348 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000349 # protocol error; provide additional information in test output
350 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossumaf554a02007-08-16 23:48:43 +0000351
352 def test_multicall(self):
Guido van Rossum04110fb2007-08-24 16:32:05 +0000353 try:
354 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
355 multicall = xmlrpclib.MultiCall(p)
356 multicall.add(2,3)
357 multicall.pow(6,8)
358 multicall.div(127,42)
359 add_result, pow_result, div_result = multicall()
360 self.assertEqual(add_result, 2+3)
361 self.assertEqual(pow_result, 6**8)
362 self.assertEqual(div_result, 127//42)
Guido van Rossum7f19f662007-08-24 16:47:58 +0000363 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000364 # protocol error; provide additional information in test output
365 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossumaf554a02007-08-16 23:48:43 +0000366
367
Guido van Rossum61e21b52007-08-20 19:06:03 +0000368# This is a contrived way to make a failure occur on the server side
369# in order to test the _send_traceback_header flag on the server
370class FailingMessageClass(mimetools.Message):
371 def __getitem__(self, key):
372 key = key.lower()
373 if key == 'content-length':
374 return 'I am broken'
375 return mimetools.Message.__getitem__(self, key)
376
377
378class FailingServerTestCase(unittest.TestCase):
379 def setUp(self):
380 self.evt = threading.Event()
381 # start server thread to handle requests
Guido van Rossum15c97462007-11-02 16:10:06 +0000382 serv_args = (self.evt, 1)
Guido van Rossum61e21b52007-08-20 19:06:03 +0000383 threading.Thread(target=http_server, args=serv_args).start()
384
385 # wait for port to be assigned to server
386 n = 1000
387 while n > 0 and PORT is None:
388 time.sleep(0.001)
389 n -= 1
390
391 time.sleep(0.5)
392
393 def tearDown(self):
394 # wait on the server thread to terminate
395 self.evt.wait()
396 # reset flag
397 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = False
398 # reset message class
399 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = mimetools.Message
400
401 def test_basic(self):
402 # check that flag is false by default
403 flagval = SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header
404 self.assertEqual(flagval, False)
405
Guido van Rossum04110fb2007-08-24 16:32:05 +0000406 # enable traceback reporting
407 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
408
409 # test a call that shouldn't fail just as a smoke test
410 try:
411 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
412 self.assertEqual(p.pow(6,8), 6**8)
Guido van Rossum7f19f662007-08-24 16:47:58 +0000413 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000414 # protocol error; provide additional information in test output
415 self.fail("%s\n%s" % (e, e.headers))
Guido van Rossum61e21b52007-08-20 19:06:03 +0000416
417 def test_fail_no_info(self):
418 # use the broken message class
419 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass
420
421 try:
422 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
423 p.pow(6,8)
424 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000425 # The two server-side error headers shouldn't be sent back in this case
426 self.assertTrue(e.headers.get("X-exception") is None)
427 self.assertTrue(e.headers.get("X-traceback") is None)
Guido van Rossum61e21b52007-08-20 19:06:03 +0000428 else:
429 self.fail('ProtocolError not raised')
430
431 def test_fail_with_info(self):
432 # use the broken message class
433 SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass
434
435 # Check that errors in the server send back exception/traceback
436 # info when flag is set
437 SimpleXMLRPCServer.SimpleXMLRPCServer._send_traceback_header = True
438
439 try:
440 p = xmlrpclib.ServerProxy('http://localhost:%d' % PORT)
441 p.pow(6,8)
442 except xmlrpclib.ProtocolError as e:
Guido van Rossum15c97462007-11-02 16:10:06 +0000443 # We should get error info in the response
444 expected_err = "invalid literal for int() with base 10: 'I am broken'"
445 self.assertEqual(e.headers.get("x-exception"), expected_err)
446 self.assertTrue(e.headers.get("x-traceback") is not None)
Guido van Rossum61e21b52007-08-20 19:06:03 +0000447 else:
448 self.fail('ProtocolError not raised')
449
450
Guido van Rossumaf554a02007-08-16 23:48:43 +0000451def test_main():
452 xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase,
453 BinaryTestCase, FaultTestCase]
454
455 # The test cases against a SimpleXMLRPCServer raise a socket error
456 # 10035 (WSAEWOULDBLOCK) in the server thread handle_request call when
457 # run on Windows. This only happens on the first test to run, but it
458 # fails every time and so these tests are skipped on win32 platforms.
459 if sys.platform != 'win32':
Guido van Rossum61e21b52007-08-20 19:06:03 +0000460 xmlrpc_tests.append(SimpleServerTestCase)
461 xmlrpc_tests.append(FailingServerTestCase)
Guido van Rossumaf554a02007-08-16 23:48:43 +0000462
463 test_support.run_unittest(*xmlrpc_tests)
Skip Montanaro419abda2001-10-01 17:47:44 +0000464
465if __name__ == "__main__":
466 test_main()