mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
gh-127146: Update test skips for Emscripten 4.0.2 (#129474)
Updates test skips to reflect capabilities of Emscripten 4.0.2.
This commit is contained in:
parent
23cda58348
commit
cf288e3c25
5 changed files with 63 additions and 70 deletions
|
@ -161,7 +161,6 @@ class GenericTest:
|
||||||
self.assertIs(self.pathmodule.lexists(path=filename), True)
|
self.assertIs(self.pathmodule.lexists(path=filename), True)
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
@unittest.skipIf(is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
def test_exists_fd(self):
|
def test_exists_fd(self):
|
||||||
r, w = os.pipe()
|
r, w = os.pipe()
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -445,9 +445,6 @@ class IOTest(unittest.TestCase):
|
||||||
self.assertRaises(exc, fp.seek, 1, self.SEEK_CUR)
|
self.assertRaises(exc, fp.seek, 1, self.SEEK_CUR)
|
||||||
self.assertRaises(exc, fp.seek, -1, self.SEEK_END)
|
self.assertRaises(exc, fp.seek, -1, self.SEEK_END)
|
||||||
|
|
||||||
@unittest.skipIf(
|
|
||||||
support.is_emscripten, "fstat() of a pipe fd is not supported"
|
|
||||||
)
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
def test_optional_abilities(self):
|
def test_optional_abilities(self):
|
||||||
# Test for OSError when optional APIs are not supported
|
# Test for OSError when optional APIs are not supported
|
||||||
|
@ -501,57 +498,65 @@ class IOTest(unittest.TestCase):
|
||||||
(text_reader, "r"), (text_writer, "w"),
|
(text_reader, "r"), (text_writer, "w"),
|
||||||
(self.BytesIO, "rws"), (self.StringIO, "rws"),
|
(self.BytesIO, "rws"), (self.StringIO, "rws"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def do_test(test, obj, abilities):
|
||||||
|
readable = "r" in abilities
|
||||||
|
self.assertEqual(obj.readable(), readable)
|
||||||
|
writable = "w" in abilities
|
||||||
|
self.assertEqual(obj.writable(), writable)
|
||||||
|
|
||||||
|
if isinstance(obj, self.TextIOBase):
|
||||||
|
data = "3"
|
||||||
|
elif isinstance(obj, (self.BufferedIOBase, self.RawIOBase)):
|
||||||
|
data = b"3"
|
||||||
|
else:
|
||||||
|
self.fail("Unknown base class")
|
||||||
|
|
||||||
|
if "f" in abilities:
|
||||||
|
obj.fileno()
|
||||||
|
else:
|
||||||
|
self.assertRaises(OSError, obj.fileno)
|
||||||
|
|
||||||
|
if readable:
|
||||||
|
obj.read(1)
|
||||||
|
obj.read()
|
||||||
|
else:
|
||||||
|
self.assertRaises(OSError, obj.read, 1)
|
||||||
|
self.assertRaises(OSError, obj.read)
|
||||||
|
|
||||||
|
if writable:
|
||||||
|
obj.write(data)
|
||||||
|
else:
|
||||||
|
self.assertRaises(OSError, obj.write, data)
|
||||||
|
|
||||||
|
if sys.platform.startswith("win") and test in (
|
||||||
|
pipe_reader, pipe_writer):
|
||||||
|
# Pipes seem to appear as seekable on Windows
|
||||||
|
return
|
||||||
|
seekable = "s" in abilities
|
||||||
|
self.assertEqual(obj.seekable(), seekable)
|
||||||
|
|
||||||
|
if seekable:
|
||||||
|
obj.tell()
|
||||||
|
obj.seek(0)
|
||||||
|
else:
|
||||||
|
self.assertRaises(OSError, obj.tell)
|
||||||
|
self.assertRaises(OSError, obj.seek, 0)
|
||||||
|
|
||||||
|
if writable and seekable:
|
||||||
|
obj.truncate()
|
||||||
|
obj.truncate(0)
|
||||||
|
else:
|
||||||
|
self.assertRaises(OSError, obj.truncate)
|
||||||
|
self.assertRaises(OSError, obj.truncate, 0)
|
||||||
|
|
||||||
for [test, abilities] in tests:
|
for [test, abilities] in tests:
|
||||||
with self.subTest(test), test() as obj:
|
with self.subTest(test):
|
||||||
readable = "r" in abilities
|
if test == pipe_writer and not threading_helper.can_start_thread:
|
||||||
self.assertEqual(obj.readable(), readable)
|
skipTest()
|
||||||
writable = "w" in abilities
|
with test() as obj:
|
||||||
self.assertEqual(obj.writable(), writable)
|
do_test(test, obj, abilities)
|
||||||
|
|
||||||
if isinstance(obj, self.TextIOBase):
|
|
||||||
data = "3"
|
|
||||||
elif isinstance(obj, (self.BufferedIOBase, self.RawIOBase)):
|
|
||||||
data = b"3"
|
|
||||||
else:
|
|
||||||
self.fail("Unknown base class")
|
|
||||||
|
|
||||||
if "f" in abilities:
|
|
||||||
obj.fileno()
|
|
||||||
else:
|
|
||||||
self.assertRaises(OSError, obj.fileno)
|
|
||||||
|
|
||||||
if readable:
|
|
||||||
obj.read(1)
|
|
||||||
obj.read()
|
|
||||||
else:
|
|
||||||
self.assertRaises(OSError, obj.read, 1)
|
|
||||||
self.assertRaises(OSError, obj.read)
|
|
||||||
|
|
||||||
if writable:
|
|
||||||
obj.write(data)
|
|
||||||
else:
|
|
||||||
self.assertRaises(OSError, obj.write, data)
|
|
||||||
|
|
||||||
if sys.platform.startswith("win") and test in (
|
|
||||||
pipe_reader, pipe_writer):
|
|
||||||
# Pipes seem to appear as seekable on Windows
|
|
||||||
continue
|
|
||||||
seekable = "s" in abilities
|
|
||||||
self.assertEqual(obj.seekable(), seekable)
|
|
||||||
|
|
||||||
if seekable:
|
|
||||||
obj.tell()
|
|
||||||
obj.seek(0)
|
|
||||||
else:
|
|
||||||
self.assertRaises(OSError, obj.tell)
|
|
||||||
self.assertRaises(OSError, obj.seek, 0)
|
|
||||||
|
|
||||||
if writable and seekable:
|
|
||||||
obj.truncate()
|
|
||||||
obj.truncate(0)
|
|
||||||
else:
|
|
||||||
self.assertRaises(OSError, obj.truncate)
|
|
||||||
self.assertRaises(OSError, obj.truncate, 0)
|
|
||||||
|
|
||||||
def test_open_handles_NUL_chars(self):
|
def test_open_handles_NUL_chars(self):
|
||||||
fn_with_NUL = 'foo\0bar'
|
fn_with_NUL = 'foo\0bar'
|
||||||
|
@ -3927,7 +3932,6 @@ class TextIOWrapperTest(unittest.TestCase):
|
||||||
self.assertEqual(res + f.readline(), 'foo\nbar\n')
|
self.assertEqual(res + f.readline(), 'foo\nbar\n')
|
||||||
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
@unittest.skipIf(support.is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
def test_read_non_blocking(self):
|
def test_read_non_blocking(self):
|
||||||
import os
|
import os
|
||||||
r, w = os.pipe()
|
r, w = os.pipe()
|
||||||
|
@ -4242,9 +4246,6 @@ class MiscIOTest(unittest.TestCase):
|
||||||
self.open(os_helper.TESTFN, mode)
|
self.open(os_helper.TESTFN, mode)
|
||||||
self.assertIn('invalid mode', str(cm.exception))
|
self.assertIn('invalid mode', str(cm.exception))
|
||||||
|
|
||||||
@unittest.skipIf(
|
|
||||||
support.is_emscripten, "fstat() of a pipe fd is not supported"
|
|
||||||
)
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
def test_open_pipe_with_append(self):
|
def test_open_pipe_with_append(self):
|
||||||
# bpo-27805: Ignore ESPIPE from lseek() in open().
|
# bpo-27805: Ignore ESPIPE from lseek() in open().
|
||||||
|
@ -4413,15 +4414,11 @@ class MiscIOTest(unittest.TestCase):
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
pickle.dumps(f, protocol)
|
pickle.dumps(f, protocol)
|
||||||
|
|
||||||
@unittest.skipIf(
|
@unittest.skipIf(support.is_emscripten, "Emscripten corrupts memory when writing to nonblocking fd")
|
||||||
support.is_emscripten, "fstat() of a pipe fd is not supported"
|
|
||||||
)
|
|
||||||
def test_nonblock_pipe_write_bigbuf(self):
|
def test_nonblock_pipe_write_bigbuf(self):
|
||||||
self._test_nonblock_pipe_write(16*1024)
|
self._test_nonblock_pipe_write(16*1024)
|
||||||
|
|
||||||
@unittest.skipIf(
|
@unittest.skipIf(support.is_emscripten, "Emscripten corrupts memory when writing to nonblocking fd")
|
||||||
support.is_emscripten, "fstat() of a pipe fd is not supported"
|
|
||||||
)
|
|
||||||
def test_nonblock_pipe_write_smallbuf(self):
|
def test_nonblock_pipe_write_smallbuf(self):
|
||||||
self._test_nonblock_pipe_write(1024)
|
self._test_nonblock_pipe_write(1024)
|
||||||
|
|
||||||
|
|
|
@ -940,7 +940,6 @@ class TestNtpath(NtpathTestCase):
|
||||||
self.assertRaises(TypeError, ntpath.commonpath, ['C:\\Foo', b'Foo\\Baz'])
|
self.assertRaises(TypeError, ntpath.commonpath, ['C:\\Foo', b'Foo\\Baz'])
|
||||||
self.assertRaises(TypeError, ntpath.commonpath, ['Foo', b'C:\\Foo\\Baz'])
|
self.assertRaises(TypeError, ntpath.commonpath, ['Foo', b'C:\\Foo\\Baz'])
|
||||||
|
|
||||||
@unittest.skipIf(is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
def test_sameopenfile(self):
|
def test_sameopenfile(self):
|
||||||
with TemporaryFile() as tf1, TemporaryFile() as tf2:
|
with TemporaryFile() as tf1, TemporaryFile() as tf2:
|
||||||
# Make sure the same file is really the same
|
# Make sure the same file is really the same
|
||||||
|
|
|
@ -253,7 +253,6 @@ class WakeupFDTests(unittest.TestCase):
|
||||||
self.assertRaises((ValueError, OSError),
|
self.assertRaises((ValueError, OSError),
|
||||||
signal.set_wakeup_fd, fd)
|
signal.set_wakeup_fd, fd)
|
||||||
|
|
||||||
@unittest.skipIf(support.is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
def test_set_wakeup_fd_result(self):
|
def test_set_wakeup_fd_result(self):
|
||||||
r1, w1 = os.pipe()
|
r1, w1 = os.pipe()
|
||||||
|
@ -272,7 +271,6 @@ class WakeupFDTests(unittest.TestCase):
|
||||||
self.assertEqual(signal.set_wakeup_fd(-1), w2)
|
self.assertEqual(signal.set_wakeup_fd(-1), w2)
|
||||||
self.assertEqual(signal.set_wakeup_fd(-1), -1)
|
self.assertEqual(signal.set_wakeup_fd(-1), -1)
|
||||||
|
|
||||||
@unittest.skipIf(support.is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
@unittest.skipUnless(support.has_socket_support, "needs working sockets.")
|
@unittest.skipUnless(support.has_socket_support, "needs working sockets.")
|
||||||
def test_set_wakeup_fd_socket_result(self):
|
def test_set_wakeup_fd_socket_result(self):
|
||||||
sock1 = socket.socket()
|
sock1 = socket.socket()
|
||||||
|
@ -293,7 +291,6 @@ class WakeupFDTests(unittest.TestCase):
|
||||||
# On Windows, files are always blocking and Windows does not provide a
|
# On Windows, files are always blocking and Windows does not provide a
|
||||||
# function to test if a socket is in non-blocking mode.
|
# function to test if a socket is in non-blocking mode.
|
||||||
@unittest.skipIf(sys.platform == "win32", "tests specific to POSIX")
|
@unittest.skipIf(sys.platform == "win32", "tests specific to POSIX")
|
||||||
@unittest.skipIf(support.is_emscripten, "Fixed in next Emscripten release after 4.0.1")
|
|
||||||
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
|
||||||
def test_set_wakeup_fd_blocking(self):
|
def test_set_wakeup_fd_blocking(self):
|
||||||
rfd, wfd = os.pipe()
|
rfd, wfd = os.pipe()
|
||||||
|
|
|
@ -24,8 +24,9 @@ https://github.com/psf/webassembly for more information.
|
||||||
To cross compile to the ``wasm32-emscripten`` platform you need
|
To cross compile to the ``wasm32-emscripten`` platform you need
|
||||||
[the Emscripten compiler toolchain](https://emscripten.org/),
|
[the Emscripten compiler toolchain](https://emscripten.org/),
|
||||||
a Python interpreter, and an installation of Node version 18 or newer.
|
a Python interpreter, and an installation of Node version 18 or newer.
|
||||||
Emscripten version 3.1.73 or newer is recommended. All commands below are
|
Emscripten version 4.0.2 is recommended; newer versions may also work, but all
|
||||||
relative to a checkout of the Python repository.
|
official testing is performed with that version. All commands below are relative
|
||||||
|
to a checkout of the Python repository.
|
||||||
|
|
||||||
#### Install [the Emscripten compiler toolchain](https://emscripten.org/docs/getting_started/downloads.html)
|
#### Install [the Emscripten compiler toolchain](https://emscripten.org/docs/getting_started/downloads.html)
|
||||||
|
|
||||||
|
@ -266,7 +267,7 @@ if os.name == "posix":
|
||||||
posix.uname_result(
|
posix.uname_result(
|
||||||
sysname='Emscripten',
|
sysname='Emscripten',
|
||||||
nodename='emscripten',
|
nodename='emscripten',
|
||||||
release='3.1.19',
|
release='4.0.2',
|
||||||
version='#1',
|
version='#1',
|
||||||
machine='wasm32'
|
machine='wasm32'
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue