laravel-websockets/tests
Fabian @ Blax Software 35ed320202 fix(fork): children never outlive the server or hold its port (#2465)
A fork-per-message child inherits the server's listening socket. A child
that outlived the server (a long-running handler such as an engine loop)
kept the port bound, so the restarted server failed with EADDRINUSE until
that child died.

- Track every forked child (Server\ChildProcesses). On hard and soft
  shutdown, send SIGTERM to the ones still running, SIGKILL them after
  websockets.shutdown.child_grace_seconds (default 2) and reap them. A PID is
  signalled only while waitpid() confirms it is still an unreaped child, with
  SIGCHLD blocked, so a recycled PID is never hit. Opt out with
  websockets.shutdown.terminate_children = false.
- Right after fork the child closes its copy of the listening socket, so even
  a stray child cannot hold the port. Only the fd is closed: the React server
  is not closed, because removing it from an ext-ev/ext-event loop would edit
  the epoll set the child shares with the parent.
- The child restores default SIGTERM/SIGINT/SIGCHLD handling. Under ext-ev
  the inherited libev handlers swallowed SIGTERM in the child.
- A child that dies of a fatal error (out of memory, E_ERROR) now sends
  <event>:error from a shutdown function (Server\ChildFatalErrorGuard,
  #1462). A child that dies without any reply (killed by a signal, or the
  shutdown function never ran) gets <event>:error from the parent, decided
  once both its stream and its exit status are in
  (Websocket\ChildMessageOutcome).
- Tests: real forks, signals and sockets for the shutdown, the port release
  and the fatal reply; end to end through Handler::forkWithSocketPair(). The
  test TestCase now stops a leftover broadcast socket, which made
  ws_available() true for later tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 10:38:11 +02:00
..
Apps A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
Cache A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
Commands fix(fork): children never outlive the server or hold its port (#2465) 2026-10-14 10:38:11 +02:00
Handlers Renovation 2025-01-16 08:54:02 +01:00
Ipc A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
Mocks I stability 2026-03-21 12:56:50 +01:00
Models Renovation 2025-01-16 08:54:02 +01:00
Server fix(fork): children never outlive the server or hold its port (#2465) 2026-10-14 10:38:11 +02:00
Unit feat: integrate websocket routes into Laravel's route list; implement RouteListInjector for attribute-tagged methods and legacy controllers; add tests for route injection and collection 2026-04-29 09:26:53 +02:00
Websocket fix(fork): children never outlive the server or hold its port (#2465) 2026-10-14 10:38:11 +02:00
database/factories Renovation 2025-01-16 08:54:02 +01:00
AsyncRedisQueueTest.php Renovation 2025-01-16 08:54:02 +01:00
ClosedBeforeOpenTest.php fix(shutdown): soft shutdown always stops the loop 2026-09-28 14:20:46 +02:00
ConnectionTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
ForkChildConnectionResetTest.php test(fork): extract fork-child connection reset into a tested method 2026-08-30 10:14:36 +02:00
HandlerLifecycleTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
HealthTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
HotReloadKeepsListenersTest.php fix(hot-reload): keep the event dispatcher in the message child 2026-09-25 12:56:37 +02:00
LocalPongRemovalTest.php Renovation 2025-01-16 08:54:02 +01:00
OpenPresenceChannelFeatureTest.php I open presence channel test 2026-04-21 16:52:44 +02:00
PingTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
PresenceChannelTest.php C linting 2026-04-02 12:44:31 +02:00
PrivateChannelTest.php C linting 2026-04-02 12:44:31 +02:00
PublicChannelTest.php C linting 2026-04-02 12:44:31 +02:00
RedisPongRemovalTest.php Renovation 2025-01-16 08:54:02 +01:00
ReplicationTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
TestCase.php fix(fork): children never outlive the server or hold its port (#2465) 2026-10-14 10:38:11 +02:00
TestServiceProvider.php Renovation 2025-01-16 08:54:02 +01:00
WebsocketServiceTest.php A tests, documentation for helpers and lifecycle 2026-04-02 12:44:16 +02:00
bootstrap.php I performance, A testing & event-driven 2026-01-24 13:34:29 +01:00