| 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': '[email protected]',
|
|---|
| 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()
|
|---|