diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 25a4be0e039..8684e042bee 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -25,6 +25,8 @@
except ImportError:
gzip = None
+support.requires_working_socket(module=True)
+
alist = [{'astring': 'foo@bar.baz.spam',
'afloat': 7283.43,
'anint': 2**20,
@@ -45,15 +47,13 @@
class XMLRPCTestCase(unittest.TestCase):
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_load(self):
dump = xmlrpclib.dumps((alist,))
load = xmlrpclib.loads(dump)
self.assertEqual(alist, load[0][0])
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_bare_datetime(self):
# This checks that an unwrapped datetime.date object can be handled
# by the marshalling code. This can't be done via test_dump_load()
@@ -88,8 +88,7 @@ def test_dump_bare_datetime(self):
self.assertIsNone(m)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_datetime_before_1900(self):
# same as before but with a date before 1900
dt = datetime.datetime(1, 2, 10, 11, 41, 23)
@@ -108,8 +107,7 @@ def test_datetime_before_1900(self):
self.assertIs(type(newdt), xmlrpclib.DateTime)
self.assertIsNone(m)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_bug_1164912 (self):
d = xmlrpclib.DateTime()
((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,),
@@ -120,8 +118,7 @@ def test_bug_1164912 (self):
s = xmlrpclib.dumps((new_d,), methodresponse=True)
self.assertIsInstance(s, str)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_newstyle_class(self):
class T(object):
pass
@@ -187,8 +184,7 @@ def dummy_write(s):
m.dump_double(xmlrpclib.MAXINT + 42, dummy_write)
m.dump_double(xmlrpclib.MININT - 42, dummy_write)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_none(self):
value = alist + [None]
arg1 = (alist + [None],)
@@ -197,8 +193,7 @@ def test_dump_none(self):
xmlrpclib.loads(strg)[0][0])
self.assertRaises(TypeError, xmlrpclib.dumps, (arg1,))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_encoding(self):
value = {'key\u20ac\xa4':
'value\u20ac\xa4'}
@@ -220,8 +215,7 @@ def test_dump_encoding(self):
self.assertEqual(xmlrpclib.loads(strg)[0][0], value)
self.assertEqual(xmlrpclib.loads(strg)[1], methodname)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_bytes(self):
sample = b"my dog has fleas"
self.assertEqual(sample, xmlrpclib.Binary(sample))
@@ -241,8 +235,7 @@ def test_dump_bytes(self):
self.assertIs(type(newvalue), xmlrpclib.Binary)
self.assertIsNone(m)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_loads_unsupported(self):
ResponseError = xmlrpclib.ResponseError
data = ''
@@ -265,8 +258,7 @@ def check_loads(self, s, value, **kwargs):
self.assertIs(type(newvalue), type(value))
self.assertIsNone(m)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_load_standard_types(self):
check = self.check_loads
check('string', 'string')
@@ -294,8 +286,7 @@ def test_load_standard_types(self):
'a1'
'', {'a': 1, 'b': 2})
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_load_extension_types(self):
check = self.check_loads
check('', None)
@@ -309,6 +300,17 @@ def test_load_extension_types(self):
check('9876543210.0123456789',
decimal.Decimal('9876543210.0123456789'))
+ @unittest.expectedFailure # TODO: RUSTPYTHON; NameError: name 'expat' is not defined
+ def test_limit_int(self):
+ check = self.check_loads
+ maxdigits = 5000
+ with support.adjust_int_max_str_digits(maxdigits):
+ s = '1' * (maxdigits + 1)
+ with self.assertRaises(ValueError):
+ check(f'{s}', None)
+ with self.assertRaises(ValueError):
+ check(f'{s}', None)
+
def test_get_host_info(self):
# see bug #3613, this raised a TypeError
transp = xmlrpc.client.Transport()
@@ -330,8 +332,7 @@ def test_ssl_presence(self):
except OSError:
self.assertTrue(has_ssl)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_keepalive_disconnect(self):
class RequestHandler(http.server.BaseHTTPRequestHandler):
protocol_version = "HTTP/1.1"
@@ -471,8 +472,7 @@ def test_repr(self):
self.assertEqual(repr(f), "")
self.assertEqual(repr(f), str(f))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dump_fault(self):
f = xmlrpclib.Fault(42, 'Test Fault')
s = xmlrpclib.dumps((f,))
@@ -518,10 +518,16 @@ def test_time_struct(self):
self.assertEqual(str(t), time.strftime("%Y%m%dT%H:%M:%S", d))
def test_datetime_datetime(self):
+ # naive (no tzinfo)
d = datetime.datetime(2007,1,2,3,4,5)
t = xmlrpclib.DateTime(d)
self.assertEqual(str(t), '20070102T03:04:05')
+ # aware (with tzinfo): the timezone is ignored
+ d = datetime.datetime(2023, 6, 12, 13, 30, tzinfo=datetime.UTC)
+ t = xmlrpclib.DateTime(d)
+ self.assertEqual(str(t), '20230612T13:30:00')
+
def test_repr(self):
d = datetime.datetime(2007,1,2,3,4,5)
t = xmlrpclib.DateTime(d)
@@ -814,8 +820,7 @@ def tearDown(self):
xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False
class SimpleServerTestCase(BaseServerTestCase):
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_simple1(self):
try:
p = xmlrpclib.ServerProxy(URL)
@@ -826,8 +831,7 @@ def test_simple1(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_nonascii(self):
start_string = 'P\N{LATIN SMALL LETTER Y WITH CIRCUMFLEX}t'
end_string = 'h\N{LATIN SMALL LETTER O WITH HORN}n'
@@ -841,8 +845,7 @@ def test_nonascii(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_client_encoding(self):
start_string = '\u20ac'
end_string = '\xa4'
@@ -857,8 +860,7 @@ def test_client_encoding(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_nonascii_methodname(self):
try:
p = xmlrpclib.ServerProxy(URL, encoding='ascii')
@@ -879,8 +881,7 @@ def test_404(self):
self.assertEqual(response.status, 404)
self.assertEqual(response.reason, 'Not Found')
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_introspection1(self):
expected_methods = set(['pow', 'div', 'my_function', 'add', 'têšt',
'system.listMethods', 'system.methodHelp',
@@ -897,8 +898,7 @@ def test_introspection1(self):
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_introspection2(self):
try:
# test _methodHelp()
@@ -911,8 +911,7 @@ def test_introspection2(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
@make_request_and_skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")
def test_introspection3(self):
@@ -927,8 +926,7 @@ def test_introspection3(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_introspection4(self):
# the SimpleXMLRPCServer doesn't support signatures, but
# at least check that we can try making the call
@@ -942,8 +940,7 @@ def test_introspection4(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_multicall(self):
try:
p = xmlrpclib.ServerProxy(URL)
@@ -961,8 +958,7 @@ def test_multicall(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_non_existing_multicall(self):
try:
p = xmlrpclib.ServerProxy(URL)
@@ -984,8 +980,7 @@ def test_non_existing_multicall(self):
# protocol error; provide additional information in test output
self.fail("%s\n%s" % (e, getattr(e, "headers", "")))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_dotted_attribute(self):
# Raises an AttributeError because private methods are not allowed.
self.assertRaises(AttributeError,
@@ -996,16 +991,14 @@ def test_dotted_attribute(self):
# This avoids waiting for the socket timeout.
self.test_simple1()
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_allow_dotted_names_true(self):
# XXX also need allow_dotted_names_false test.
server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT))
data = server.Fixture.getData()
self.assertEqual(data, '42')
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_unicode_host(self):
server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT))
self.assertEqual(server.add("a", "\xe9"), "a\xe9")
@@ -1020,8 +1013,7 @@ def test_partial_post(self):
'Accept-Encoding: identity\r\n'
'Content-Length: 0\r\n\r\n'.encode('ascii'))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_context_manager(self):
with xmlrpclib.ServerProxy(URL) as server:
server.add(2, 3)
@@ -1030,8 +1022,7 @@ def test_context_manager(self):
self.assertEqual(server('transport')._connection,
(None, None))
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_context_manager_method_error(self):
try:
with xmlrpclib.ServerProxy(URL) as server:
@@ -1047,8 +1038,7 @@ class SimpleServerEncodingTestCase(BaseServerTestCase):
def threadFunc(evt, numrequests, requestHandler=None, encoding=None):
http_server(evt, numrequests, requestHandler, 'iso-8859-15')
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_server_encoding(self):
start_string = '\u20ac'
end_string = '\xa4'
@@ -1067,70 +1057,68 @@ def test_server_encoding(self):
class MultiPathServerTestCase(BaseServerTestCase):
threadFunc = staticmethod(http_multi_server)
request_count = 2
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_path1(self):
p = xmlrpclib.ServerProxy(URL+"/foo")
self.assertEqual(p.pow(6,8), 6**8)
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_path2(self):
p = xmlrpclib.ServerProxy(URL+"/foo/bar")
self.assertEqual(p.add(6,8), 6+8)
self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_path3(self):
p = xmlrpclib.ServerProxy(URL+"/is/broken")
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_invalid_path(self):
p = xmlrpclib.ServerProxy(URL+"/invalid")
self.assertRaises(xmlrpclib.Fault, p.add, 6, 8)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_path_query_fragment(self):
p = xmlrpclib.ServerProxy(URL+"/foo?k=v#frag")
self.assertEqual(p.test(), "/foo?k=v#frag")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_path_fragment(self):
p = xmlrpclib.ServerProxy(URL+"/foo#frag")
self.assertEqual(p.test(), "/foo#frag")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_path_query(self):
p = xmlrpclib.ServerProxy(URL+"/foo?k=v")
self.assertEqual(p.test(), "/foo?k=v")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_empty_path(self):
p = xmlrpclib.ServerProxy(URL)
self.assertEqual(p.test(), "/RPC2")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_root_path(self):
p = xmlrpclib.ServerProxy(URL + "/")
self.assertEqual(p.test(), "/")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_empty_path_query(self):
p = xmlrpclib.ServerProxy(URL + "?k=v")
self.assertEqual(p.test(), "?k=v")
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
+ @support.requires_resource('walltime')
def test_empty_path_fragment(self):
p = xmlrpclib.ServerProxy(URL + "#frag")
self.assertEqual(p.test(), "#frag")
@@ -1163,8 +1151,7 @@ def setUp(self):
#A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism
#does indeed serve subsequent requests on the same connection
class KeepaliveServerTestCase1(BaseKeepaliveServerTestCase):
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_two(self):
p = xmlrpclib.ServerProxy(URL)
#do three requests.
@@ -1181,9 +1168,9 @@ def test_two(self):
self.assertGreaterEqual(len(self.RequestHandler.myRequests[-1]), 2)
-@unittest.skip("TODO: RUSTPYTHON, appears to hang")
#test special attribute access on the serverproxy, through the __call__
#function.
+@unittest.skip("TODO: RUSTPYTHON, appears to hang")
class KeepaliveServerTestCase2(BaseKeepaliveServerTestCase):
#ask for two keepalive requests to be handled.
request_count=2
@@ -1248,8 +1235,7 @@ def send_content(self, connection, body):
def setUp(self):
BaseServerTestCase.setUp(self)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_gzip_request(self):
t = self.Transport()
t.encode_threshold = None
@@ -1273,8 +1259,7 @@ def test_bad_gzip_request(self):
p.pow(6, 8)
p("close")()
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_gzip_response(self):
t = self.Transport()
p = xmlrpclib.ServerProxy(URL, transport=t)
@@ -1333,8 +1318,7 @@ def assertContainsAdditionalHeaders(self, headers, additional):
for key, value in additional.items():
self.assertEqual(headers.get(key), value)
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_header(self):
p = xmlrpclib.ServerProxy(URL, headers=[('X-Test', 'foo')])
self.assertEqual(p.pow(6, 8), 6**8)
@@ -1342,8 +1326,7 @@ def test_header(self):
headers = self.RequestHandler.test_headers
self.assertContainsAdditionalHeaders(headers, {'X-Test': 'foo'})
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_header_many(self):
p = xmlrpclib.ServerProxy(
URL, headers=[('X-Test', 'foo'), ('X-Test-Second', 'bar')])
@@ -1353,8 +1336,7 @@ def test_header_many(self):
self.assertContainsAdditionalHeaders(
headers, {'X-Test': 'foo', 'X-Test-Second': 'bar'})
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_header_empty(self):
p = xmlrpclib.ServerProxy(URL, headers=[])
self.assertEqual(p.pow(6, 8), 6**8)
@@ -1362,8 +1344,7 @@ def test_header_empty(self):
headers = self.RequestHandler.test_headers
self.assertContainsAdditionalHeaders(headers, {})
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_header_tuple(self):
p = xmlrpclib.ServerProxy(URL, headers=(('X-Test', 'foo'),))
self.assertEqual(p.pow(6, 8), 6**8)
@@ -1371,8 +1352,7 @@ def test_header_tuple(self):
headers = self.RequestHandler.test_headers
self.assertContainsAdditionalHeaders(headers, {'X-Test': 'foo'})
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_header_items(self):
p = xmlrpclib.ServerProxy(URL, headers={'X-Test': 'foo'}.items())
self.assertEqual(p.pow(6, 8), 6**8)
@@ -1431,8 +1411,7 @@ def tearDown(self):
default_class = http.client.HTTPMessage
xmlrpc.server.SimpleXMLRPCRequestHandler.MessageClass = default_class
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_basic(self):
# check that flag is false by default
flagval = xmlrpc.server.SimpleXMLRPCServer._send_traceback_header
@@ -1527,8 +1506,7 @@ def test_cgi_get(self):
self.assertEqual(message, 'Bad Request')
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_cgi_xmlrpc_response(self):
data = """
@@ -1574,8 +1552,7 @@ def test_cgi_xmlrpc_response(self):
class UseBuiltinTypesTestCase(unittest.TestCase):
- # TODO: RUSTPYTHON
- @unittest.expectedFailure
+ @unittest.expectedFailure # TODO: RUSTPYTHON
def test_use_builtin_types(self):
# SimpleXMLRPCDispatcher.__init__ accepts use_builtin_types, which
# makes all dispatch of binary data as bytes instances, and all