diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-06-14 17:31:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-14 17:31:43 (GMT) |
commit | 5884043252473ac733aba1d3251d4debe72511e5 (patch) | |
tree | bf35f78fa4c7d201b0d1956156907a706bd095d8 /Lib/test/test_posix.py | |
parent | 066e5b1a917ec2134e8997d2cadd815724314252 (diff) | |
download | cpython-5884043252473ac733aba1d3251d4debe72511e5.zip cpython-5884043252473ac733aba1d3251d4debe72511e5.tar.gz cpython-5884043252473ac733aba1d3251d4debe72511e5.tar.bz2 |
bpo-35537: Rewrite setsid test for os.posix_spawn (GH-11721)
bpo-35537, bpo-35876: Fix also test_start_new_session() of
test_subprocess: use os.getsid() rather than os.getpgid().
Diffstat (limited to 'Lib/test/test_posix.py')
-rw-r--r-- | Lib/test/test_posix.py | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 0f07a8f..afa1398 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1639,23 +1639,35 @@ class _PosixSpawnMixin: os.environ, setsigmask=[signal.NSIG, signal.NSIG+1]) - @unittest.skipIf(True, - "FIXME: bpo-35537: test fails is setsid is supported") - def test_start_new_session(self): - # For code coverage of calling setsid(). We don't care if we get an - # EPERM error from it depending on the test execution environment, that - # still indicates that it was called. - code = "import os; print(os.getpgid(os.getpid()))" + def test_setsid(self): + rfd, wfd = os.pipe() + self.addCleanup(os.close, rfd) try: - self.spawn_func(sys.executable, - [sys.executable, "-c", code], - os.environ, setsid=True) - except NotImplementedError as exc: - self.skipTest("setsid is not supported: %s" % exc) - else: - parent_pgid = os.getpgid(os.getpid()) - child_pgid = int(output) - self.assertNotEqual(parent_pgid, child_pgid) + os.set_inheritable(wfd, True) + + code = textwrap.dedent(f""" + import os + fd = {wfd} + sid = os.getsid(0) + os.write(fd, str(sid).encode()) + """) + + try: + pid = self.spawn_func(sys.executable, + [sys.executable, "-c", code], + os.environ, setsid=True) + except NotImplementedError as exc: + self.skipTest(f"setsid is not supported: {exc!r}") + except PermissionError as exc: + self.skipTest(f"setsid failed with: {exc!r}") + finally: + os.close(wfd) + + self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + output = os.read(rfd, 100) + child_sid = int(output) + parent_sid = os.getsid(os.getpid()) + self.assertNotEqual(parent_sid, child_sid) @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), 'need signal.pthread_sigmask()') |