|
1 import datetime |
|
2 import sys |
|
3 import unittest |
|
4 import xmlrpclib |
|
5 from test import test_support |
|
6 |
|
7 try: |
|
8 unicode |
|
9 except NameError: |
|
10 have_unicode = False |
|
11 else: |
|
12 have_unicode = True |
|
13 |
|
14 alist = [{'astring': 'foo@bar.baz.spam', |
|
15 'afloat': 7283.43, |
|
16 'anint': 2**20, |
|
17 'ashortlong': 2L, |
|
18 'anotherlist': ['.zyx.41'], |
|
19 'abase64': xmlrpclib.Binary("my dog has fleas"), |
|
20 'boolean': xmlrpclib.False, |
|
21 'unicode': u'\u4000\u6000\u8000', |
|
22 u'ukey\u4000': 'regular value', |
|
23 'datetime1': xmlrpclib.DateTime('20050210T11:41:23'), |
|
24 'datetime2': xmlrpclib.DateTime( |
|
25 (2005, 02, 10, 11, 41, 23, 0, 1, -1)), |
|
26 'datetime3': xmlrpclib.DateTime( |
|
27 datetime.datetime(2005, 02, 10, 11, 41, 23)), |
|
28 }] |
|
29 |
|
30 class XMLRPCTestCase(unittest.TestCase): |
|
31 |
|
32 def test_dump_load(self): |
|
33 self.assertEquals(alist, |
|
34 xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0]) |
|
35 |
|
36 def test_dump_bare_datetime(self): |
|
37 # This checks that an unwrapped datetime.date object can be handled |
|
38 # by the marshalling code. This can't be done via test_dump_load() |
|
39 # since with use_datetime set to 1 the unmarshaller would create |
|
40 # datetime objects for the 'datetime[123]' keys as well |
|
41 dt = datetime.datetime(2005, 02, 10, 11, 41, 23) |
|
42 s = xmlrpclib.dumps((dt,)) |
|
43 (newdt,), m = xmlrpclib.loads(s, use_datetime=1) |
|
44 self.assertEquals(newdt, dt) |
|
45 self.assertEquals(m, None) |
|
46 |
|
47 (newdt,), m = xmlrpclib.loads(s, use_datetime=0) |
|
48 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23')) |
|
49 |
|
50 def test_dump_bare_date(self): |
|
51 # This checks that an unwrapped datetime.date object can be handled |
|
52 # by the marshalling code. This can't be done via test_dump_load() |
|
53 # since the unmarshaller produces a datetime object |
|
54 d = datetime.datetime(2005, 02, 10, 11, 41, 23).date() |
|
55 s = xmlrpclib.dumps((d,)) |
|
56 (newd,), m = xmlrpclib.loads(s, use_datetime=1) |
|
57 self.assertEquals(newd.date(), d) |
|
58 self.assertEquals(newd.time(), datetime.time(0, 0, 0)) |
|
59 self.assertEquals(m, None) |
|
60 |
|
61 (newdt,), m = xmlrpclib.loads(s, use_datetime=0) |
|
62 self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00')) |
|
63 |
|
64 def test_dump_bare_time(self): |
|
65 # This checks that an unwrapped datetime.time object can be handled |
|
66 # by the marshalling code. This can't be done via test_dump_load() |
|
67 # since the unmarshaller produces a datetime object |
|
68 t = datetime.datetime(2005, 02, 10, 11, 41, 23).time() |
|
69 s = xmlrpclib.dumps((t,)) |
|
70 (newt,), m = xmlrpclib.loads(s, use_datetime=1) |
|
71 today = datetime.datetime.now().date().strftime("%Y%m%d") |
|
72 self.assertEquals(newt.time(), t) |
|
73 self.assertEquals(newt.date(), datetime.datetime.now().date()) |
|
74 self.assertEquals(m, None) |
|
75 |
|
76 (newdt,), m = xmlrpclib.loads(s, use_datetime=0) |
|
77 self.assertEquals(newdt, xmlrpclib.DateTime('%sT11:41:23'%today)) |
|
78 |
|
79 def test_bug_1164912 (self): |
|
80 d = xmlrpclib.DateTime() |
|
81 ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), |
|
82 methodresponse=True)) |
|
83 self.assert_(isinstance(new_d.value, str)) |
|
84 |
|
85 # Check that the output of dumps() is still an 8-bit string |
|
86 s = xmlrpclib.dumps((new_d,), methodresponse=True) |
|
87 self.assert_(isinstance(s, str)) |
|
88 |
|
89 def test_dump_big_long(self): |
|
90 self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) |
|
91 |
|
92 def test_dump_bad_dict(self): |
|
93 self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},)) |
|
94 |
|
95 def test_dump_big_int(self): |
|
96 if sys.maxint > 2L**31-1: |
|
97 self.assertRaises(OverflowError, xmlrpclib.dumps, |
|
98 (int(2L**34),)) |
|
99 |
|
100 def test_dump_none(self): |
|
101 value = alist + [None] |
|
102 arg1 = (alist + [None],) |
|
103 strg = xmlrpclib.dumps(arg1, allow_none=True) |
|
104 self.assertEquals(value, |
|
105 xmlrpclib.loads(strg)[0][0]) |
|
106 self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,)) |
|
107 |
|
108 def test_default_encoding_issues(self): |
|
109 # SF bug #1115989: wrong decoding in '_stringify' |
|
110 utf8 = """<?xml version='1.0' encoding='iso-8859-1'?> |
|
111 <params> |
|
112 <param><value> |
|
113 <string>abc \x95</string> |
|
114 </value></param> |
|
115 <param><value> |
|
116 <struct> |
|
117 <member> |
|
118 <name>def \x96</name> |
|
119 <value><string>ghi \x97</string></value> |
|
120 </member> |
|
121 </struct> |
|
122 </value></param> |
|
123 </params> |
|
124 """ |
|
125 |
|
126 # sys.setdefaultencoding() normally doesn't exist after site.py is |
|
127 # loaded. reload(sys) is the way to get it back. |
|
128 old_encoding = sys.getdefaultencoding() |
|
129 setdefaultencoding_existed = hasattr(sys, "setdefaultencoding") |
|
130 reload(sys) # ugh! |
|
131 sys.setdefaultencoding("iso-8859-1") |
|
132 try: |
|
133 (s, d), m = xmlrpclib.loads(utf8) |
|
134 finally: |
|
135 sys.setdefaultencoding(old_encoding) |
|
136 if not setdefaultencoding_existed: |
|
137 del sys.setdefaultencoding |
|
138 |
|
139 items = d.items() |
|
140 if have_unicode: |
|
141 self.assertEquals(s, u"abc \x95") |
|
142 self.assert_(isinstance(s, unicode)) |
|
143 self.assertEquals(items, [(u"def \x96", u"ghi \x97")]) |
|
144 self.assert_(isinstance(items[0][0], unicode)) |
|
145 self.assert_(isinstance(items[0][1], unicode)) |
|
146 else: |
|
147 self.assertEquals(s, "abc \xc2\x95") |
|
148 self.assertEquals(items, [("def \xc2\x96", "ghi \xc2\x97")]) |
|
149 |
|
150 def test_main(): |
|
151 test_support.run_unittest(XMLRPCTestCase) |
|
152 |
|
153 |
|
154 if __name__ == "__main__": |
|
155 test_main() |