Skip to content

Commit fa84378

Browse files
authored
Update some of changed libs and tests from 3.14.5 -> 3.14.6 (part 3) (RustPython#8086)
1 parent 057e968 commit fa84378

12 files changed

Lines changed: 263 additions & 105 deletions

Lib/test/test_bytes.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2622,10 +2622,6 @@ def iconcat(b, a): # MODIFIES!
26222622
b.wait()
26232623
a += c
26242624

2625-
def irepeat(b, a): # MODIFIES!
2626-
b.wait()
2627-
a *= 2
2628-
26292625
def subscript(b, a):
26302626
b.wait()
26312627
try: assert a[0] != 0xdd
@@ -2747,9 +2743,10 @@ def check(funcs, a=None, *args):
27472743

27482744
check([clear] + [repeat] * 10)
27492745
check([clear] + [iconcat] * 10)
2750-
check([clear] + [irepeat] * 10)
27512746
check([clear] + [ass_subscript] * 10)
27522747
check([clear] + [repr_] * 10)
2748+
# gh-148605: Do not test "a *= 2" since it allocates up to 4 GiB using
2749+
# 10 threads
27532750

27542751
# value errors
27552752

Lib/test/test_bz2.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,22 @@ def test_failure(self):
10331033
# Previously, a second call could crash due to internal inconsistency
10341034
self.assertRaises(Exception, bzd.decompress, self.BAD_DATA * 30)
10351035

1036+
@unittest.expectedFailure # TODO: RUSTPYTHON; Wrong error message
1037+
def test_decompress_after_data_error(self):
1038+
data = bytes.fromhex(
1039+
"425a6839314159265359000000000000007fffff000000000000000000000000"
1040+
"00000000000000000000000000000000000000e0370000000000000000000000"
1041+
"000000000000000000000000000000000000000000000000000083f3"
1042+
)
1043+
bzd = BZ2Decompressor()
1044+
with self.assertRaisesRegex(OSError, "Invalid data stream"):
1045+
bzd.decompress(data)
1046+
# Previously, a second call could crash due to internal inconsistency
1047+
self.assertFalse(bzd.needs_input)
1048+
self.assertFalse(bzd.eof)
1049+
with self.assertRaisesRegex(ValueError, "previous error"):
1050+
bzd.decompress(b'\x00' * 18)
1051+
10361052
@support.refcount_test
10371053
def test_refleaks_in___init__(self):
10381054
gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount')

Lib/test/test_cmd_line.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,7 @@ def test_python_legacy_windows_stdio(self):
10141014
p = subprocess.run([sys.executable, "-c", code],
10151015
creationflags=subprocess.CREATE_NEW_CONSOLE,
10161016
env=env)
1017+
support.skip_on_low_desktop_heap_memory_subprocess(p.returncode)
10171018
self.assertEqual(p.returncode, 0)
10181019

10191020
# Then test that FIleIO is used when PYTHONLEGACYWINDOWSSTDIO is set.
@@ -1022,6 +1023,7 @@ def test_python_legacy_windows_stdio(self):
10221023
p = subprocess.run([sys.executable, "-c", code],
10231024
creationflags=subprocess.CREATE_NEW_CONSOLE,
10241025
env=env)
1026+
support.skip_on_low_desktop_heap_memory_subprocess(p.returncode)
10251027
self.assertEqual(p.returncode, 0)
10261028

10271029
@unittest.expectedFailure # TODO: RUSTPYTHON

Lib/test/test_deque.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,22 @@ def test_index(self):
287287
else:
288288
self.assertEqual(d.index(element, start, stop), target)
289289

290+
# Test stop argument
291+
for elem in d:
292+
index = d.index(elem)
293+
self.assertEqual(
294+
index,
295+
d.index(elem, 0),
296+
)
297+
self.assertEqual(
298+
index,
299+
d.index(elem, 0, len(d)),
300+
)
301+
self.assertEqual(
302+
index,
303+
d.index(elem, 0, len(d) + 100),
304+
)
305+
290306
# Test large start argument
291307
d = deque(range(0, 10000, 10))
292308
for step in range(100):

Lib/test/test_genericalias.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,14 @@
5555
from unittest.case import _AssertRaisesContext
5656
from queue import Queue, SimpleQueue
5757
from weakref import WeakSet, ReferenceType, ref
58-
import typing
59-
from typing import Unpack
6058
try:
6159
from tkinter import Event
6260
except ImportError:
6361
Event = None
6462
from string.templatelib import Template, Interpolation
6563

66-
from typing import TypeVar
64+
import typing
65+
from typing import TypeVar, Unpack
6766
T = TypeVar('T')
6867
K = TypeVar('K')
6968
V = TypeVar('V')
@@ -619,6 +618,14 @@ def test_nested_paramspec_specialization(self):
619618
self.assertEqual(deeply_nested_specialized.__args__, ([str, [float], int], float))
620619
self.assertEqual(deeply_nested_specialized.__parameters__, ())
621620

621+
def test_gh150146(self):
622+
# It used to crash:
623+
for container in [memoryview, list, tuple]:
624+
with self.subTest(container=container):
625+
x = container[TypeVar("")]
626+
with self.assertRaises(TypeError):
627+
x[*typing.Mapping[..., ...]]
628+
622629

623630
class TypeIterationTests(unittest.TestCase):
624631
_UNITERABLE_TYPES = (list, tuple)

Lib/test/test_grp.py

Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Test script for the grp module."""
22

3+
import random
4+
import string
35
import unittest
46
from test.support import import_helper
57

@@ -47,64 +49,55 @@ def test_values_extended(self):
4749
# Discovered on Ubuntu 5.04 (custom).
4850
self.assertEqual(e2.gr_name.lower(), name.lower())
4951

52+
@unittest.expectedFailure # TODO: RUSTPYTHON; KeyError: 'getgrgid: group id 340282366920938463463374607431768211456 not found'
5053
def test_errors(self):
5154
self.assertRaises(TypeError, grp.getgrgid)
5255
self.assertRaises(TypeError, grp.getgrgid, 3.14)
56+
self.assertRaises(TypeError, grp.getgrgid, 0.0)
57+
self.assertRaises(TypeError, grp.getgrgid, 0, 0)
58+
# should be out of gid_t range
59+
self.assertRaises(OverflowError, grp.getgrgid, 2**128)
60+
self.assertRaises(OverflowError, grp.getgrgid, -2**128)
5361
self.assertRaises(TypeError, grp.getgrnam)
5462
self.assertRaises(TypeError, grp.getgrnam, 42)
55-
self.assertRaises(TypeError, grp.getgrall, 42)
63+
self.assertRaises(TypeError, grp.getgrnam, b'root')
64+
self.assertRaises(TypeError, grp.getgrnam, 'root', 0)
5665
# embedded null character
5766
self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'a\x00b')
67+
self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'root\x00')
68+
self.assertRaises(UnicodeEncodeError, grp.getgrnam, 'roo\udc74')
69+
self.assertRaises(KeyError, grp.getgrnam, '')
70+
self.assertRaises(TypeError, grp.getgrall, 42)
5871

59-
# try to get some errors
60-
bynames = {}
61-
bygids = {}
62-
for (n, p, g, mem) in grp.getgrall():
63-
if not n or n == '+':
64-
continue # skip NIS entries etc.
65-
bynames[n] = g
66-
bygids[g] = n
67-
68-
allnames = list(bynames.keys())
69-
namei = 0
70-
fakename = allnames[namei]
71-
while fakename in bynames:
72-
chars = list(fakename)
73-
for i in range(len(chars)):
74-
if chars[i] == 'z':
75-
chars[i] = 'A'
76-
break
77-
elif chars[i] == 'Z':
78-
continue
72+
# Find a non-existent group name.
73+
# getgrall() will not necessarily report all existing groups
74+
# (typical for LDAP based directories in big organizations).
75+
for _ in range(30):
76+
fakename = ''.join(random.choices(string.ascii_lowercase, k=6))
77+
try:
78+
grp.getgrnam(fakename)
79+
except KeyError:
80+
break
81+
else:
82+
self.fail('Cannot find non-existent group name')
83+
84+
# Find a non-existent gid.
85+
maxgid = 2**31
86+
for _ in range(30):
87+
fakegid = random.randrange(maxgid)
88+
try:
89+
grp.getgrgid(fakegid)
90+
except KeyError:
91+
break
92+
except OverflowError:
93+
if maxgid == 2**31:
94+
maxgid = 2**16-1
95+
elif maxgid == 2**16-1:
96+
maxgid = 2**15
7997
else:
80-
chars[i] = chr(ord(chars[i]) + 1)
81-
break
82-
else:
83-
namei = namei + 1
84-
try:
85-
fakename = allnames[namei]
86-
except IndexError:
87-
# should never happen... if so, just forget it
88-
break
89-
fakename = ''.join(chars)
90-
91-
self.assertRaises(KeyError, grp.getgrnam, fakename)
92-
93-
# Choose a non-existent gid.
94-
fakegid = 4127
95-
while fakegid in bygids:
96-
fakegid = (fakegid * 3) % 0x10000
97-
98-
self.assertRaises(KeyError, grp.getgrgid, fakegid)
99-
100-
def test_noninteger_gid(self):
101-
entries = grp.getgrall()
102-
if not entries:
103-
self.skipTest('no groups')
104-
# Choose an existent gid.
105-
gid = entries[0][2]
106-
self.assertRaises(TypeError, grp.getgrgid, float(gid))
107-
self.assertRaises(TypeError, grp.getgrgid, str(gid))
98+
raise
99+
else:
100+
self.fail('Cannot find non-existent gid')
108101

109102

110103
if __name__ == "__main__":

Lib/test/test_imaplib.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,16 @@ def cmd_AUTHENTICATE(self, tag, args):
435435
r'\[AUTHENTICATIONFAILED\] invalid'):
436436
client.authenticate('MYAUTH', lambda x: b'fake')
437437

438+
def test_invalid_login(self):
439+
class MyServer(SimpleIMAPHandler):
440+
def cmd_LOGIN(self, tag, args):
441+
self.server.logged = args[0]
442+
self._send_tagged(tag, 'NO', '[LOGIN] failed')
443+
client, _ = self._setup(MyServer)
444+
with self.assertRaisesRegex(imaplib.IMAP4.error,
445+
r'\[LOGIN\] failed'):
446+
client.login('user', 'wrongpass')
447+
438448
def test_valid_authentication_bytes(self):
439449
class MyServer(SimpleIMAPHandler):
440450
def cmd_AUTHENTICATE(self, tag, args):

Lib/test/test_import/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,15 @@ def test_import_raises_ModuleNotFoundError(self):
360360
with self.assertRaises(ModuleNotFoundError):
361361
import something_that_should_not_exist_anywhere
362362

363+
def test_import_null_byte_in_name_raises_ModuleNotFoundError(self):
364+
# gh-150633: module names containing null bytes should not
365+
# lead to duplicates in sys.modules
366+
before = set(sys.modules.keys())
367+
with self.assertRaises(ModuleNotFoundError):
368+
__import__('zipimport\x00junk')
369+
370+
self.assertEqual(set(sys.modules.keys()), before)
371+
363372
def test_from_import_missing_module_raises_ModuleNotFoundError(self):
364373
with self.assertRaises(ModuleNotFoundError):
365374
from something_that_should_not_exist_anywhere import blah

Lib/test/test_listcomps.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,17 @@ def test_references___class__(self):
171171
"""
172172
self._check_in_scopes(code, raises=NameError)
173173

174+
def test_references___class___nested(self):
175+
code = """
176+
res = [(lambda: __class__)() for _ in [1]]
177+
"""
178+
self._check_in_scopes(code, raises=NameError)
179+
180+
def test_references___class___nested_used(self):
181+
class _C:
182+
res = [lambda: __class__ for _ in [1]]
183+
self.assertIs(_C.res[0](), _C)
184+
174185
def test_references___class___defined(self):
175186
code = """
176187
__class__ = 2
@@ -180,18 +191,41 @@ def test_references___class___defined(self):
180191
code, outputs={"res": [2]}, scopes=["module", "function"])
181192
self._check_in_scopes(code, raises=NameError, scopes=["class"])
182193

194+
def test_references___class___defined_nested(self):
195+
code = """
196+
__class__ = 2
197+
res = [(lambda: __class__)() for x in [1]]
198+
"""
199+
self._check_in_scopes(
200+
code, outputs={"res": [2]}, scopes=["module", "function"])
201+
self._check_in_scopes(code, raises=NameError, scopes=["class"])
202+
183203
def test_references___classdict__(self):
184204
code = """
185205
class i: [__classdict__ for x in y]
186206
"""
187207
self._check_in_scopes(code, raises=NameError)
188208

209+
@unittest.expectedFailure # TODO: RUSTPYTHON; SyntaxError: compiler_make_closure: cannot find '__classdict__' in parent vars
210+
def test_references___classdict___nested(self):
211+
class _C:
212+
# res = [(lambda: __classdict__)() for _ in [1]] # TODO: RUSTPYTHON
213+
pass # TODO: RUSTPYTHON
214+
self.assertIn("res", _C.res[0])
215+
189216
def test_references___conditional_annotations__(self):
190217
code = """
191218
class i: [__conditional_annotations__ for x in y]
192219
"""
193220
self._check_in_scopes(code, raises=NameError)
194221

222+
@unittest.expectedFailure # TODO: RUSTPYTHON; SyntaxError: compiler_make_closure: cannot find '__conditional_annotations__' in parent vars
223+
def test_references___conditional_annotations___nested(self):
224+
code = """
225+
class i: [lambda: __conditional_annotations__ for x in y]
226+
"""
227+
self._check_in_scopes(code, raises=NameError)
228+
195229
def test_references___class___enclosing(self):
196230
code = """
197231
__class__ = 2

Lib/test/test_memoryio.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,25 @@ def test_setstate(self):
987987
memio.close()
988988
self.assertRaises(ValueError, memio.__setstate__, ("closed", "", 0, None))
989989

990+
def test_write_str_subclass(self):
991+
# Writing a str subclass should use the subclass's unicode data
992+
# directly, not call __str__ on it (which may return a different
993+
# value). gh-149047
994+
class MyStr(str):
995+
def __str__(self):
996+
return "WRONG"
997+
998+
s = MyStr("correct")
999+
memio = self.ioclass()
1000+
memio.write(s)
1001+
self.assertEqual(memio.getvalue(), "correct")
1002+
1003+
# Also test the fast path where pos == string_size (STATE_ACCUMULATING)
1004+
memio2 = self.ioclass()
1005+
memio2.write(MyStr("hello "))
1006+
memio2.write(MyStr("world"))
1007+
self.assertEqual(memio2.getvalue(), "hello world")
1008+
9901009
@unittest.expectedFailure # TODO: RUSTPYTHON; +
9911010
def test_issue5265(self):
9921011
return super().test_issue5265()

0 commit comments

Comments
 (0)