mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +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 @@ def test_exists(self):
 | 
			
		|||
        self.assertIs(self.pathmodule.lexists(path=filename), True)
 | 
			
		||||
 | 
			
		||||
    @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):
 | 
			
		||||
        r, w = os.pipe()
 | 
			
		||||
        try:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -445,9 +445,6 @@ def test_invalid_operations(self):
 | 
			
		|||
            self.assertRaises(exc, fp.seek, 1, self.SEEK_CUR)
 | 
			
		||||
            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()")
 | 
			
		||||
    def test_optional_abilities(self):
 | 
			
		||||
        # Test for OSError when optional APIs are not supported
 | 
			
		||||
| 
						 | 
				
			
			@ -501,57 +498,65 @@ class UnseekableWriter(self.MockUnseekableIO):
 | 
			
		|||
            (text_reader, "r"), (text_writer, "w"),
 | 
			
		||||
            (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:
 | 
			
		||||
            with self.subTest(test), test() as obj:
 | 
			
		||||
                readable = "r" in abilities
 | 
			
		||||
                self.assertEqual(obj.readable(), readable)
 | 
			
		||||
                writable = "w" in abilities
 | 
			
		||||
                self.assertEqual(obj.writable(), writable)
 | 
			
		||||
            with self.subTest(test):
 | 
			
		||||
                if test == pipe_writer and not threading_helper.can_start_thread:
 | 
			
		||||
                    skipTest()
 | 
			
		||||
                with test() as obj:
 | 
			
		||||
                    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):
 | 
			
		||||
        fn_with_NUL = 'foo\0bar'
 | 
			
		||||
| 
						 | 
				
			
			@ -3927,7 +3932,6 @@ def test_issue35928(self):
 | 
			
		|||
        self.assertEqual(res + f.readline(), 'foo\nbar\n')
 | 
			
		||||
 | 
			
		||||
    @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):
 | 
			
		||||
        import os
 | 
			
		||||
        r, w = os.pipe()
 | 
			
		||||
| 
						 | 
				
			
			@ -4242,9 +4246,6 @@ def test_removed_u_mode(self):
 | 
			
		|||
                self.open(os_helper.TESTFN, mode)
 | 
			
		||||
            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()")
 | 
			
		||||
    def test_open_pipe_with_append(self):
 | 
			
		||||
        # bpo-27805: Ignore ESPIPE from lseek() in open().
 | 
			
		||||
| 
						 | 
				
			
			@ -4413,15 +4414,11 @@ def test_pickling(self):
 | 
			
		|||
                        with self.assertRaisesRegex(TypeError, msg):
 | 
			
		||||
                            pickle.dumps(f, protocol)
 | 
			
		||||
 | 
			
		||||
    @unittest.skipIf(
 | 
			
		||||
        support.is_emscripten, "fstat() of a pipe fd is not supported"
 | 
			
		||||
    )
 | 
			
		||||
    @unittest.skipIf(support.is_emscripten, "Emscripten corrupts memory when writing to nonblocking fd")
 | 
			
		||||
    def test_nonblock_pipe_write_bigbuf(self):
 | 
			
		||||
        self._test_nonblock_pipe_write(16*1024)
 | 
			
		||||
 | 
			
		||||
    @unittest.skipIf(
 | 
			
		||||
        support.is_emscripten, "fstat() of a pipe fd is not supported"
 | 
			
		||||
    )
 | 
			
		||||
    @unittest.skipIf(support.is_emscripten, "Emscripten corrupts memory when writing to nonblocking fd")
 | 
			
		||||
    def test_nonblock_pipe_write_smallbuf(self):
 | 
			
		||||
        self._test_nonblock_pipe_write(1024)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -940,7 +940,6 @@ def check_error(paths, expected):
 | 
			
		|||
        self.assertRaises(TypeError, ntpath.commonpath, ['C:\\Foo', b'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):
 | 
			
		||||
        with TemporaryFile() as tf1, TemporaryFile() as tf2:
 | 
			
		||||
            # Make sure the same file is really the same
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -253,7 +253,6 @@ def test_invalid_socket(self):
 | 
			
		|||
        self.assertRaises((ValueError, OSError),
 | 
			
		||||
                          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()")
 | 
			
		||||
    def test_set_wakeup_fd_result(self):
 | 
			
		||||
        r1, w1 = os.pipe()
 | 
			
		||||
| 
						 | 
				
			
			@ -272,7 +271,6 @@ def test_set_wakeup_fd_result(self):
 | 
			
		|||
        self.assertEqual(signal.set_wakeup_fd(-1), w2)
 | 
			
		||||
        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.")
 | 
			
		||||
    def test_set_wakeup_fd_socket_result(self):
 | 
			
		||||
        sock1 = socket.socket()
 | 
			
		||||
| 
						 | 
				
			
			@ -293,7 +291,6 @@ def test_set_wakeup_fd_socket_result(self):
 | 
			
		|||
    # On Windows, files are always blocking and Windows does not provide a
 | 
			
		||||
    # function to test if a socket is in non-blocking mode.
 | 
			
		||||
    @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()")
 | 
			
		||||
    def test_set_wakeup_fd_blocking(self):
 | 
			
		||||
        rfd, wfd = os.pipe()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,9 @@ ### Build
 | 
			
		|||
To cross compile to the ``wasm32-emscripten`` platform you need
 | 
			
		||||
[the Emscripten compiler toolchain](https://emscripten.org/), 
 | 
			
		||||
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
 | 
			
		||||
relative to a checkout of the Python repository.
 | 
			
		||||
Emscripten version 4.0.2 is recommended; newer versions may also work, but all
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +267,7 @@ ### Python code
 | 
			
		|||
posix.uname_result(
 | 
			
		||||
    sysname='Emscripten',
 | 
			
		||||
    nodename='emscripten',
 | 
			
		||||
    release='3.1.19',
 | 
			
		||||
    release='4.0.2',
 | 
			
		||||
    version='#1',
 | 
			
		||||
    machine='wasm32'
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue