@@ -389,4 +389,171 @@ mod tests {
389389 let _ = NetworkSetupResponse { } ;
390390 let _ = NetworkTeardownResponse { } ;
391391 }
392+
393+ // ── Runtime V2 proto-contract consistency tests ──────────────
394+
395+ #[ test]
396+ fn runtime_v2_services_cover_all_entity_types ( ) {
397+ use crate :: runtime_v2:: * ;
398+
399+ // Verify key request message types exist by constructing defaults.
400+ let _ = CreateSandboxRequest :: default ( ) ;
401+ let _ = OpenLeaseRequest :: default ( ) ;
402+ let _ = CreateContainerRequest :: default ( ) ;
403+ let _ = CreateExecutionRequest :: default ( ) ;
404+ let _ = CreateCheckpointRequest :: default ( ) ;
405+ let _ = StartBuildRequest :: default ( ) ;
406+ let _ = ListEventsRequest :: default ( ) ;
407+ let _ = GetCapabilitiesRequest :: default ( ) ;
408+
409+ // Verify response types.
410+ let _ = SandboxResponse :: default ( ) ;
411+ let _ = LeaseResponse :: default ( ) ;
412+ let _ = ContainerResponse :: default ( ) ;
413+ let _ = ExecutionResponse :: default ( ) ;
414+ let _ = CheckpointResponse :: default ( ) ;
415+ let _ = BuildResponse :: default ( ) ;
416+ let _ = ListEventsResponse :: default ( ) ;
417+ let _ = GetCapabilitiesResponse :: default ( ) ;
418+
419+ // Verify payload types used in responses.
420+ let _ = SandboxPayload :: default ( ) ;
421+ let _ = LeasePayload :: default ( ) ;
422+ let _ = ContainerPayload :: default ( ) ;
423+ let _ = ExecutionPayload :: default ( ) ;
424+ let _ = CheckpointPayload :: default ( ) ;
425+ let _ = BuildPayload :: default ( ) ;
426+
427+ // Verify list responses.
428+ let _ = ListSandboxesResponse :: default ( ) ;
429+ let _ = ListLeasesResponse :: default ( ) ;
430+ let _ = ListContainersResponse :: default ( ) ;
431+ let _ = ListExecutionsResponse :: default ( ) ;
432+ let _ = ListCheckpointsResponse :: default ( ) ;
433+ let _ = ListBuildsResponse :: default ( ) ;
434+
435+ // Verify streaming types.
436+ let _ = ExecOutputEvent :: default ( ) ;
437+ let _ = BuildEvent :: default ( ) ;
438+ let _ = RuntimeEvent :: default ( ) ;
439+ }
440+
441+ #[ test]
442+ fn runtime_v2_request_metadata_fields ( ) {
443+ use crate :: runtime_v2:: RequestMetadata ;
444+ let meta = RequestMetadata {
445+ request_id : "req-123" . into ( ) ,
446+ idempotency_key : "idem-456" . into ( ) ,
447+ trace_id : "trace-789" . into ( ) ,
448+ } ;
449+ assert_eq ! ( meta. request_id, "req-123" ) ;
450+ assert_eq ! ( meta. idempotency_key, "idem-456" ) ;
451+ assert_eq ! ( meta. trace_id, "trace-789" ) ;
452+ }
453+
454+ #[ test]
455+ fn runtime_v2_error_detail_fields ( ) {
456+ use crate :: runtime_v2:: ErrorDetail ;
457+ let err = ErrorDetail {
458+ code : "not_found" . into ( ) ,
459+ message : "sandbox not found" . into ( ) ,
460+ request_id : "req-abc" . into ( ) ,
461+ } ;
462+ assert_eq ! ( err. code, "not_found" ) ;
463+ assert_eq ! ( err. message, "sandbox not found" ) ;
464+ assert_eq ! ( err. request_id, "req-abc" ) ;
465+ }
466+
467+ #[ test]
468+ fn runtime_v2_all_rpc_request_types_have_metadata ( ) {
469+ use crate :: runtime_v2:: * ;
470+
471+ // Every mutation/query request should have an optional metadata field.
472+ // Constructing defaults ensures the field exists (it will be None).
473+ let create_sandbox = CreateSandboxRequest :: default ( ) ;
474+ assert ! ( create_sandbox. metadata. is_none( ) ) ;
475+
476+ let open_lease = OpenLeaseRequest :: default ( ) ;
477+ assert ! ( open_lease. metadata. is_none( ) ) ;
478+
479+ let create_container = CreateContainerRequest :: default ( ) ;
480+ assert ! ( create_container. metadata. is_none( ) ) ;
481+
482+ let create_execution = CreateExecutionRequest :: default ( ) ;
483+ assert ! ( create_execution. metadata. is_none( ) ) ;
484+
485+ let create_checkpoint = CreateCheckpointRequest :: default ( ) ;
486+ assert ! ( create_checkpoint. metadata. is_none( ) ) ;
487+
488+ let start_build = StartBuildRequest :: default ( ) ;
489+ assert ! ( start_build. metadata. is_none( ) ) ;
490+
491+ let list_events = ListEventsRequest :: default ( ) ;
492+ assert ! ( list_events. metadata. is_none( ) ) ;
493+
494+ let get_caps = GetCapabilitiesRequest :: default ( ) ;
495+ assert ! ( get_caps. metadata. is_none( ) ) ;
496+
497+ // GET/single-entity requests.
498+ let get_sandbox = GetSandboxRequest :: default ( ) ;
499+ assert ! ( get_sandbox. metadata. is_none( ) ) ;
500+
501+ let get_lease = GetLeaseRequest :: default ( ) ;
502+ assert ! ( get_lease. metadata. is_none( ) ) ;
503+
504+ let get_container = GetContainerRequest :: default ( ) ;
505+ assert ! ( get_container. metadata. is_none( ) ) ;
506+
507+ let get_execution = GetExecutionRequest :: default ( ) ;
508+ assert ! ( get_execution. metadata. is_none( ) ) ;
509+
510+ let get_checkpoint = GetCheckpointRequest :: default ( ) ;
511+ assert ! ( get_checkpoint. metadata. is_none( ) ) ;
512+
513+ let get_build = GetBuildRequest :: default ( ) ;
514+ assert ! ( get_build. metadata. is_none( ) ) ;
515+ }
516+
517+ #[ test]
518+ fn runtime_v2_sandbox_payload_round_trip ( ) {
519+ use crate :: runtime_v2:: SandboxPayload ;
520+ let payload = SandboxPayload {
521+ sandbox_id : "sbx-test" . into ( ) ,
522+ backend : "macos_vz" . into ( ) ,
523+ state : "ready" . into ( ) ,
524+ cpus : 4 ,
525+ memory_mb : 2048 ,
526+ created_at : 1700000000 ,
527+ updated_at : 1700000100 ,
528+ labels : [ ( "env" . to_string ( ) , "staging" . to_string ( ) ) ]
529+ . into_iter ( )
530+ . collect ( ) ,
531+ } ;
532+ let encoded = payload. encode_to_vec ( ) ;
533+ let decoded = SandboxPayload :: decode ( encoded. as_slice ( ) ) . unwrap ( ) ;
534+ assert_eq ! ( decoded. sandbox_id, "sbx-test" ) ;
535+ assert_eq ! ( decoded. backend, "macos_vz" ) ;
536+ assert_eq ! ( decoded. cpus, 4 ) ;
537+ assert_eq ! ( decoded. memory_mb, 2048 ) ;
538+ assert_eq ! ( decoded. labels. get( "env" ) . unwrap( ) , "staging" ) ;
539+ }
540+
541+ #[ test]
542+ fn runtime_v2_checkpoint_payload_round_trip ( ) {
543+ use crate :: runtime_v2:: CheckpointPayload ;
544+ let payload = CheckpointPayload {
545+ checkpoint_id : "ckpt-test" . into ( ) ,
546+ sandbox_id : "sbx-test" . into ( ) ,
547+ parent_checkpoint_id : "ckpt-parent" . into ( ) ,
548+ checkpoint_class : "fs_quick" . into ( ) ,
549+ state : "ready" . into ( ) ,
550+ compatibility_fingerprint : "kernel-6.1-arm64" . into ( ) ,
551+ created_at : 1700000000 ,
552+ } ;
553+ let encoded = payload. encode_to_vec ( ) ;
554+ let decoded = CheckpointPayload :: decode ( encoded. as_slice ( ) ) . unwrap ( ) ;
555+ assert_eq ! ( decoded. checkpoint_id, "ckpt-test" ) ;
556+ assert_eq ! ( decoded. compatibility_fingerprint, "kernel-6.1-arm64" ) ;
557+ assert_eq ! ( decoded. parent_checkpoint_id, "ckpt-parent" ) ;
558+ }
392559}
0 commit comments