|
1 | 1 | "Test posix functions" |
2 | 2 |
|
3 | 3 | from test import support |
| 4 | +from test.support.script_helper import assert_python_ok |
4 | 5 | android_not_root = support.android_not_root |
5 | 6 |
|
6 | 7 | # Skip these tests if there is no posix module. |
@@ -187,6 +188,45 @@ def test_waitid(self): |
187 | 188 | res = posix.waitid(posix.P_PID, pid, posix.WEXITED) |
188 | 189 | self.assertEqual(pid, res.si_pid) |
189 | 190 |
|
| 191 | + @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()") |
| 192 | + def test_register_after_fork(self): |
| 193 | + code = """if 1: |
| 194 | + import os |
| 195 | +
|
| 196 | + r, w = os.pipe() |
| 197 | + fin_r, fin_w = os.pipe() |
| 198 | +
|
| 199 | + os.register_at_fork(lambda: os.write(w, b'A'), when='before') |
| 200 | + os.register_at_fork(lambda: os.write(w, b'B'), when='before') |
| 201 | + os.register_at_fork(lambda: os.write(w, b'C'), when='parent') |
| 202 | + os.register_at_fork(lambda: os.write(w, b'D'), when='parent') |
| 203 | + os.register_at_fork(lambda: os.write(w, b'E'), when='child') |
| 204 | + os.register_at_fork(lambda: os.write(w, b'F'), when='child') |
| 205 | +
|
| 206 | + pid = os.fork() |
| 207 | + if pid == 0: |
| 208 | + # At this point, after-forkers have already been executed |
| 209 | + os.close(w) |
| 210 | + # Wait for parent to tell us to exit |
| 211 | + os.read(fin_r, 1) |
| 212 | + os._exit(0) |
| 213 | + else: |
| 214 | + try: |
| 215 | + os.close(w) |
| 216 | + with open(r, "rb") as f: |
| 217 | + data = f.read() |
| 218 | + assert len(data) == 6, data |
| 219 | + # Check before-fork callbacks |
| 220 | + assert data[:2] == b'BA', data |
| 221 | + # Check after-fork callbacks |
| 222 | + assert sorted(data[2:]) == list(b'CDEF'), data |
| 223 | + assert data.index(b'C') < data.index(b'D'), data |
| 224 | + assert data.index(b'E') < data.index(b'F'), data |
| 225 | + finally: |
| 226 | + os.write(fin_w, b'!') |
| 227 | + """ |
| 228 | + assert_python_ok('-c', code) |
| 229 | + |
190 | 230 | @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()") |
191 | 231 | def test_lockf(self): |
192 | 232 | fd = os.open(support.TESTFN, os.O_WRONLY | os.O_CREAT) |
|
0 commit comments