| | 301 | def test_processExitedRaises(self): |
| | 302 | """ |
| | 303 | Test that a protocol raising an exception inside processExited |
| | 304 | doesn't cause the reactor to explode. |
| | 305 | """ |
| | 306 | reactor = self.buildReactor() |
| | 307 | |
| | 308 | class TestException(Exception): |
| | 309 | pass |
| | 310 | |
| | 311 | class Protocol(ProcessProtocol): |
| | 312 | def processExited(self, reason): |
| | 313 | reactor.callLater(0.01, lambda: reactor.stop()) |
| | 314 | raise TestException("processedExited raised") |
| | 315 | |
| | 316 | protocol = Protocol() |
| | 317 | transport = reactor.spawnProcess( |
| | 318 | protocol, sys.executable, [sys.executable, "-c", ""], |
| | 319 | usePTY=self.usePTY) |
| | 320 | reactor.run() |
| | 321 | self.flushLoggedErrors() |
| | 322 | |
| | 323 | # Manually clean-up broken process handler |
| | 324 | for pid, handler in process.reapProcessHandlers.items(): |
| | 325 | if handler is not transport: |
| | 326 | continue |
| | 327 | process.unregisterReapProcessHandler(pid, handler) |
| | 328 | self.fail("After processExited raised, transport was left in" |
| | 329 | " reapProcessHandlers") |
| | 330 | |
| | 331 | |