| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 1 | import base64 | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 2 | import datetime | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 3 | import sys | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 4 | import time | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 5 | import unittest | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 6 | import xmlrpc.client as xmlrpclib | 
 | 7 | import xmlrpc.server | 
| Georg Brandl | 2442015 | 2008-05-26 16:32:26 +0000 | [diff] [blame] | 8 | import http.client | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 9 | import socket | 
 | 10 | import os | 
| Senthil Kumaran | b3af08f | 2009-04-01 20:20:43 +0000 | [diff] [blame] | 11 | import re | 
| R. David Murray | 0548ce0 | 2009-10-26 08:24:14 +0000 | [diff] [blame] | 12 | import io | 
 | 13 | import contextlib | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 14 | from test import support | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 15 |  | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 16 | try: | 
 | 17 |     import threading | 
 | 18 | except ImportError: | 
 | 19 |     threading = None | 
 | 20 |  | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 21 | alist = [{'astring': 'foo@bar.baz.spam', | 
 | 22 |           'afloat': 7283.43, | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 23 |           'anint': 2**20, | 
| Guido van Rossum | e2a383d | 2007-01-15 16:59:06 +0000 | [diff] [blame] | 24 |           'ashortlong': 2, | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 25 |           'anotherlist': ['.zyx.41'], | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 26 |           'abase64': xmlrpclib.Binary(b"my dog has fleas"), | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 27 |           'b64bytes': b"my dog has fleas", | 
 | 28 |           'b64bytearray': bytearray(b"my dog has fleas"), | 
| Guido van Rossum | e7ba495 | 2007-06-06 23:52:48 +0000 | [diff] [blame] | 29 |           'boolean': False, | 
| Guido van Rossum | ef87d6e | 2007-05-02 19:09:54 +0000 | [diff] [blame] | 30 |           'unicode': '\u4000\u6000\u8000', | 
 | 31 |           'ukey\u4000': 'regular value', | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 32 |           'datetime1': xmlrpclib.DateTime('20050210T11:41:23'), | 
 | 33 |           'datetime2': xmlrpclib.DateTime( | 
| Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 34 |                         (2005, 2, 10, 11, 41, 23, 0, 1, -1)), | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 35 |           'datetime3': xmlrpclib.DateTime( | 
| Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 36 |                         datetime.datetime(2005, 2, 10, 11, 41, 23)), | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 37 |           }] | 
 | 38 |  | 
 | 39 | class XMLRPCTestCase(unittest.TestCase): | 
 | 40 |  | 
 | 41 |     def test_dump_load(self): | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 42 |         dump = xmlrpclib.dumps((alist,)) | 
 | 43 |         load = xmlrpclib.loads(dump) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 44 |         self.assertEqual(alist, load[0][0]) | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 45 |  | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 46 |     def test_dump_bare_datetime(self): | 
| Skip Montanaro | 174dd22 | 2005-05-14 20:54:16 +0000 | [diff] [blame] | 47 |         # This checks that an unwrapped datetime.date object can be handled | 
 | 48 |         # by the marshalling code.  This can't be done via test_dump_load() | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 49 |         # since with use_builtin_types set to 1 the unmarshaller would create | 
| Skip Montanaro | 174dd22 | 2005-05-14 20:54:16 +0000 | [diff] [blame] | 50 |         # datetime objects for the 'datetime[123]' keys as well | 
| Guido van Rossum | cd16bf6 | 2007-06-13 18:07:49 +0000 | [diff] [blame] | 51 |         dt = datetime.datetime(2005, 2, 10, 11, 41, 23) | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 52 |         self.assertEqual(dt, xmlrpclib.DateTime('20050210T11:41:23')) | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 53 |         s = xmlrpclib.dumps((dt,)) | 
| Fred Drake | ba613c3 | 2005-02-10 18:33:30 +0000 | [diff] [blame] | 54 |  | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 55 |         result, m = xmlrpclib.loads(s, use_builtin_types=True) | 
 | 56 |         (newdt,) = result | 
 | 57 |         self.assertEqual(newdt, dt) | 
 | 58 |         self.assertIs(type(newdt), datetime.datetime) | 
 | 59 |         self.assertIsNone(m) | 
 | 60 |  | 
 | 61 |         result, m = xmlrpclib.loads(s, use_builtin_types=False) | 
 | 62 |         (newdt,) = result | 
 | 63 |         self.assertEqual(newdt, dt) | 
 | 64 |         self.assertIs(type(newdt), xmlrpclib.DateTime) | 
 | 65 |         self.assertIsNone(m) | 
 | 66 |  | 
 | 67 |         result, m = xmlrpclib.loads(s, use_datetime=True) | 
 | 68 |         (newdt,) = result | 
 | 69 |         self.assertEqual(newdt, dt) | 
 | 70 |         self.assertIs(type(newdt), datetime.datetime) | 
 | 71 |         self.assertIsNone(m) | 
 | 72 |  | 
 | 73 |         result, m = xmlrpclib.loads(s, use_datetime=False) | 
 | 74 |         (newdt,) = result | 
 | 75 |         self.assertEqual(newdt, dt) | 
 | 76 |         self.assertIs(type(newdt), xmlrpclib.DateTime) | 
 | 77 |         self.assertIsNone(m) | 
 | 78 |  | 
| Skip Montanaro | 174dd22 | 2005-05-14 20:54:16 +0000 | [diff] [blame] | 79 |  | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 80 |     def test_datetime_before_1900(self): | 
| Christian Heimes | 81ee3ef | 2008-05-04 22:42:01 +0000 | [diff] [blame] | 81 |         # same as before but with a date before 1900 | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 82 |         dt = datetime.datetime(1,  2, 10, 11, 41, 23) | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 83 |         self.assertEqual(dt, xmlrpclib.DateTime('00010210T11:41:23')) | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 84 |         s = xmlrpclib.dumps((dt,)) | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 85 |  | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 86 |         result, m = xmlrpclib.loads(s, use_builtin_types=True) | 
 | 87 |         (newdt,) = result | 
 | 88 |         self.assertEqual(newdt, dt) | 
 | 89 |         self.assertIs(type(newdt), datetime.datetime) | 
 | 90 |         self.assertIsNone(m) | 
 | 91 |  | 
 | 92 |         result, m = xmlrpclib.loads(s, use_builtin_types=False) | 
 | 93 |         (newdt,) = result | 
 | 94 |         self.assertEqual(newdt, dt) | 
 | 95 |         self.assertIs(type(newdt), xmlrpclib.DateTime) | 
 | 96 |         self.assertIsNone(m) | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 97 |  | 
| Andrew M. Kuchling | bdb3901 | 2005-12-04 19:11:17 +0000 | [diff] [blame] | 98 |     def test_bug_1164912 (self): | 
 | 99 |         d = xmlrpclib.DateTime() | 
| Tim Peters | 536cf99 | 2005-12-25 23:18:31 +0000 | [diff] [blame] | 100 |         ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), | 
| Andrew M. Kuchling | bdb3901 | 2005-12-04 19:11:17 +0000 | [diff] [blame] | 101 |                                             methodresponse=True)) | 
| Ezio Melotti | e961593 | 2010-01-24 19:26:24 +0000 | [diff] [blame] | 102 |         self.assertIsInstance(new_d.value, str) | 
| Andrew M. Kuchling | bdb3901 | 2005-12-04 19:11:17 +0000 | [diff] [blame] | 103 |  | 
 | 104 |         # Check that the output of dumps() is still an 8-bit string | 
 | 105 |         s = xmlrpclib.dumps((new_d,), methodresponse=True) | 
| Ezio Melotti | e961593 | 2010-01-24 19:26:24 +0000 | [diff] [blame] | 106 |         self.assertIsInstance(s, str) | 
| Andrew M. Kuchling | bdb3901 | 2005-12-04 19:11:17 +0000 | [diff] [blame] | 107 |  | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 108 |     def test_newstyle_class(self): | 
 | 109 |         class T(object): | 
 | 110 |             pass | 
 | 111 |         t = T() | 
 | 112 |         t.x = 100 | 
 | 113 |         t.y = "Hello" | 
 | 114 |         ((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,))) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 115 |         self.assertEqual(t2, t.__dict__) | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 116 |  | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 117 |     def test_dump_big_long(self): | 
| Guido van Rossum | e2a383d | 2007-01-15 16:59:06 +0000 | [diff] [blame] | 118 |         self.assertRaises(OverflowError, xmlrpclib.dumps, (2**99,)) | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 119 |  | 
 | 120 |     def test_dump_bad_dict(self): | 
 | 121 |         self.assertRaises(TypeError, xmlrpclib.dumps, ({(1,2,3): 1},)) | 
 | 122 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 123 |     def test_dump_recursive_seq(self): | 
 | 124 |         l = [1,2,3] | 
 | 125 |         t = [3,4,5,l] | 
 | 126 |         l.append(t) | 
 | 127 |         self.assertRaises(TypeError, xmlrpclib.dumps, (l,)) | 
 | 128 |  | 
 | 129 |     def test_dump_recursive_dict(self): | 
 | 130 |         d = {'1':1, '2':1} | 
 | 131 |         t = {'3':3, 'd':d} | 
 | 132 |         d['t'] = t | 
 | 133 |         self.assertRaises(TypeError, xmlrpclib.dumps, (d,)) | 
 | 134 |  | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 135 |     def test_dump_big_int(self): | 
| Christian Heimes | a37d4c6 | 2007-12-04 23:02:19 +0000 | [diff] [blame] | 136 |         if sys.maxsize > 2**31-1: | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 137 |             self.assertRaises(OverflowError, xmlrpclib.dumps, | 
| Guido van Rossum | e2a383d | 2007-01-15 16:59:06 +0000 | [diff] [blame] | 138 |                               (int(2**34),)) | 
| Skip Montanaro | 3e7bba9 | 2001-10-19 16:06:52 +0000 | [diff] [blame] | 139 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 140 |         xmlrpclib.dumps((xmlrpclib.MAXINT, xmlrpclib.MININT)) | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 141 |         self.assertRaises(OverflowError, xmlrpclib.dumps, | 
 | 142 |                           (xmlrpclib.MAXINT+1,)) | 
 | 143 |         self.assertRaises(OverflowError, xmlrpclib.dumps, | 
 | 144 |                           (xmlrpclib.MININT-1,)) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 145 |  | 
 | 146 |         def dummy_write(s): | 
 | 147 |             pass | 
 | 148 |  | 
 | 149 |         m = xmlrpclib.Marshaller() | 
 | 150 |         m.dump_int(xmlrpclib.MAXINT, dummy_write) | 
 | 151 |         m.dump_int(xmlrpclib.MININT, dummy_write) | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 152 |         self.assertRaises(OverflowError, m.dump_int, | 
 | 153 |                           xmlrpclib.MAXINT+1, dummy_write) | 
 | 154 |         self.assertRaises(OverflowError, m.dump_int, | 
 | 155 |                           xmlrpclib.MININT-1, dummy_write) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 156 |  | 
| Florent Xicluna | 1917ea9 | 2012-07-07 17:03:25 +0200 | [diff] [blame] | 157 |     def test_dump_double(self): | 
 | 158 |         xmlrpclib.dumps((float(2 ** 34),)) | 
 | 159 |         xmlrpclib.dumps((float(xmlrpclib.MAXINT), | 
 | 160 |                          float(xmlrpclib.MININT))) | 
 | 161 |         xmlrpclib.dumps((float(xmlrpclib.MAXINT + 42), | 
 | 162 |                          float(xmlrpclib.MININT - 42))) | 
 | 163 |  | 
 | 164 |         def dummy_write(s): | 
 | 165 |             pass | 
 | 166 |  | 
 | 167 |         m = xmlrpclib.Marshaller() | 
 | 168 |         m.dump_double(xmlrpclib.MAXINT, dummy_write) | 
 | 169 |         m.dump_double(xmlrpclib.MININT, dummy_write) | 
 | 170 |         m.dump_double(xmlrpclib.MAXINT + 42, dummy_write) | 
 | 171 |         m.dump_double(xmlrpclib.MININT - 42, dummy_write) | 
 | 172 |  | 
| Andrew M. Kuchling | 0b85203 | 2003-04-25 00:27:24 +0000 | [diff] [blame] | 173 |     def test_dump_none(self): | 
 | 174 |         value = alist + [None] | 
 | 175 |         arg1 = (alist + [None],) | 
 | 176 |         strg = xmlrpclib.dumps(arg1, allow_none=True) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 177 |         self.assertEqual(value, | 
| Andrew M. Kuchling | 0b85203 | 2003-04-25 00:27:24 +0000 | [diff] [blame] | 178 |                           xmlrpclib.loads(strg)[0][0]) | 
 | 179 |         self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,)) | 
 | 180 |  | 
| Florent Xicluna | 6166519 | 2011-11-15 20:53:25 +0100 | [diff] [blame] | 181 |     def test_dump_bytes(self): | 
 | 182 |         sample = b"my dog has fleas" | 
 | 183 |         self.assertEqual(sample, xmlrpclib.Binary(sample)) | 
 | 184 |         for type_ in bytes, bytearray, xmlrpclib.Binary: | 
 | 185 |             value = type_(sample) | 
 | 186 |             s = xmlrpclib.dumps((value,)) | 
 | 187 |  | 
 | 188 |             result, m = xmlrpclib.loads(s, use_builtin_types=True) | 
 | 189 |             (newvalue,) = result | 
 | 190 |             self.assertEqual(newvalue, sample) | 
 | 191 |             self.assertIs(type(newvalue), bytes) | 
 | 192 |             self.assertIsNone(m) | 
 | 193 |  | 
 | 194 |             result, m = xmlrpclib.loads(s, use_builtin_types=False) | 
 | 195 |             (newvalue,) = result | 
 | 196 |             self.assertEqual(newvalue, sample) | 
 | 197 |             self.assertIs(type(newvalue), xmlrpclib.Binary) | 
 | 198 |             self.assertIsNone(m) | 
 | 199 |  | 
| Georg Brandl | c8dcfb6 | 2009-02-13 10:50:01 +0000 | [diff] [blame] | 200 |     def test_get_host_info(self): | 
 | 201 |         # see bug #3613, this raised a TypeError | 
 | 202 |         transp = xmlrpc.client.Transport() | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 203 |         self.assertEqual(transp.get_host_info("user@host.tld"), | 
| Georg Brandl | c8dcfb6 | 2009-02-13 10:50:01 +0000 | [diff] [blame] | 204 |                           ('host.tld', | 
 | 205 |                            [('Authorization', 'Basic dXNlcg==')], {})) | 
 | 206 |  | 
| Senthil Kumaran | 8ce1f1f | 2010-11-18 15:00:53 +0000 | [diff] [blame] | 207 |     def test_ssl_presence(self): | 
| Senthil Kumaran | 6a0b5c4 | 2010-11-18 17:08:48 +0000 | [diff] [blame] | 208 |         try: | 
 | 209 |             import ssl | 
| Antoine Pitrou | 98b644f | 2010-11-19 20:07:52 +0000 | [diff] [blame] | 210 |         except ImportError: | 
 | 211 |             has_ssl = False | 
| Senthil Kumaran | 8ce1f1f | 2010-11-18 15:00:53 +0000 | [diff] [blame] | 212 |         else: | 
| Senthil Kumaran | 6a0b5c4 | 2010-11-18 17:08:48 +0000 | [diff] [blame] | 213 |             has_ssl = True | 
| Senthil Kumaran | 8ce1f1f | 2010-11-18 15:00:53 +0000 | [diff] [blame] | 214 |         try: | 
 | 215 |             xmlrpc.client.ServerProxy('https://localhost:9999').bad_function() | 
| Senthil Kumaran | 6a0b5c4 | 2010-11-18 17:08:48 +0000 | [diff] [blame] | 216 |         except NotImplementedError: | 
 | 217 |             self.assertFalse(has_ssl, "xmlrpc client's error with SSL support") | 
 | 218 |         except socket.error: | 
 | 219 |             self.assertTrue(has_ssl) | 
| Ezio Melotti | e961593 | 2010-01-24 19:26:24 +0000 | [diff] [blame] | 220 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 221 | class HelperTestCase(unittest.TestCase): | 
 | 222 |     def test_escape(self): | 
 | 223 |         self.assertEqual(xmlrpclib.escape("a&b"), "a&b") | 
 | 224 |         self.assertEqual(xmlrpclib.escape("a<b"), "a<b") | 
 | 225 |         self.assertEqual(xmlrpclib.escape("a>b"), "a>b") | 
 | 226 |  | 
 | 227 | class FaultTestCase(unittest.TestCase): | 
 | 228 |     def test_repr(self): | 
 | 229 |         f = xmlrpclib.Fault(42, 'Test Fault') | 
 | 230 |         self.assertEqual(repr(f), "<Fault 42: 'Test Fault'>") | 
 | 231 |         self.assertEqual(repr(f), str(f)) | 
 | 232 |  | 
 | 233 |     def test_dump_fault(self): | 
 | 234 |         f = xmlrpclib.Fault(42, 'Test Fault') | 
 | 235 |         s = xmlrpclib.dumps((f,)) | 
 | 236 |         (newf,), m = xmlrpclib.loads(s) | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 237 |         self.assertEqual(newf, {'faultCode': 42, 'faultString': 'Test Fault'}) | 
 | 238 |         self.assertEqual(m, None) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 239 |  | 
 | 240 |         s = xmlrpclib.Marshaller().dumps(f) | 
 | 241 |         self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s) | 
 | 242 |  | 
| Christian Heimes | eda9e2b | 2007-12-08 22:32:47 +0000 | [diff] [blame] | 243 |     def test_dotted_attribute(self): | 
| Florent Xicluna | c4fec93 | 2011-10-30 20:19:32 +0100 | [diff] [blame] | 244 |         # this will raise AttributeError because code don't want us to use | 
| Christian Heimes | eda9e2b | 2007-12-08 22:32:47 +0000 | [diff] [blame] | 245 |         # private methods | 
 | 246 |         self.assertRaises(AttributeError, | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 247 |                           xmlrpc.server.resolve_dotted_attribute, str, '__add') | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 248 |         self.assertTrue(xmlrpc.server.resolve_dotted_attribute(str, 'title')) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 249 |  | 
 | 250 | class DateTimeTestCase(unittest.TestCase): | 
 | 251 |     def test_default(self): | 
 | 252 |         t = xmlrpclib.DateTime() | 
 | 253 |  | 
 | 254 |     def test_time(self): | 
 | 255 |         d = 1181399930.036952 | 
 | 256 |         t = xmlrpclib.DateTime(d) | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 257 |         self.assertEqual(str(t), | 
 | 258 |                          time.strftime("%Y%m%dT%H:%M:%S", time.localtime(d))) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 259 |  | 
 | 260 |     def test_time_tuple(self): | 
 | 261 |         d = (2007,6,9,10,38,50,5,160,0) | 
 | 262 |         t = xmlrpclib.DateTime(d) | 
 | 263 |         self.assertEqual(str(t), '20070609T10:38:50') | 
 | 264 |  | 
 | 265 |     def test_time_struct(self): | 
 | 266 |         d = time.localtime(1181399930.036952) | 
 | 267 |         t = xmlrpclib.DateTime(d) | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 268 |         self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", d)) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 269 |  | 
 | 270 |     def test_datetime_datetime(self): | 
 | 271 |         d = datetime.datetime(2007,1,2,3,4,5) | 
 | 272 |         t = xmlrpclib.DateTime(d) | 
 | 273 |         self.assertEqual(str(t), '20070102T03:04:05') | 
 | 274 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 275 |     def test_repr(self): | 
 | 276 |         d = datetime.datetime(2007,1,2,3,4,5) | 
 | 277 |         t = xmlrpclib.DateTime(d) | 
 | 278 |         val ="<DateTime '20070102T03:04:05' at %x>" % id(t) | 
 | 279 |         self.assertEqual(repr(t), val) | 
 | 280 |  | 
 | 281 |     def test_decode(self): | 
 | 282 |         d = ' 20070908T07:11:13  ' | 
 | 283 |         t1 = xmlrpclib.DateTime() | 
 | 284 |         t1.decode(d) | 
 | 285 |         tref = xmlrpclib.DateTime(datetime.datetime(2007,9,8,7,11,13)) | 
 | 286 |         self.assertEqual(t1, tref) | 
 | 287 |  | 
 | 288 |         t2 = xmlrpclib._datetime(d) | 
 | 289 |         self.assertEqual(t1, tref) | 
 | 290 |  | 
| Florent Xicluna | 3fa29f7 | 2011-10-30 20:18:50 +0100 | [diff] [blame] | 291 |     def test_comparison(self): | 
 | 292 |         now = datetime.datetime.now() | 
 | 293 |         dtime = xmlrpclib.DateTime(now.timetuple()) | 
 | 294 |  | 
 | 295 |         # datetime vs. DateTime | 
 | 296 |         self.assertTrue(dtime == now) | 
 | 297 |         self.assertTrue(now == dtime) | 
 | 298 |         then = now + datetime.timedelta(seconds=4) | 
 | 299 |         self.assertTrue(then >= dtime) | 
 | 300 |         self.assertTrue(dtime < then) | 
 | 301 |  | 
 | 302 |         # str vs. DateTime | 
 | 303 |         dstr = now.strftime("%Y%m%dT%H:%M:%S") | 
 | 304 |         self.assertTrue(dtime == dstr) | 
 | 305 |         self.assertTrue(dstr == dtime) | 
 | 306 |         dtime_then = xmlrpclib.DateTime(then.timetuple()) | 
 | 307 |         self.assertTrue(dtime_then >= dstr) | 
 | 308 |         self.assertTrue(dstr < dtime_then) | 
 | 309 |  | 
 | 310 |         # some other types | 
 | 311 |         dbytes = dstr.encode('ascii') | 
 | 312 |         dtuple = now.timetuple() | 
 | 313 |         with self.assertRaises(TypeError): | 
 | 314 |             dtime == 1970 | 
 | 315 |         with self.assertRaises(TypeError): | 
 | 316 |             dtime != dbytes | 
 | 317 |         with self.assertRaises(TypeError): | 
 | 318 |             dtime == bytearray(dbytes) | 
 | 319 |         with self.assertRaises(TypeError): | 
 | 320 |             dtime != dtuple | 
 | 321 |         with self.assertRaises(TypeError): | 
 | 322 |             dtime < float(1970) | 
 | 323 |         with self.assertRaises(TypeError): | 
 | 324 |             dtime > dbytes | 
 | 325 |         with self.assertRaises(TypeError): | 
 | 326 |             dtime <= bytearray(dbytes) | 
 | 327 |         with self.assertRaises(TypeError): | 
 | 328 |             dtime >= dtuple | 
 | 329 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 330 | class BinaryTestCase(unittest.TestCase): | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 331 |  | 
 | 332 |     # XXX What should str(Binary(b"\xff")) return?  I'm chosing "\xff" | 
 | 333 |     # for now (i.e. interpreting the binary data as Latin-1-encoded | 
 | 334 |     # text).  But this feels very unsatisfactory.  Perhaps we should | 
 | 335 |     # only define repr(), and return r"Binary(b'\xff')" instead? | 
 | 336 |  | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 337 |     def test_default(self): | 
 | 338 |         t = xmlrpclib.Binary() | 
 | 339 |         self.assertEqual(str(t), '') | 
 | 340 |  | 
 | 341 |     def test_string(self): | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 342 |         d = b'\x01\x02\x03abc123\xff\xfe' | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 343 |         t = xmlrpclib.Binary(d) | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 344 |         self.assertEqual(str(t), str(d, "latin-1")) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 345 |  | 
 | 346 |     def test_decode(self): | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 347 |         d = b'\x01\x02\x03abc123\xff\xfe' | 
| Georg Brandl | b54d801 | 2009-06-04 09:11:51 +0000 | [diff] [blame] | 348 |         de = base64.encodebytes(d) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 349 |         t1 = xmlrpclib.Binary() | 
 | 350 |         t1.decode(de) | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 351 |         self.assertEqual(str(t1), str(d, "latin-1")) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 352 |  | 
 | 353 |         t2 = xmlrpclib._binary(de) | 
| Guido van Rossum | 54a40cb | 2007-08-27 22:27:41 +0000 | [diff] [blame] | 354 |         self.assertEqual(str(t2), str(d, "latin-1")) | 
| Guido van Rossum | b5a755e | 2007-07-18 18:15:48 +0000 | [diff] [blame] | 355 |  | 
 | 356 |  | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 357 | ADDR = PORT = URL = None | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 358 |  | 
| Christian Heimes | af98da1 | 2008-01-27 15:18:18 +0000 | [diff] [blame] | 359 | # The evt is set twice.  First when the server is ready to serve. | 
 | 360 | # Second when the server has been shutdown.  The user must clear | 
 | 361 | # the event after it has been set the first time to catch the second set. | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 362 | def http_server(evt, numrequests, requestHandler=None): | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 363 |     class TestInstanceClass: | 
 | 364 |         def div(self, x, y): | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 365 |             return x // y | 
 | 366 |  | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 367 |         def _methodHelp(self, name): | 
 | 368 |             if name == 'div': | 
 | 369 |                 return 'This is the div function' | 
 | 370 |  | 
 | 371 |     def my_function(): | 
 | 372 |         '''This is my function''' | 
 | 373 |         return True | 
 | 374 |  | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 375 |     class MyXMLRPCServer(xmlrpc.server.SimpleXMLRPCServer): | 
| Christian Heimes | bbe741d | 2008-03-28 10:53:29 +0000 | [diff] [blame] | 376 |         def get_request(self): | 
 | 377 |             # Ensure the socket is always non-blocking.  On Linux, socket | 
 | 378 |             # attributes are not inherited like they are on *BSD and Windows. | 
 | 379 |             s, port = self.socket.accept() | 
 | 380 |             s.setblocking(True) | 
 | 381 |             return s, port | 
 | 382 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 383 |     if not requestHandler: | 
 | 384 |         requestHandler = xmlrpc.server.SimpleXMLRPCRequestHandler | 
 | 385 |     serv = MyXMLRPCServer(("localhost", 0), requestHandler, | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 386 |                           logRequests=False, bind_and_activate=False) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 387 |     try: | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 388 |         serv.server_bind() | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 389 |         global ADDR, PORT, URL | 
 | 390 |         ADDR, PORT = serv.socket.getsockname() | 
 | 391 |         #connect to IP address directly.  This avoids socket.create_connection() | 
| Ezio Melotti | e130a52 | 2011-10-19 10:58:56 +0300 | [diff] [blame] | 392 |         #trying to connect to "localhost" using all address families, which | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 393 |         #causes slowdown e.g. on vista which supports AF_INET6.  The server listens | 
 | 394 |         #on AF_INET only. | 
 | 395 |         URL = "http://%s:%d"%(ADDR, PORT) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 396 |         serv.server_activate() | 
 | 397 |         serv.register_introspection_functions() | 
 | 398 |         serv.register_multicall_functions() | 
 | 399 |         serv.register_function(pow) | 
 | 400 |         serv.register_function(lambda x,y: x+y, 'add') | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 401 |         serv.register_function(my_function) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 402 |         serv.register_instance(TestInstanceClass()) | 
| Christian Heimes | af98da1 | 2008-01-27 15:18:18 +0000 | [diff] [blame] | 403 |         evt.set() | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 404 |  | 
 | 405 |         # handle up to 'numrequests' requests | 
 | 406 |         while numrequests > 0: | 
 | 407 |             serv.handle_request() | 
 | 408 |             numrequests -= 1 | 
 | 409 |  | 
 | 410 |     except socket.timeout: | 
 | 411 |         pass | 
 | 412 |     finally: | 
 | 413 |         serv.socket.close() | 
 | 414 |         PORT = None | 
 | 415 |         evt.set() | 
 | 416 |  | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 417 | def http_multi_server(evt, numrequests, requestHandler=None): | 
 | 418 |     class TestInstanceClass: | 
 | 419 |         def div(self, x, y): | 
 | 420 |             return x // y | 
 | 421 |  | 
 | 422 |         def _methodHelp(self, name): | 
 | 423 |             if name == 'div': | 
 | 424 |                 return 'This is the div function' | 
 | 425 |  | 
 | 426 |     def my_function(): | 
 | 427 |         '''This is my function''' | 
 | 428 |         return True | 
 | 429 |  | 
 | 430 |     class MyXMLRPCServer(xmlrpc.server.MultiPathXMLRPCServer): | 
 | 431 |         def get_request(self): | 
 | 432 |             # Ensure the socket is always non-blocking.  On Linux, socket | 
 | 433 |             # attributes are not inherited like they are on *BSD and Windows. | 
 | 434 |             s, port = self.socket.accept() | 
 | 435 |             s.setblocking(True) | 
 | 436 |             return s, port | 
 | 437 |  | 
 | 438 |     if not requestHandler: | 
 | 439 |         requestHandler = xmlrpc.server.SimpleXMLRPCRequestHandler | 
 | 440 |     class MyRequestHandler(requestHandler): | 
 | 441 |         rpc_paths = [] | 
 | 442 |  | 
| Florent Xicluna | 3fa29f7 | 2011-10-30 20:18:50 +0100 | [diff] [blame] | 443 |     class BrokenDispatcher: | 
 | 444 |         def _marshaled_dispatch(self, data, dispatch_method=None, path=None): | 
 | 445 |             raise RuntimeError("broken dispatcher") | 
 | 446 |  | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 447 |     serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler, | 
 | 448 |                           logRequests=False, bind_and_activate=False) | 
 | 449 |     serv.socket.settimeout(3) | 
 | 450 |     serv.server_bind() | 
 | 451 |     try: | 
 | 452 |         global ADDR, PORT, URL | 
 | 453 |         ADDR, PORT = serv.socket.getsockname() | 
 | 454 |         #connect to IP address directly.  This avoids socket.create_connection() | 
| Ezio Melotti | e130a52 | 2011-10-19 10:58:56 +0300 | [diff] [blame] | 455 |         #trying to connect to "localhost" using all address families, which | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 456 |         #causes slowdown e.g. on vista which supports AF_INET6.  The server listens | 
 | 457 |         #on AF_INET only. | 
 | 458 |         URL = "http://%s:%d"%(ADDR, PORT) | 
 | 459 |         serv.server_activate() | 
 | 460 |         paths = ["/foo", "/foo/bar"] | 
 | 461 |         for path in paths: | 
 | 462 |             d = serv.add_dispatcher(path, xmlrpc.server.SimpleXMLRPCDispatcher()) | 
 | 463 |             d.register_introspection_functions() | 
 | 464 |             d.register_multicall_functions() | 
 | 465 |         serv.get_dispatcher(paths[0]).register_function(pow) | 
 | 466 |         serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add') | 
| Florent Xicluna | 3fa29f7 | 2011-10-30 20:18:50 +0100 | [diff] [blame] | 467 |         serv.add_dispatcher("/is/broken", BrokenDispatcher()) | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 468 |         evt.set() | 
 | 469 |  | 
 | 470 |         # handle up to 'numrequests' requests | 
 | 471 |         while numrequests > 0: | 
 | 472 |             serv.handle_request() | 
 | 473 |             numrequests -= 1 | 
 | 474 |  | 
 | 475 |     except socket.timeout: | 
 | 476 |         pass | 
 | 477 |     finally: | 
 | 478 |         serv.socket.close() | 
 | 479 |         PORT = None | 
 | 480 |         evt.set() | 
 | 481 |  | 
| Christian Heimes | af98da1 | 2008-01-27 15:18:18 +0000 | [diff] [blame] | 482 | # This function prevents errors like: | 
 | 483 | #    <ProtocolError for localhost:57527/RPC2: 500 Internal Server Error> | 
 | 484 | def is_unavailable_exception(e): | 
 | 485 |     '''Returns True if the given ProtocolError is the product of a server-side | 
 | 486 |        exception caused by the 'temporarily unavailable' response sometimes | 
 | 487 |        given by operations on non-blocking sockets.''' | 
 | 488 |  | 
 | 489 |     # sometimes we get a -1 error code and/or empty headers | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 490 |     try: | 
 | 491 |         if e.errcode == -1 or e.headers is None: | 
 | 492 |             return True | 
 | 493 |         exc_mess = e.headers.get('X-exception') | 
 | 494 |     except AttributeError: | 
 | 495 |         # Ignore socket.errors here. | 
 | 496 |         exc_mess = str(e) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 497 |  | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 498 |     if exc_mess and 'temporarily unavailable' in exc_mess.lower(): | 
 | 499 |         return True | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 500 |  | 
| R. David Murray | 378c0cf | 2010-02-24 01:46:21 +0000 | [diff] [blame] | 501 | def make_request_and_skipIf(condition, reason): | 
 | 502 |     # If we skip the test, we have to make a request because the | 
 | 503 |     # the server created in setUp blocks expecting one to come in. | 
 | 504 |     if not condition: | 
 | 505 |         return lambda func: func | 
 | 506 |     def decorator(func): | 
 | 507 |         def make_request_and_skip(self): | 
 | 508 |             try: | 
 | 509 |                 xmlrpclib.ServerProxy(URL).my_function() | 
 | 510 |             except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 511 |                 if not is_unavailable_exception(e): | 
 | 512 |                     raise | 
 | 513 |             raise unittest.SkipTest(reason) | 
 | 514 |         return make_request_and_skip | 
 | 515 |     return decorator | 
 | 516 |  | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 517 | @unittest.skipUnless(threading, 'Threading required for this test.') | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 518 | class BaseServerTestCase(unittest.TestCase): | 
 | 519 |     requestHandler = None | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 520 |     request_count = 1 | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 521 |     threadFunc = staticmethod(http_server) | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 522 |  | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 523 |     def setUp(self): | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 524 |         # enable traceback reporting | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 525 |         xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = True | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 526 |  | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 527 |         self.evt = threading.Event() | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 528 |         # start server thread to handle requests | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 529 |         serv_args = (self.evt, self.request_count, self.requestHandler) | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 530 |         threading.Thread(target=self.threadFunc, args=serv_args).start() | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 531 |  | 
| Christian Heimes | af98da1 | 2008-01-27 15:18:18 +0000 | [diff] [blame] | 532 |         # wait for the server to be ready | 
 | 533 |         self.evt.wait() | 
 | 534 |         self.evt.clear() | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 535 |  | 
 | 536 |     def tearDown(self): | 
 | 537 |         # wait on the server thread to terminate | 
| Charles-François Natali | cd96b4f | 2012-02-18 14:53:41 +0100 | [diff] [blame] | 538 |         self.evt.wait() | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 539 |  | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 540 |         # disable traceback reporting | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 541 |         xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 542 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 543 | class SimpleServerTestCase(BaseServerTestCase): | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 544 |     def test_simple1(self): | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 545 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 546 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 547 |             self.assertEqual(p.pow(6,8), 6**8) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 548 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 549 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 550 |             if not is_unavailable_exception(e): | 
 | 551 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 552 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 553 |  | 
| Senthil Kumaran | b3af08f | 2009-04-01 20:20:43 +0000 | [diff] [blame] | 554 |     def test_nonascii(self): | 
 | 555 |         start_string = 'P\N{LATIN SMALL LETTER Y WITH CIRCUMFLEX}t' | 
 | 556 |         end_string = 'h\N{LATIN SMALL LETTER O WITH HORN}n' | 
 | 557 |         try: | 
 | 558 |             p = xmlrpclib.ServerProxy(URL) | 
 | 559 |             self.assertEqual(p.add(start_string, end_string), | 
 | 560 |                              start_string + end_string) | 
 | 561 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 562 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 563 |             if not is_unavailable_exception(e): | 
 | 564 |                 # protocol error; provide additional information in test output | 
 | 565 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
 | 566 |  | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 567 |     # [ch] The test 404 is causing lots of false alarms. | 
 | 568 |     def XXXtest_404(self): | 
| Georg Brandl | 2442015 | 2008-05-26 16:32:26 +0000 | [diff] [blame] | 569 |         # send POST with http.client, it should return 404 header and | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 570 |         # 'Not Found' message. | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 571 |         conn = httplib.client.HTTPConnection(ADDR, PORT) | 
| Christian Heimes | 99d73f2 | 2007-12-08 16:13:06 +0000 | [diff] [blame] | 572 |         conn.request('POST', '/this-is-not-valid') | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 573 |         response = conn.getresponse() | 
 | 574 |         conn.close() | 
 | 575 |  | 
 | 576 |         self.assertEqual(response.status, 404) | 
 | 577 |         self.assertEqual(response.reason, 'Not Found') | 
 | 578 |  | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 579 |     def test_introspection1(self): | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 580 |         expected_methods = set(['pow', 'div', 'my_function', 'add', | 
 | 581 |                                 'system.listMethods', 'system.methodHelp', | 
 | 582 |                                 'system.methodSignature', 'system.multicall']) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 583 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 584 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 585 |             meth = p.system.listMethods() | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 586 |             self.assertEqual(set(meth), expected_methods) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 587 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 588 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 589 |             if not is_unavailable_exception(e): | 
 | 590 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 591 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 592 |  | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 593 |  | 
 | 594 |     def test_introspection2(self): | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 595 |         try: | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 596 |             # test _methodHelp() | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 597 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 598 |             divhelp = p.system.methodHelp('div') | 
 | 599 |             self.assertEqual(divhelp, 'This is the div function') | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 600 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 601 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 602 |             if not is_unavailable_exception(e): | 
 | 603 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 604 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 605 |  | 
| R. David Murray | 378c0cf | 2010-02-24 01:46:21 +0000 | [diff] [blame] | 606 |     @make_request_and_skipIf(sys.flags.optimize >= 2, | 
 | 607 |                      "Docstrings are omitted with -O2 and above") | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 608 |     def test_introspection3(self): | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 609 |         try: | 
 | 610 |             # test native doc | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 611 |             p = xmlrpclib.ServerProxy(URL) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 612 |             myfunction = p.system.methodHelp('my_function') | 
 | 613 |             self.assertEqual(myfunction, 'This is my function') | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 614 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 615 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 616 |             if not is_unavailable_exception(e): | 
 | 617 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 618 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 619 |  | 
 | 620 |     def test_introspection4(self): | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 621 |         # the SimpleXMLRPCServer doesn't support signatures, but | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 622 |         # at least check that we can try making the call | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 623 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 624 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 625 |             divsig = p.system.methodSignature('div') | 
 | 626 |             self.assertEqual(divsig, 'signatures not supported') | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 627 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 628 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 629 |             if not is_unavailable_exception(e): | 
 | 630 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 631 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 632 |  | 
 | 633 |     def test_multicall(self): | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 634 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 635 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 636 |             multicall = xmlrpclib.MultiCall(p) | 
 | 637 |             multicall.add(2,3) | 
 | 638 |             multicall.pow(6,8) | 
 | 639 |             multicall.div(127,42) | 
 | 640 |             add_result, pow_result, div_result = multicall() | 
 | 641 |             self.assertEqual(add_result, 2+3) | 
 | 642 |             self.assertEqual(pow_result, 6**8) | 
 | 643 |             self.assertEqual(div_result, 127//42) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 644 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 645 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 646 |             if not is_unavailable_exception(e): | 
 | 647 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 648 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 649 |  | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 650 |     def test_non_existing_multicall(self): | 
 | 651 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 652 |             p = xmlrpclib.ServerProxy(URL) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 653 |             multicall = xmlrpclib.MultiCall(p) | 
 | 654 |             multicall.this_is_not_exists() | 
 | 655 |             result = multicall() | 
 | 656 |  | 
 | 657 |             # result.results contains; | 
| Martin v. Löwis | 250ad61 | 2008-04-07 05:43:42 +0000 | [diff] [blame] | 658 |             # [{'faultCode': 1, 'faultString': '<class \'exceptions.Exception\'>:' | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 659 |             #   'method "this_is_not_exists" is not supported'>}] | 
 | 660 |  | 
 | 661 |             self.assertEqual(result.results[0]['faultCode'], 1) | 
 | 662 |             self.assertEqual(result.results[0]['faultString'], | 
| Martin v. Löwis | 250ad61 | 2008-04-07 05:43:42 +0000 | [diff] [blame] | 663 |                 '<class \'Exception\'>:method "this_is_not_exists" ' | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 664 |                 'is not supported') | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 665 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 666 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 667 |             if not is_unavailable_exception(e): | 
 | 668 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 669 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 670 |  | 
| Christian Heimes | fe337bf | 2008-03-23 21:54:12 +0000 | [diff] [blame] | 671 |     def test_dotted_attribute(self): | 
 | 672 |         # Raises an AttributeError because private methods are not allowed. | 
 | 673 |         self.assertRaises(AttributeError, | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 674 |                           xmlrpc.server.resolve_dotted_attribute, str, '__add') | 
| Christian Heimes | fe337bf | 2008-03-23 21:54:12 +0000 | [diff] [blame] | 675 |  | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 676 |         self.assertTrue(xmlrpc.server.resolve_dotted_attribute(str, 'title')) | 
| Christian Heimes | fe337bf | 2008-03-23 21:54:12 +0000 | [diff] [blame] | 677 |         # Get the test to run faster by sending a request with test_simple1. | 
 | 678 |         # This avoids waiting for the socket timeout. | 
 | 679 |         self.test_simple1() | 
 | 680 |  | 
| Victor Stinner | da6eb53 | 2011-09-23 01:29:44 +0200 | [diff] [blame] | 681 |     def test_unicode_host(self): | 
 | 682 |         server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT)) | 
 | 683 |         self.assertEqual(server.add("a", "\xe9"), "a\xe9") | 
 | 684 |  | 
| Charles-François Natali | cd96b4f | 2012-02-18 14:53:41 +0100 | [diff] [blame] | 685 |     def test_partial_post(self): | 
 | 686 |         # Check that a partial POST doesn't make the server loop: issue #14001. | 
 | 687 |         conn = http.client.HTTPConnection(ADDR, PORT) | 
 | 688 |         conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') | 
 | 689 |         conn.close() | 
 | 690 |  | 
 | 691 |  | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 692 | class MultiPathServerTestCase(BaseServerTestCase): | 
 | 693 |     threadFunc = staticmethod(http_multi_server) | 
 | 694 |     request_count = 2 | 
 | 695 |     def test_path1(self): | 
 | 696 |         p = xmlrpclib.ServerProxy(URL+"/foo") | 
 | 697 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 698 |         self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) | 
| Florent Xicluna | 3fa29f7 | 2011-10-30 20:18:50 +0100 | [diff] [blame] | 699 |  | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 700 |     def test_path2(self): | 
 | 701 |         p = xmlrpclib.ServerProxy(URL+"/foo/bar") | 
 | 702 |         self.assertEqual(p.add(6,8), 6+8) | 
 | 703 |         self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) | 
 | 704 |  | 
| Florent Xicluna | 3fa29f7 | 2011-10-30 20:18:50 +0100 | [diff] [blame] | 705 |     def test_path3(self): | 
 | 706 |         p = xmlrpclib.ServerProxy(URL+"/is/broken") | 
 | 707 |         self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) | 
 | 708 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 709 | #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism | 
 | 710 | #does indeed serve subsequent requests on the same connection | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 711 | class BaseKeepaliveServerTestCase(BaseServerTestCase): | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 712 |     #a request handler that supports keep-alive and logs requests into a | 
 | 713 |     #class variable | 
 | 714 |     class RequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): | 
 | 715 |         parentClass = xmlrpc.server.SimpleXMLRPCRequestHandler | 
 | 716 |         protocol_version = 'HTTP/1.1' | 
 | 717 |         myRequests = [] | 
 | 718 |         def handle(self): | 
 | 719 |             self.myRequests.append([]) | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 720 |             self.reqidx = len(self.myRequests)-1 | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 721 |             return self.parentClass.handle(self) | 
 | 722 |         def handle_one_request(self): | 
 | 723 |             result = self.parentClass.handle_one_request(self) | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 724 |             self.myRequests[self.reqidx].append(self.raw_requestline) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 725 |             return result | 
 | 726 |  | 
 | 727 |     requestHandler = RequestHandler | 
 | 728 |     def setUp(self): | 
 | 729 |         #clear request log | 
 | 730 |         self.RequestHandler.myRequests = [] | 
 | 731 |         return BaseServerTestCase.setUp(self) | 
 | 732 |  | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 733 | #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism | 
 | 734 | #does indeed serve subsequent requests on the same connection | 
 | 735 | class KeepaliveServerTestCase1(BaseKeepaliveServerTestCase): | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 736 |     def test_two(self): | 
 | 737 |         p = xmlrpclib.ServerProxy(URL) | 
| Kristján Valur Jónsson | 1bbb19a | 2009-07-11 21:57:16 +0000 | [diff] [blame] | 738 |         #do three requests. | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 739 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 740 |         self.assertEqual(p.pow(6,8), 6**8) | 
| Kristján Valur Jónsson | 1bbb19a | 2009-07-11 21:57:16 +0000 | [diff] [blame] | 741 |         self.assertEqual(p.pow(6,8), 6**8) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 742 |         p("close")() | 
| Kristján Valur Jónsson | 1bbb19a | 2009-07-11 21:57:16 +0000 | [diff] [blame] | 743 |  | 
 | 744 |         #they should have all been handled by a single request handler | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 745 |         self.assertEqual(len(self.RequestHandler.myRequests), 1) | 
| Kristján Valur Jónsson | 1bbb19a | 2009-07-11 21:57:16 +0000 | [diff] [blame] | 746 |  | 
 | 747 |         #check that we did at least two (the third may be pending append | 
 | 748 |         #due to thread scheduling) | 
 | 749 |         self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 750 |  | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 751 |  | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 752 | #test special attribute access on the serverproxy, through the __call__ | 
 | 753 | #function. | 
 | 754 | class KeepaliveServerTestCase2(BaseKeepaliveServerTestCase): | 
 | 755 |     #ask for two keepalive requests to be handled. | 
 | 756 |     request_count=2 | 
 | 757 |  | 
 | 758 |     def test_close(self): | 
 | 759 |         p = xmlrpclib.ServerProxy(URL) | 
 | 760 |         #do some requests with close. | 
 | 761 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 762 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 763 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 764 |         p("close")() #this should trigger a new keep-alive request | 
 | 765 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 766 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 767 |         self.assertEqual(p.pow(6,8), 6**8) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 768 |         p("close")() | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 769 |  | 
 | 770 |         #they should have all been two request handlers, each having logged at least | 
 | 771 |         #two complete requests | 
 | 772 |         self.assertEqual(len(self.RequestHandler.myRequests), 2) | 
 | 773 |         self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2) | 
 | 774 |         self.assertGreaterEqual(len(self.RequestHandler.myRequests[-2]), 2) | 
 | 775 |  | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 776 |  | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 777 |     def test_transport(self): | 
 | 778 |         p = xmlrpclib.ServerProxy(URL) | 
 | 779 |         #do some requests with close. | 
 | 780 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 781 |         p("transport").close() #same as above, really. | 
 | 782 |         self.assertEqual(p.pow(6,8), 6**8) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 783 |         p("close")() | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 784 |         self.assertEqual(len(self.RequestHandler.myRequests), 2) | 
 | 785 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 786 | #A test case that verifies that gzip encoding works in both directions | 
 | 787 | #(for a request and the response) | 
 | 788 | class GzipServerTestCase(BaseServerTestCase): | 
 | 789 |     #a request handler that supports keep-alive and logs requests into a | 
 | 790 |     #class variable | 
 | 791 |     class RequestHandler(xmlrpc.server.SimpleXMLRPCRequestHandler): | 
 | 792 |         parentClass = xmlrpc.server.SimpleXMLRPCRequestHandler | 
 | 793 |         protocol_version = 'HTTP/1.1' | 
 | 794 |  | 
 | 795 |         def do_POST(self): | 
 | 796 |             #store content of last request in class | 
 | 797 |             self.__class__.content_length = int(self.headers["content-length"]) | 
 | 798 |             return self.parentClass.do_POST(self) | 
 | 799 |     requestHandler = RequestHandler | 
 | 800 |  | 
 | 801 |     class Transport(xmlrpclib.Transport): | 
 | 802 |         #custom transport, stores the response length for our perusal | 
 | 803 |         fake_gzip = False | 
 | 804 |         def parse_response(self, response): | 
 | 805 |             self.response_length=int(response.getheader("content-length", 0)) | 
 | 806 |             return xmlrpclib.Transport.parse_response(self, response) | 
 | 807 |  | 
 | 808 |         def send_content(self, connection, body): | 
 | 809 |             if self.fake_gzip: | 
 | 810 |                 #add a lone gzip header to induce decode error remotely | 
 | 811 |                 connection.putheader("Content-Encoding", "gzip") | 
 | 812 |             return xmlrpclib.Transport.send_content(self, connection, body) | 
 | 813 |  | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 814 |     def setUp(self): | 
 | 815 |         BaseServerTestCase.setUp(self) | 
 | 816 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 817 |     def test_gzip_request(self): | 
 | 818 |         t = self.Transport() | 
 | 819 |         t.encode_threshold = None | 
 | 820 |         p = xmlrpclib.ServerProxy(URL, transport=t) | 
 | 821 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 822 |         a = self.RequestHandler.content_length | 
 | 823 |         t.encode_threshold = 0 #turn on request encoding | 
 | 824 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 825 |         b = self.RequestHandler.content_length | 
 | 826 |         self.assertTrue(a>b) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 827 |         p("close")() | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 828 |  | 
 | 829 |     def test_bad_gzip_request(self): | 
 | 830 |         t = self.Transport() | 
 | 831 |         t.encode_threshold = None | 
 | 832 |         t.fake_gzip = True | 
 | 833 |         p = xmlrpclib.ServerProxy(URL, transport=t) | 
| Ezio Melotti | ed3a7d2 | 2010-12-01 02:32:32 +0000 | [diff] [blame] | 834 |         cm = self.assertRaisesRegex(xmlrpclib.ProtocolError, | 
 | 835 |                                     re.compile(r"\b400\b")) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 836 |         with cm: | 
 | 837 |             p.pow(6, 8) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 838 |         p("close")() | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 839 |  | 
 | 840 |     def test_gsip_response(self): | 
 | 841 |         t = self.Transport() | 
 | 842 |         p = xmlrpclib.ServerProxy(URL, transport=t) | 
 | 843 |         old = self.requestHandler.encode_threshold | 
 | 844 |         self.requestHandler.encode_threshold = None #no encoding | 
 | 845 |         self.assertEqual(p.pow(6,8), 6**8) | 
 | 846 |         a = t.response_length | 
 | 847 |         self.requestHandler.encode_threshold = 0 #always encode | 
 | 848 |         self.assertEqual(p.pow(6,8), 6**8) | 
| Victor Stinner | a935e8f | 2011-01-03 14:30:44 +0000 | [diff] [blame] | 849 |         p("close")() | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 850 |         b = t.response_length | 
 | 851 |         self.requestHandler.encode_threshold = old | 
 | 852 |         self.assertTrue(a>b) | 
 | 853 |  | 
 | 854 | #Test special attributes of the ServerProxy object | 
 | 855 | class ServerProxyTestCase(unittest.TestCase): | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 856 |     def setUp(self): | 
 | 857 |         unittest.TestCase.setUp(self) | 
 | 858 |         if threading: | 
 | 859 |             self.url = URL | 
 | 860 |         else: | 
 | 861 |             # Without threading, http_server() and http_multi_server() will not | 
 | 862 |             # be executed and URL is still equal to None. 'http://' is a just | 
 | 863 |             # enough to choose the scheme (HTTP) | 
 | 864 |             self.url = 'http://' | 
 | 865 |  | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 866 |     def test_close(self): | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 867 |         p = xmlrpclib.ServerProxy(self.url) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 868 |         self.assertEqual(p('close')(), None) | 
 | 869 |  | 
 | 870 |     def test_transport(self): | 
 | 871 |         t = xmlrpclib.Transport() | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 872 |         p = xmlrpclib.ServerProxy(self.url, transport=t) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 873 |         self.assertEqual(p('transport'), t) | 
 | 874 |  | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 875 | # This is a contrived way to make a failure occur on the server side | 
 | 876 | # in order to test the _send_traceback_header flag on the server | 
| Barry Warsaw | 820c120 | 2008-06-12 04:06:45 +0000 | [diff] [blame] | 877 | class FailingMessageClass(http.client.HTTPMessage): | 
 | 878 |     def get(self, key, failobj=None): | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 879 |         key = key.lower() | 
 | 880 |         if key == 'content-length': | 
 | 881 |             return 'I am broken' | 
| Barry Warsaw | 820c120 | 2008-06-12 04:06:45 +0000 | [diff] [blame] | 882 |         return super().get(key, failobj) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 883 |  | 
 | 884 |  | 
| Victor Stinner | 45df820 | 2010-04-28 22:31:17 +0000 | [diff] [blame] | 885 | @unittest.skipUnless(threading, 'Threading required for this test.') | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 886 | class FailingServerTestCase(unittest.TestCase): | 
 | 887 |     def setUp(self): | 
 | 888 |         self.evt = threading.Event() | 
 | 889 |         # start server thread to handle requests | 
| Guido van Rossum | 15c9746 | 2007-11-02 16:10:06 +0000 | [diff] [blame] | 890 |         serv_args = (self.evt, 1) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 891 |         threading.Thread(target=http_server, args=serv_args).start() | 
 | 892 |  | 
| Christian Heimes | af98da1 | 2008-01-27 15:18:18 +0000 | [diff] [blame] | 893 |         # wait for the server to be ready | 
 | 894 |         self.evt.wait() | 
 | 895 |         self.evt.clear() | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 896 |  | 
 | 897 |     def tearDown(self): | 
 | 898 |         # wait on the server thread to terminate | 
 | 899 |         self.evt.wait() | 
 | 900 |         # reset flag | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 901 |         xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 902 |         # reset message class | 
| Barry Warsaw | 820c120 | 2008-06-12 04:06:45 +0000 | [diff] [blame] | 903 |         default_class = http.client.HTTPMessage | 
 | 904 |         xmlrpc.server.SimpleXMLRPCRequestHandler.MessageClass = default_class | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 905 |  | 
 | 906 |     def test_basic(self): | 
 | 907 |         # check that flag is false by default | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 908 |         flagval = xmlrpc.server.SimpleXMLRPCServer._send_traceback_header | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 909 |         self.assertEqual(flagval, False) | 
 | 910 |  | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 911 |         # enable traceback reporting | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 912 |         xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = True | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 913 |  | 
 | 914 |         # test a call that shouldn't fail just as a smoke test | 
 | 915 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 916 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 04110fb | 2007-08-24 16:32:05 +0000 | [diff] [blame] | 917 |             self.assertEqual(p.pow(6,8), 6**8) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 918 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 919 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
 | 920 |             if not is_unavailable_exception(e): | 
 | 921 |                 # protocol error; provide additional information in test output | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 922 |                 self.fail("%s\n%s" % (e, getattr(e, "headers", ""))) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 923 |  | 
 | 924 |     def test_fail_no_info(self): | 
 | 925 |         # use the broken message class | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 926 |         xmlrpc.server.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 927 |  | 
 | 928 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 929 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 930 |             p.pow(6,8) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 931 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 932 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 933 |             if not is_unavailable_exception(e) and hasattr(e, "headers"): | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 934 |                 # The two server-side error headers shouldn't be sent back in this case | 
 | 935 |                 self.assertTrue(e.headers.get("X-exception") is None) | 
 | 936 |                 self.assertTrue(e.headers.get("X-traceback") is None) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 937 |         else: | 
 | 938 |             self.fail('ProtocolError not raised') | 
 | 939 |  | 
 | 940 |     def test_fail_with_info(self): | 
 | 941 |         # use the broken message class | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 942 |         xmlrpc.server.SimpleXMLRPCRequestHandler.MessageClass = FailingMessageClass | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 943 |  | 
 | 944 |         # Check that errors in the server send back exception/traceback | 
 | 945 |         # info when flag is set | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 946 |         xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = True | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 947 |  | 
 | 948 |         try: | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 949 |             p = xmlrpclib.ServerProxy(URL) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 950 |             p.pow(6,8) | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 951 |         except (xmlrpclib.ProtocolError, socket.error) as e: | 
 | 952 |             # ignore failures due to non-blocking socket 'unavailable' errors | 
| Christian Heimes | 2685563 | 2008-01-27 23:50:43 +0000 | [diff] [blame] | 953 |             if not is_unavailable_exception(e) and hasattr(e, "headers"): | 
| Christian Heimes | 412dc9c | 2008-01-27 18:55:54 +0000 | [diff] [blame] | 954 |                 # We should get error info in the response | 
 | 955 |                 expected_err = "invalid literal for int() with base 10: 'I am broken'" | 
| Barry Warsaw | 820c120 | 2008-06-12 04:06:45 +0000 | [diff] [blame] | 956 |                 self.assertEqual(e.headers.get("X-exception"), expected_err) | 
 | 957 |                 self.assertTrue(e.headers.get("X-traceback") is not None) | 
| Guido van Rossum | 61e21b5 | 2007-08-20 19:06:03 +0000 | [diff] [blame] | 958 |         else: | 
 | 959 |             self.fail('ProtocolError not raised') | 
 | 960 |  | 
| R. David Murray | 0548ce0 | 2009-10-26 08:24:14 +0000 | [diff] [blame] | 961 |  | 
 | 962 | @contextlib.contextmanager | 
 | 963 | def captured_stdout(encoding='utf-8'): | 
 | 964 |     """A variation on support.captured_stdout() which gives a text stream | 
 | 965 |     having a `buffer` attribute. | 
 | 966 |     """ | 
 | 967 |     import io | 
 | 968 |     orig_stdout = sys.stdout | 
 | 969 |     sys.stdout = io.TextIOWrapper(io.BytesIO(), encoding=encoding) | 
 | 970 |     try: | 
 | 971 |         yield sys.stdout | 
 | 972 |     finally: | 
 | 973 |         sys.stdout = orig_stdout | 
 | 974 |  | 
 | 975 |  | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 976 | class CGIHandlerTestCase(unittest.TestCase): | 
 | 977 |     def setUp(self): | 
| Georg Brandl | 38eceaa | 2008-05-26 11:14:17 +0000 | [diff] [blame] | 978 |         self.cgi = xmlrpc.server.CGIXMLRPCRequestHandler() | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 979 |  | 
 | 980 |     def tearDown(self): | 
 | 981 |         self.cgi = None | 
 | 982 |  | 
 | 983 |     def test_cgi_get(self): | 
| Walter Dörwald | b525e18 | 2009-04-26 21:39:21 +0000 | [diff] [blame] | 984 |         with support.EnvironmentVarGuard() as env: | 
| Walter Dörwald | 155374d | 2009-05-01 19:58:58 +0000 | [diff] [blame] | 985 |             env['REQUEST_METHOD'] = 'GET' | 
| Walter Dörwald | b525e18 | 2009-04-26 21:39:21 +0000 | [diff] [blame] | 986 |             # if the method is GET and no request_text is given, it runs handle_get | 
 | 987 |             # get sysout output | 
| R. David Murray | 0548ce0 | 2009-10-26 08:24:14 +0000 | [diff] [blame] | 988 |             with captured_stdout(encoding=self.cgi.encoding) as data_out: | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 989 |                 self.cgi.handle_request() | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 990 |  | 
| Walter Dörwald | b525e18 | 2009-04-26 21:39:21 +0000 | [diff] [blame] | 991 |             # parse Status header | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 992 |             data_out.seek(0) | 
 | 993 |             handle = data_out.read() | 
| Walter Dörwald | b525e18 | 2009-04-26 21:39:21 +0000 | [diff] [blame] | 994 |             status = handle.split()[1] | 
 | 995 |             message = ' '.join(handle.split()[2:4]) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 996 |  | 
| Walter Dörwald | b525e18 | 2009-04-26 21:39:21 +0000 | [diff] [blame] | 997 |             self.assertEqual(status, '400') | 
 | 998 |             self.assertEqual(message, 'Bad Request') | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 999 |  | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 1000 |  | 
 | 1001 |     def test_cgi_xmlrpc_response(self): | 
 | 1002 |         data = """<?xml version='1.0'?> | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 1003 |         <methodCall> | 
 | 1004 |             <methodName>test_method</methodName> | 
 | 1005 |             <params> | 
 | 1006 |                 <param> | 
 | 1007 |                     <value><string>foo</string></value> | 
 | 1008 |                 </param> | 
 | 1009 |                 <param> | 
 | 1010 |                     <value><string>bar</string></value> | 
 | 1011 |                 </param> | 
 | 1012 |             </params> | 
 | 1013 |         </methodCall> | 
 | 1014 |         """ | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 1015 |  | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 1016 |         with support.EnvironmentVarGuard() as env, \ | 
| R. David Murray | 0548ce0 | 2009-10-26 08:24:14 +0000 | [diff] [blame] | 1017 |              captured_stdout(encoding=self.cgi.encoding) as data_out, \ | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 1018 |              support.captured_stdin() as data_in: | 
 | 1019 |             data_in.write(data) | 
 | 1020 |             data_in.seek(0) | 
| Walter Dörwald | 155374d | 2009-05-01 19:58:58 +0000 | [diff] [blame] | 1021 |             env['CONTENT_LENGTH'] = str(len(data)) | 
| Georg Brandl | c748506 | 2009-04-01 15:53:15 +0000 | [diff] [blame] | 1022 |             self.cgi.handle_request() | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 1023 |         data_out.seek(0) | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 1024 |  | 
 | 1025 |         # will respond exception, if so, our goal is achieved ;) | 
| Nick Coghlan | 6ead552 | 2009-10-18 13:19:33 +0000 | [diff] [blame] | 1026 |         handle = data_out.read() | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 1027 |  | 
| Jeremy Hylton | 1afc169 | 2008-06-18 20:49:58 +0000 | [diff] [blame] | 1028 |         # start with 44th char so as not to get http header, we just | 
 | 1029 |         # need only xml | 
| Christian Heimes | 255f53b | 2007-12-08 15:33:56 +0000 | [diff] [blame] | 1030 |         self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, handle[44:]) | 
 | 1031 |  | 
| Senthil Kumaran | b3af08f | 2009-04-01 20:20:43 +0000 | [diff] [blame] | 1032 |         # Also test the content-length returned  by handle_request | 
 | 1033 |         # Using the same test method inorder to avoid all the datapassing | 
 | 1034 |         # boilerplate code. | 
 | 1035 |         # Test for bug: http://bugs.python.org/issue5040 | 
 | 1036 |  | 
 | 1037 |         content = handle[handle.find("<?xml"):] | 
 | 1038 |  | 
| Ezio Melotti | b3aedd4 | 2010-11-20 19:04:17 +0000 | [diff] [blame] | 1039 |         self.assertEqual( | 
| Senthil Kumaran | b3af08f | 2009-04-01 20:20:43 +0000 | [diff] [blame] | 1040 |             int(re.search('Content-Length: (\d+)', handle).group(1)), | 
 | 1041 |             len(content)) | 
 | 1042 |  | 
| Senthil Kumaran | b3af08f | 2009-04-01 20:20:43 +0000 | [diff] [blame] | 1043 |  | 
| Florent Xicluna | 1b7458b | 2011-12-09 22:35:06 +0100 | [diff] [blame] | 1044 | class UseBuiltinTypesTestCase(unittest.TestCase): | 
 | 1045 |  | 
 | 1046 |     def test_use_builtin_types(self): | 
 | 1047 |         # SimpleXMLRPCDispatcher.__init__ accepts use_builtin_types, which | 
 | 1048 |         # makes all dispatch of binary data as bytes instances, and all | 
 | 1049 |         # dispatch of datetime argument as datetime.datetime instances. | 
 | 1050 |         self.log = [] | 
 | 1051 |         expected_bytes = b"my dog has fleas" | 
 | 1052 |         expected_date = datetime.datetime(2008, 5, 26, 18, 25, 12) | 
 | 1053 |         marshaled = xmlrpclib.dumps((expected_bytes, expected_date), 'foobar') | 
 | 1054 |         def foobar(*args): | 
 | 1055 |             self.log.extend(args) | 
 | 1056 |         handler = xmlrpc.server.SimpleXMLRPCDispatcher( | 
 | 1057 |             allow_none=True, encoding=None, use_builtin_types=True) | 
 | 1058 |         handler.register_function(foobar) | 
 | 1059 |         handler._marshaled_dispatch(marshaled) | 
 | 1060 |         self.assertEqual(len(self.log), 2) | 
 | 1061 |         mybytes, mydate = self.log | 
 | 1062 |         self.assertEqual(self.log, [expected_bytes, expected_date]) | 
 | 1063 |         self.assertIs(type(mydate), datetime.datetime) | 
 | 1064 |         self.assertIs(type(mybytes), bytes) | 
 | 1065 |  | 
 | 1066 |     def test_cgihandler_has_use_builtin_types_flag(self): | 
 | 1067 |         handler = xmlrpc.server.CGIXMLRPCRequestHandler(use_builtin_types=True) | 
 | 1068 |         self.assertTrue(handler.use_builtin_types) | 
 | 1069 |  | 
 | 1070 |     def test_xmlrpcserver_has_use_builtin_types_flag(self): | 
 | 1071 |         server = xmlrpc.server.SimpleXMLRPCServer(("localhost", 0), | 
 | 1072 |             use_builtin_types=True) | 
 | 1073 |         server.server_close() | 
 | 1074 |         self.assertTrue(server.use_builtin_types) | 
 | 1075 |  | 
 | 1076 |  | 
| Antoine Pitrou | e03866f | 2009-10-30 17:58:27 +0000 | [diff] [blame] | 1077 | @support.reap_threads | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 1078 | def test_main(): | 
 | 1079 |     xmlrpc_tests = [XMLRPCTestCase, HelperTestCase, DateTimeTestCase, | 
 | 1080 |          BinaryTestCase, FaultTestCase] | 
| Florent Xicluna | 1b7458b | 2011-12-09 22:35:06 +0100 | [diff] [blame] | 1081 |     xmlrpc_tests.append(UseBuiltinTypesTestCase) | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 1082 |     xmlrpc_tests.append(SimpleServerTestCase) | 
| Kristján Valur Jónsson | f6087ca | 2009-07-12 22:45:18 +0000 | [diff] [blame] | 1083 |     xmlrpc_tests.append(KeepaliveServerTestCase1) | 
 | 1084 |     xmlrpc_tests.append(KeepaliveServerTestCase2) | 
| Kristján Valur Jónsson | aefde24 | 2009-07-19 22:29:24 +0000 | [diff] [blame] | 1085 |     try: | 
 | 1086 |         import gzip | 
 | 1087 |         xmlrpc_tests.append(GzipServerTestCase) | 
 | 1088 |     except ImportError: | 
 | 1089 |         pass #gzip not supported in this build | 
| Kristján Valur Jónsson | 1f2a1ae | 2009-12-16 10:50:44 +0000 | [diff] [blame] | 1090 |     xmlrpc_tests.append(MultiPathServerTestCase) | 
| Kristján Valur Jónsson | 985fc6a | 2009-07-01 10:01:31 +0000 | [diff] [blame] | 1091 |     xmlrpc_tests.append(ServerProxyTestCase) | 
| Benjamin Peterson | e1cdfd7 | 2009-01-18 21:02:37 +0000 | [diff] [blame] | 1092 |     xmlrpc_tests.append(FailingServerTestCase) | 
 | 1093 |     xmlrpc_tests.append(CGIHandlerTestCase) | 
| Guido van Rossum | af554a0 | 2007-08-16 23:48:43 +0000 | [diff] [blame] | 1094 |  | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 1095 |     support.run_unittest(*xmlrpc_tests) | 
| Skip Montanaro | 419abda | 2001-10-01 17:47:44 +0000 | [diff] [blame] | 1096 |  | 
 | 1097 | if __name__ == "__main__": | 
 | 1098 |     test_main() |