extends "res://tests/test_case.gd" const AgonesSDKScript = preload("res://scripts/agones_sdk.gd") func test_sdk_requires_loopback_sidecar_url() -> void: var sdk = AgonesSDKScript.new() assert_true(not sdk.configure_for_testing("https://agones.example"), "remote sidecar URL is rejected") assert_true(not sdk.is_available(), "rejected sidecar is unavailable") assert_true(sdk.configure_for_testing("http://127.0.0.1:9358"), "loopback sidecar URL is accepted") assert_true(sdk.is_available(), "accepted sidecar is available") sdk.queue_free() func test_annotation_validation_rejects_header_injection_and_oversized_values() -> void: assert_true(AgonesSDKScript.annotation_is_valid("match", "result"), "ordinary annotation is accepted") assert_true(not AgonesSDKScript.annotation_is_valid("bad\nkey", "value"), "annotation key newline is rejected") assert_true(not AgonesSDKScript.annotation_is_valid("key", "bad\rvalue"), "annotation value newline is rejected") assert_true(not AgonesSDKScript.annotation_is_valid("key", "x".repeat(4097)), "oversized annotation is rejected") # Regression: every allocated GameServer reached Ready and was then recycled by # Agones ~20s later, because start_health() armed a Timer on a node that was # never parented. A Timer only ticks inside the SceneTree, so the process # reported healthy while sending no pings at all, and nothing said so. # # These are deliberately synchronous: test_runner.gd calls test methods without # awaiting, so anything needing a live tree or an HTTP round trip belongs in # tests/agones_sdk_smoke.gd instead. What is asserted here is the contract that # makes the silent case impossible. func test_start_health_refuses_when_not_configured() -> void: var sdk = AgonesSDKScript.new() assert_true(not sdk.start_health(), "health cannot start before a sidecar URL is known") assert_true(not sdk.health_is_running(), "no timer is armed without configuration") sdk.queue_free() func test_start_health_reports_failure_when_outside_the_tree() -> void: # The exact shape of the production bug: configured, so is_available() is # true and the node looks ready to work, but unparented. var sdk = AgonesSDKScript.new() assert_true(sdk.configure_for_testing("http://127.0.0.1:9358"), "fixture configures") assert_true(sdk.is_available(), "an unparented node still reports available") assert_true(not sdk.start_health(), "start_health() must not claim success outside the tree") assert_true(not sdk.health_is_running(), "no health loop is running outside the tree") sdk.queue_free() func test_health_is_not_running_until_a_timer_exists() -> void: # health_is_running() is what a caller should trust, rather than # is_available(), which only says a URL was parsed. var sdk = AgonesSDKScript.new() assert_true(not sdk.health_is_running(), "a fresh SDK is not pinging") sdk.configure_for_testing("http://127.0.0.1:9358") assert_true(not sdk.health_is_running(), "configuration alone does not start pinging") sdk.queue_free()