Skip to content

Refuse runtime_launch as engine_unavailable when Godot never starts - #1086

Merged
saworbit merged 9 commits into
mainfrom
fix/runtime-launch-engine-unavailable
Sep 30, 2026
Merged

saworbit merged 9 commits into
mainfrom
fix/runtime-launch-engine-unavailable

Conversation

@saworbit

Copy link
Copy Markdown
Owner

Fixes #1076

Stacked on #1085, #1084 and #1083. Their commits show here until they merge.

#1076 asked for TestRunner::runSession to launch through runProcess. The part a caller can see is its invariant: a launch failure should map the way it does for the other tools that start Godot. It did not. With a GODOT_BIN that cannot be started, runtime_launch answered isError: false, success: false and exit_code: 0. That is the shape of a game that ran and failed, and the summary said to put godot on PATH whatever GODOT_BIN named.

The smaller change fixes that without moving the spawn. The test runner records a spawn Windows refused, with the error number. runtime_launch refuses that, or a POSIX child that exits 127, as 503 engine_unavailable with engine_executable, the same answer shader_check_compile, project_export and gridmap_export_mesh_library give since #1045. A detached POSIX launch cannot see an exec failure, since the game execs after the call has its pid, and it still answers that no session was published.

runSession keeps its own spawn. It already has the job object, the handle list and the NUL input the shared runner has, and it has a detached mode the shared runner does not. Moving it would be tidier and change nothing a caller sees.

Test: RuntimeLaunch.AnEngineThatWillNotStartIsEngineUnavailable points GODOT_BIN at a text file and checks both modes answer 503 engine_unavailable naming the file and GODOT_BIN. It fails with the refusal removed.

Checked locally: native suite (957), Python suite, docs validator, test inventory, and the live harness on 4.7.2. CHANGELOG updated under Unreleased, Fixed.

An editor opens the scenes it restores, or the project's main scene, once
its first scan is applied, and makes one of them current. A scene_open
answered before then was replaced a moment later, and every later scene
call acted on the main scene.

scene.open and scene.create now wait at the front of the queue until the
editor's file index is populated, which is the same moment on 4.5.1,
4.6.2 and 4.7.2. Commands behind them wait too, so nothing overtakes them.

Adds a native test for the hold, a live test CI runs on each line, and a
vibe probe that reproduces the switch.
scene_create over a scene open in another tab rebuilt the tab and then
opened it in the same request. On 4.5 and 4.6 the editor ignores a scene
change for the rest of a frame in which it rebuilt one, so a tab right of
the current one never came to the front and the call answered
opened: false.

The bridge now makes the tab current first and says it is stale, and the
server rebuilds it on a later request through resource.refreshCached, the
reload every other writer uses. The previous scene is read before anything
moves it, so previous_scene_file_path is right on those lines too.
csharp_check_build runs dotnet --version before the build, and that
probe stopped at a fixed 30 seconds whatever timeout_seconds said. A
probe that ran out answered 503 toolchain_unavailable, not retryable,
and told the caller to install an SDK that was there. It turned main's
4.7.2 job red, and this branch's parent's 4.5.1 job.

The probe now runs under timeout_seconds, and running out of it answers
504 timeout, retryable, with timeout_seconds in the data.
With a GODOT_BIN that cannot be started, runtime_launch answered
success: false and exit_code 0, the shape of a game that ran and failed,
and said to put godot on PATH whatever GODOT_BIN named. The other tools
that start their own Godot answer 503 engine_unavailable since #1045.

The test runner now records a spawn Windows refused, and the handler
refuses that, or a POSIX child that exits 127, the same way.
The 4.6.2 job on #1084 saw scene_open end in peer_closed after 5.7 s,
with the editor alive, and the test had sent the editor output nowhere.
It now keeps it with the extension at INFO, and a failure prints it with
the sessions the server lists.
@github-actions github-actions Bot added documentation Improvements or additions to documentation ci Workflows, automation, and the release gate tests Test suites and the contracts they assert addon The Godot addon and the in-engine GDExtension tooling Generators, harnesses, and developer tooling labels Sep 30, 2026
On a runner with no Godot, runtime_launch now answers 503
engine_unavailable, and the engine identity test expected a success body
with the engine fields. Nothing runs there, so the refusal is the answer;
the test now checks it names the engine it tried.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

addon The Godot addon and the in-engine GDExtension ci Workflows, automation, and the release gate documentation Improvements or additions to documentation tests Test suites and the contracts they assert tooling Generators, harnesses, and developer tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[fold] TestRunner runSession through runProcess

1 participant