Skip to content

Commit 8673c40

Browse files
TD-S100: Server does not prove worker protocol 1.1 feature-floor handling (#123)
1 parent 17fbc2d commit 8673c40

3 files changed

Lines changed: 81 additions & 1 deletion

File tree

app/Http/Controllers/Api/HealthController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public function clusterInfo(Request $request): JsonResponse
9696
'child_workflow_timeouts' => true,
9797
'parent_close_policy' => true,
9898
'non_retryable_failures' => true,
99-
'worker_sessions' => true,
99+
'worker_sessions' => WorkerProtocol::workerSessionsSupported(),
100100
'history_retention' => true,
101101
'payload_codec_envelope' => true,
102102
'payload_codec_envelope_responses' => true,

tests/Feature/ClusterInfoCompatibilityTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use App\Support\WorkerProtocol;
1212
use Illuminate\Foundation\Testing\RefreshDatabase;
1313
use Tests\TestCase;
14+
use Workflow\Serializers\CodecRegistry;
1415
use Workflow\V2\Support\PlatformConformanceSuite;
1516
use Workflow\V2\Support\PlatformProtocolSpecs;
1617
use Workflow\V2\Support\SurfaceStabilityContract;
@@ -524,4 +525,38 @@ public function test_worker_protocol_manifest_is_sourced_from_the_package_contra
524525
$response->json('worker_protocol.server_capabilities.history_compression.supported_encodings'),
525526
);
526527
}
528+
529+
public function test_cluster_info_advertises_worker_protocol_1_1_feature_floor_without_worker_sessions(): void
530+
{
531+
$protocolVersion = '1.1';
532+
533+
$this->assertTrue(
534+
version_compare($protocolVersion, WorkerProtocol::workerSessionMinimumProtocolVersion(), '<'),
535+
'This test assumes worker sessions are gated above the protocol 1.1 feature floor.',
536+
);
537+
538+
config(['server.worker_protocol.version' => $protocolVersion]);
539+
540+
$response = $this->getJson('/api/cluster/info')->assertOk();
541+
542+
$response->assertJsonPath('worker_protocol.version', $protocolVersion)
543+
->assertJsonPath('client_compatibility.required_protocols.worker_protocol.version', $protocolVersion)
544+
->assertJsonPath('capabilities.payload_codecs', CodecRegistry::universal())
545+
->assertJsonPath('capabilities.worker_sessions', false)
546+
->assertJsonPath('worker_protocol.server_capabilities.query_tasks', true)
547+
->assertJsonPath(
548+
'worker_protocol.server_capabilities.local_activities.schema',
549+
'durable-workflow.v2.local-activity.contract',
550+
)
551+
->assertJsonPath('worker_protocol.server_capabilities.worker_session_verbs', [])
552+
->assertJsonPath('worker_protocol.server_capabilities.worker_sessions.supported', false)
553+
->assertJsonPath(
554+
'worker_protocol.server_capabilities.worker_sessions.minimum_protocol_version',
555+
WorkerProtocol::workerSessionMinimumProtocolVersion(),
556+
)
557+
->assertJsonPath(
558+
'worker_protocol.server_capabilities.worker_sessions.unavailable_reason',
559+
'worker_protocol_version_below_worker_session_minimum',
560+
);
561+
}
527562
}

tests/Feature/WorkerProtocolSuccessContractTest.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,51 @@ public function test_worker_success_responses_use_worker_protocol_contract(
165165
}
166166
}
167167

168+
public function test_worker_protocol_1_1_registration_advertises_feature_floor_without_worker_sessions(): void
169+
{
170+
$protocolVersion = '1.1';
171+
172+
$this->assertTrue(
173+
version_compare($protocolVersion, WorkerProtocol::workerSessionMinimumProtocolVersion(), '<'),
174+
'This test assumes worker sessions are gated above the protocol 1.1 feature floor.',
175+
);
176+
177+
config(['server.worker_protocol.version' => $protocolVersion]);
178+
179+
$response = $this->postJson('/api/worker/register', [
180+
'worker_id' => 'worker-protocol-1-1',
181+
'task_queue' => 'contract-queue',
182+
'runtime' => 'python',
183+
'sdk_version' => '1.1.0',
184+
], [
185+
'X-Namespace' => 'default',
186+
WorkerProtocol::HEADER => $protocolVersion,
187+
ControlPlaneProtocol::HEADER => ControlPlaneProtocol::VERSION,
188+
]);
189+
190+
$response->assertCreated()
191+
->assertHeader(WorkerProtocol::HEADER, $protocolVersion)
192+
->assertHeaderMissing(ControlPlaneProtocol::HEADER)
193+
->assertJsonPath('protocol_version', $protocolVersion)
194+
->assertJsonPath('registered', true)
195+
->assertJsonPath('server_capabilities.query_tasks', true)
196+
->assertJsonPath(
197+
'server_capabilities.local_activities.schema',
198+
'durable-workflow.v2.local-activity.contract',
199+
)
200+
->assertJsonPath('server_capabilities.worker_session_verbs', [])
201+
->assertJsonPath('server_capabilities.worker_sessions.supported', false)
202+
->assertJsonPath(
203+
'server_capabilities.worker_sessions.minimum_protocol_version',
204+
WorkerProtocol::workerSessionMinimumProtocolVersion(),
205+
)
206+
->assertJsonPath(
207+
'server_capabilities.worker_sessions.unavailable_reason',
208+
'worker_protocol_version_below_worker_session_minimum',
209+
)
210+
->assertJsonMissingPath('control_plane');
211+
}
212+
168213
public function test_leased_workflow_task_success_responses_use_worker_protocol_contract(): void
169214
{
170215
Queue::fake();

0 commit comments

Comments
 (0)