blob: bc8a7cf27f1ddf0d0d1cbcb317be54c7ec014df3 [file] [log] [blame]
Fred Drakeba613c32005-02-10 18:33:30 +00001import datetime
Skip Montanaro3e7bba92001-10-19 16:06:52 +00002import sys
Skip Montanaro419abda2001-10-01 17:47:44 +00003import unittest
4import xmlrpclib
Barry Warsaw04f357c2002-07-23 19:04:11 +00005from test import test_support
Skip Montanaro419abda2001-10-01 17:47:44 +00006
7alist = [{'astring': 'foo@bar.baz.spam',
8 'afloat': 7283.43,
Skip Montanaro3e7bba92001-10-19 16:06:52 +00009 'anint': 2**20,
Guido van Rossume2a383d2007-01-15 16:59:06 +000010 'ashortlong': 2,
Skip Montanaro419abda2001-10-01 17:47:44 +000011 'anotherlist': ['.zyx.41'],
12 'abase64': xmlrpclib.Binary("my dog has fleas"),
Guido van Rossume7ba4952007-06-06 23:52:48 +000013 'boolean': False,
Guido van Rossumef87d6e2007-05-02 19:09:54 +000014 'unicode': '\u4000\u6000\u8000',
15 'ukey\u4000': 'regular value',
Fred Drakeba613c32005-02-10 18:33:30 +000016 'datetime1': xmlrpclib.DateTime('20050210T11:41:23'),
17 'datetime2': xmlrpclib.DateTime(
18 (2005, 02, 10, 11, 41, 23, 0, 1, -1)),
19 'datetime3': xmlrpclib.DateTime(
20 datetime.datetime(2005, 02, 10, 11, 41, 23)),
Skip Montanaro419abda2001-10-01 17:47:44 +000021 }]
22
23class XMLRPCTestCase(unittest.TestCase):
24
25 def test_dump_load(self):
26 self.assertEquals(alist,
27 xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0])
28
Fred Drakeba613c32005-02-10 18:33:30 +000029 def test_dump_bare_datetime(self):
Skip Montanaro174dd222005-05-14 20:54:16 +000030 # This checks that an unwrapped datetime.date object can be handled
31 # by the marshalling code. This can't be done via test_dump_load()
32 # since with use_datetime set to 1 the unmarshaller would create
33 # datetime objects for the 'datetime[123]' keys as well
Fred Drakeba613c32005-02-10 18:33:30 +000034 dt = datetime.datetime(2005, 02, 10, 11, 41, 23)
35 s = xmlrpclib.dumps((dt,))
Skip Montanaro174dd222005-05-14 20:54:16 +000036 (newdt,), m = xmlrpclib.loads(s, use_datetime=1)
37 self.assertEquals(newdt, dt)
Fred Drakeba613c32005-02-10 18:33:30 +000038 self.assertEquals(m, None)
39
Skip Montanaro174dd222005-05-14 20:54:16 +000040 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
41 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23'))
42
43 def test_dump_bare_date(self):
44 # This checks that an unwrapped datetime.date object can be handled
45 # by the marshalling code. This can't be done via test_dump_load()
46 # since the unmarshaller produces a datetime object
47 d = datetime.datetime(2005, 02, 10, 11, 41, 23).date()
48 s = xmlrpclib.dumps((d,))
49 (newd,), m = xmlrpclib.loads(s, use_datetime=1)
50 self.assertEquals(newd.date(), d)
51 self.assertEquals(newd.time(), datetime.time(0, 0, 0))
52 self.assertEquals(m, None)
53
54 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
55 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00'))
56
57 def test_dump_bare_time(self):
58 # This checks that an unwrapped datetime.time object can be handled
59 # by the marshalling code. This can't be done via test_dump_load()
60 # since the unmarshaller produces a datetime object
61 t = datetime.datetime(2005, 02, 10, 11, 41, 23).time()
62 s = xmlrpclib.dumps((t,))
63 (newt,), m = xmlrpclib.loads(s, use_datetime=1)
64 today = datetime.datetime.now().date().strftime("%Y%m%d")
65 self.assertEquals(newt.time(), t)
66 self.assertEquals(newt.date(), datetime.datetime.now().date())
67 self.assertEquals(m, None)
68
69 (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
70 self.assertEquals(newdt, xmlrpclib.DateTime('%sT11:41:23'%today))
71
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000072 def test_bug_1164912 (self):
73 d = xmlrpclib.DateTime()
Tim Peters536cf992005-12-25 23:18:31 +000074 ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,),
Andrew M. Kuchlingbdb39012005-12-04 19:11:17 +000075 methodresponse=True))
76 self.assert_(isinstance(new_d.value, str))
77
78 # Check that the output of dumps() is still an 8-bit string
79 s = xmlrpclib.dumps((new_d,), methodresponse=True)
80 self.assert_(isinstance(s, str))
81
Thomas Wouters89f507f2006-12-13 04:49:30 +000082 def test_newstyle_class(self):
83 class T(object):
84 pass
85 t = T()
86 t.x = 100
87 t.y = "Hello"
88 ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
89 self.assertEquals(t2, t.__dict__)
90
Skip Montanaro3e7bba92001-10-19 16:06:52 +000091 def test_dump_big_long(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +000092 self.assertRaises(OverflowError, xmlrpclib.dumps, (2**99,))
Skip Montanaro3e7bba92001-10-19 16:06:52 +000093
94 def test_dump_bad_dict(self):
95 self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},))
96
97 def test_dump_big_int(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +000098 if sys.maxint > 2**31-1:
Skip Montanaro3e7bba92001-10-19 16:06:52 +000099 self.assertRaises(OverflowError, xmlrpclib.dumps,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000100 (int(2**34),))
Skip Montanaro3e7bba92001-10-19 16:06:52 +0000101
Andrew M. Kuchling0b852032003-04-25 00:27:24 +0000102 def test_dump_none(self):
103 value = alist + [None]
104 arg1 = (alist + [None],)
105 strg = xmlrpclib.dumps(arg1, allow_none=True)
106 self.assertEquals(value,
107 xmlrpclib.loads(strg)[0][0])
108 self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
109
Fred Drake22c07062005-02-11 17:59:08 +0000110 def test_default_encoding_issues(self):
111 # SF bug #1115989: wrong decoding in '_stringify'
112 utf8 = """<?xml version='1.0' encoding='iso-8859-1'?>
113 <params>
114 <param><value>
115 <string>abc \x95</string>
116 </value></param>
117 <param><value>
118 <struct>
119 <member>
120 <name>def \x96</name>
121 <value><string>ghi \x97</string></value>
122 </member>
123 </struct>
124 </value></param>
125 </params>
126 """
Tim Petersf754f5f2005-04-08 18:00:59 +0000127
128 # sys.setdefaultencoding() normally doesn't exist after site.py is
Guido van Rossume7ba4952007-06-06 23:52:48 +0000129 # loaded. Re-initializing sys again is the way to get it back. :-(
Fred Drake22c07062005-02-11 17:59:08 +0000130 old_encoding = sys.getdefaultencoding()
Tim Petersf754f5f2005-04-08 18:00:59 +0000131 setdefaultencoding_existed = hasattr(sys, "setdefaultencoding")
Guido van Rossume7ba4952007-06-06 23:52:48 +0000132 import imp
133 imp.init_builtin('sys')
Fred Drake22c07062005-02-11 17:59:08 +0000134 sys.setdefaultencoding("iso-8859-1")
135 try:
136 (s, d), m = xmlrpclib.loads(utf8)
137 finally:
138 sys.setdefaultencoding(old_encoding)
Tim Petersf754f5f2005-04-08 18:00:59 +0000139 if not setdefaultencoding_existed:
140 del sys.setdefaultencoding
141
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000142 items = list(d.items())
Walter Dörwald9b775532007-06-08 14:30:53 +0000143 self.assertEquals(s, "abc \x95")
144 self.assert_(isinstance(s, str))
145 self.assertEquals(items, [("def \x96", "ghi \x97")])
146 self.assert_(isinstance(items[0][0], str))
147 self.assert_(isinstance(items[0][1], str))
Fred Drake22c07062005-02-11 17:59:08 +0000148
Skip Montanaro419abda2001-10-01 17:47:44 +0000149def test_main():
150 test_support.run_unittest(XMLRPCTestCase)
151
152
153if __name__ == "__main__":
154 test_main()