https://github.com/python/cpython/commit/436a6f289402553ca2bf1308881d85861e5d8a22
commit: 436a6f289402553ca2bf1308881d85861e5d8a22
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-05-16T10:50:55+02:00
summary:
gh-149879: Fix test_os on Cygwin (#149910)
files:
M Lib/test/test_os/test_os.py
M Lib/test/test_os/test_posix.py
diff --git a/Lib/test/test_os/test_os.py b/Lib/test/test_os/test_os.py
index 7e670e5a139d999..e71c28424e095f2 100644
--- a/Lib/test/test_os/test_os.py
+++ b/Lib/test/test_os/test_os.py
@@ -1867,7 +1867,9 @@ def test_walk_bad_dir2(self):
walk_it = self.walk(self.tmp1_path, follow_symlinks=True)
if self.is_fwalk:
- self.assertRaises(NotADirectoryError, next, walk_it)
+ with self.assertRaises(OSError) as cm:
+ next(walk_it)
+ self.assertIn(cm.exception.errno, (errno.ENOTDIR, errno.EINVAL))
self.assertRaises(StopIteration, next, walk_it)
@unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()')
@@ -2269,6 +2271,8 @@ def test_chown_with_root(self):
@requires_non_root_user
@unittest.skipUnless(len(all_users) > 1, "test needs and more than one
user")
+ @unittest.skipIf(sys.platform == 'cygwin',
+ 'chown() can set any uid on Cygwin')
def test_chown_without_permission(self):
uid_1, uid_2 = all_users[:2]
gid = os.stat(os_helper.TESTFN).st_gid
@@ -4051,10 +4055,11 @@ def test_timerfd_non_blocking(self):
initial_expiration = 0.1
os.timerfd_settime(fd, initial=initial_expiration, interval=0)
- # read() raises OSError with errno is EAGAIN for non-blocking timer.
- with self.assertRaises(OSError) as ctx:
- self.read_count_signaled(fd)
- self.assertEqual(ctx.exception.errno, errno.EAGAIN)
+ if sys.platform != 'cygwin':
+ # read() raises OSError with errno is EAGAIN for non-blocking
timer.
+ with self.assertRaises(OSError) as ctx:
+ self.read_count_signaled(fd)
+ self.assertEqual(ctx.exception.errno, errno.EAGAIN)
# Wait more than 0.1 seconds
time.sleep(initial_expiration + 0.1)
@@ -4235,12 +4240,19 @@ def test_timerfd_ns_initval(self):
# 2nd call
next_expiration_ns, interval_ns2 = os.timerfd_settime_ns(fd,
initial=initial_expiration_ns, interval=interval_ns)
- self.assertEqual(interval_ns2, interval_ns)
+ CYGWIN = (sys.platform == 'cygwin')
+ if not CYGWIN:
+ self.assertEqual(interval_ns2, interval_ns)
+ else:
+ self.assertEqual(interval_ns2, 0)
self.assertEqual(next_expiration_ns, initial_expiration_ns)
# timerfd_gettime
next_expiration_ns, interval_ns2 = os.timerfd_gettime_ns(fd)
- self.assertEqual(interval_ns2, interval_ns)
+ if not CYGWIN:
+ self.assertEqual(interval_ns2, interval_ns)
+ else:
+ self.assertEqual(interval_ns2, 0)
self.assertLessEqual(next_expiration_ns, initial_expiration_ns)
self.assertAlmostEqual(next_expiration_ns, initial_expiration_ns,
delta=limit_error)
diff --git a/Lib/test/test_os/test_posix.py b/Lib/test/test_os/test_posix.py
index 0e8495a4eff2ed4..d0a662a091829e8 100644
--- a/Lib/test/test_os/test_posix.py
+++ b/Lib/test/test_os/test_posix.py
@@ -142,8 +142,8 @@ def test_initgroups(self):
self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
# If a non-privileged user invokes it, it should fail with OSError
- # EPERM.
- if os.getuid() != 0:
+ # EPERM. On Cygwin, initgroups(name, 13) does not fail.
+ if os.getuid() != 0 and sys.platform != 'cygwin':
try:
name = pwd.getpwuid(posix.getuid()).pw_name
except KeyError:
@@ -597,7 +597,9 @@ def test_sysconf(self):
posix.sysconf(1.23)
arg_max = posix.sysconf("SC_ARG_MAX")
- self.assertGreater(arg_max, 0)
+ # SC_ARG_MAX is -1 on Cygwin
+ if sys.platform != 'cygwin':
+ self.assertGreater(arg_max, 0)
self.assertEqual(
posix.sysconf(posix.sysconf_names["SC_ARG_MAX"]), arg_max)
@@ -1943,6 +1945,14 @@ def test_no_such_executable(self):
# directories in the $PATH that are not accessible.
except (FileNotFoundError, PermissionError) as exc:
self.assertEqual(exc.filename, no_such_executable)
+
+ # On Cygwin, os.posix_spawn() creates a child process even if the
+ # executable doesn't exist. We have to reap this process.
+ if sys.platform == 'cygwin':
+ for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
+ pid, status = os.waitpid(-1, os.WNOHANG)
+ if pid != 0:
+ break
else:
pid2, status = os.waitpid(pid, 0)
self.assertEqual(pid2, pid)
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]