]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-90473: Misc test fixes for WASI (GH-93218)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 25 May 2022 14:24:32 +0000 (07:24 -0700)
committerGitHub <noreply@github.com>
Wed, 25 May 2022 14:24:32 +0000 (07:24 -0700)
* ``sys.executable`` is not set
* WASI does not support subprocess
* ``pwd`` module is not available
* WASI checks ``open`` syscall flags more strict, needs r, w, rw flag.
* ``umask`` is not available
* ``/dev/null`` may not be accessible
(cherry picked from commit 1f134e96ba994bea3aaea533d4a558df3c5cc3c0)

Co-authored-by: Christian Heimes <christian@python.org>
Lib/distutils/tests/test_build.py
Lib/lib2to3/tests/test_parser.py
Lib/test/test_netrc.py
Lib/test/test_os.py
Lib/test/test_pathlib.py
Lib/test/test_tarfile.py
Lib/test/test_unicode_file.py
Tools/wasm/README.md

index 83a9e4f4dd2f43b7fe93ba05d165757c1201b949..71b5e164bae14aa4bc42e40e06b129a3cc0a3c2d 100644 (file)
@@ -12,6 +12,7 @@ class BuildTestCase(support.TempdirManager,
                     support.LoggingSilencer,
                     unittest.TestCase):
 
+    @unittest.skipUnless(sys.executable, "test requires sys.executable")
     def test_finalize_options(self):
         pkg_dir, dist = self.create_dist()
         cmd = build(dist)
index e2dddbec577c02570dc3014e9e832e23a8d13579..8e7773bcae13ed85ea600166af8ccf062e921d2d 100644 (file)
@@ -63,7 +63,7 @@ class TestPgen2Caching(support.TestCase):
 
     @unittest.skipIf(sys.executable is None, 'sys.executable required')
     @unittest.skipIf(
-        sys.platform == 'emscripten', 'requires working subprocess'
+        sys.platform in {'emscripten', 'wasi'}, 'requires working subprocess'
     )
     def test_load_grammar_from_subprocess(self):
         tmpdir = tempfile.mkdtemp()
index 3cca1e8ff1ac1a71ee681120aa7ba3d4884b8192..05a23e5e8a3ce2c79c9423fe83a0e820eb168508 100644 (file)
@@ -1,6 +1,11 @@
 import netrc, os, unittest, sys, textwrap
 from test.support import os_helper, run_unittest
 
+try:
+    import pwd
+except ImportError:
+    pwd = None
+
 temp_filename = os_helper.TESTFN
 
 class NetrcTestCase(unittest.TestCase):
@@ -266,6 +271,7 @@ class NetrcTestCase(unittest.TestCase):
 
 
     @unittest.skipUnless(os.name == 'posix', 'POSIX only test')
+    @unittest.skipIf(pwd is None, 'security check requires pwd module')
     def test_security(self):
         # This test is incomplete since we are normally not run as root and
         # therefore can't test the file ownership being wrong.
index ae071821e1ccfafed95936d395550fdcbcbca1cf..009bb5aec35a4b9c56d33d16f6394efdabbdfd80 100644 (file)
@@ -1765,6 +1765,7 @@ class RemoveDirsTests(unittest.TestCase):
         self.assertTrue(os.path.exists(os_helper.TESTFN))
 
 
+@unittest.skipIf(support.is_wasi, "WASI has no /dev/null")
 class DevNullTests(unittest.TestCase):
     def test_devnull(self):
         with open(os.devnull, 'wb', 0) as f:
@@ -2111,6 +2112,7 @@ class Win32ErrorTests(unittest.TestCase):
         self.assertRaises(OSError, os.chmod, os_helper.TESTFN, 0)
 
 
+@unittest.skipIf(support.is_wasi, "Cannot create invalid FD on WASI.")
 class TestInvalidFD(unittest.TestCase):
     singles = ["fchdir", "dup", "fdatasync", "fstat",
                "fstatvfs", "fsync", "tcgetpgrp", "ttyname"]
index a64bf68e8593d77fd69c5c8ee71a6791633027eb..ac3e652631b0308f2bd216c24acc0796c169c6cf 100644 (file)
@@ -13,7 +13,7 @@ import unittest
 from unittest import mock
 
 from test.support import import_helper
-from test.support import is_emscripten
+from test.support import is_emscripten, is_wasi
 from test.support import os_helper
 from test.support.os_helper import TESTFN, FakePath
 
@@ -1530,6 +1530,7 @@ class _BasePathTest(object):
         p = self.cls('')
         self.assertEqual(p.stat(), os.stat('.'))
 
+    @unittest.skipIf(is_wasi, "WASI has no user accounts.")
     def test_expanduser_common(self):
         P = self.cls
         p = P('~')
@@ -2530,7 +2531,8 @@ class PosixPathTest(_BasePathTest, unittest.TestCase):
             print(path.resolve(strict))
 
     @unittest.skipIf(
-        is_emscripten, "umask is not implemented on Emscripten."
+        is_emscripten or is_wasi,
+        "umask is not implemented on Emscripten/WASI."
     )
     def test_open_mode(self):
         old_mask = os.umask(0)
@@ -2556,7 +2558,8 @@ class PosixPathTest(_BasePathTest, unittest.TestCase):
             os.chdir(current_directory)
 
     @unittest.skipIf(
-        is_emscripten, "umask is not implemented on Emscripten."
+        is_emscripten or is_wasi,
+        "umask is not implemented on Emscripten/WASI."
     )
     def test_touch_mode(self):
         old_mask = os.umask(0)
index 12850cd635e995d35a59fd53844082f6339ea8c1..a364043d3d9dd81f9edc291c99b5554b3733cba9 100644 (file)
@@ -1498,7 +1498,10 @@ class StreamWriteTest(WriteTestBase, unittest.TestCase):
 
     @unittest.skipUnless(sys.platform != "win32" and hasattr(os, "umask"),
                          "Missing umask implementation")
-    @unittest.skipIf(support.is_emscripten, "Emscripten's umask is a stub.")
+    @unittest.skipIf(
+        support.is_emscripten or support.is_wasi,
+        "Emscripten's/WASI's umask is a stub."
+    )
     def test_file_mode(self):
         # Test for issue #8464: Create files with correct
         # permissions.
index 80c22c6cdd1dad7fa15af3ed67ae2682f4850a58..fe25bfe9f88d11347bb699779d85cb2efb794862 100644 (file)
@@ -110,7 +110,7 @@ class TestUnicodeFiles(unittest.TestCase):
             os.unlink(filename)
         self.assertTrue(not os.path.exists(filename))
         # and again with os.open.
-        f = os.open(filename, os.O_CREAT)
+        f = os.open(filename, os.O_CREAT | os.O_WRONLY)
         os.close(f)
         try:
             self._do_single(filename)
index 9e253bc878bd95c4d52c062cd9f5332d0495f256..239eb90d0743c2497457410e8e1d9cb9a0b198f9 100644 (file)
@@ -239,7 +239,11 @@ are:
   yet. A future version of WASI may provide a limited ``set_permissions`` API.
 - File locking (``fcntl``) is not available.
 - ``os.pipe()``, ``os.mkfifo()``, and ``os.mknod()`` are not supported.
-- ``process_time`` clock does not work.
+- ``process_time`` does not work as expected because it's implemented using
+  wall clock.
+- ``os.umask`` is a stub.
+- ``sys.executable`` is empty.
+- ``/dev/null`` / ``os.devnull`` may not be available.
 
 
 # Detect WebAssembly builds