[package]
name = "lesavka_tests"
version = "0.1.0"
edition = "2024"
publish = false
build = "build.rs"
autotests = false

[lib]
name = "lesavka_tests"
path = "tests/lib.rs"

[workspace]
members = [
    "common",
    "client",
    "server",
]
resolver = "3"

[workspace.dependencies]
serial_test = "3.2"
tempfile = "3.15"
temp-env = "0.3"

[features]
# Virtual HID tests create uinput keyboards/mice and can leak events into the
# active desktop. Keep them opt-in so default local and CI gates stay safe.
disruptive-input-tests = []

[dev-dependencies]
anyhow = "1.0"
async-stream = "0.3"
base64 = "0.22"
chrono = "0.4"
evdev = "0.13"
futures-util = "0.3"
libc = "0.2"
lesavka_client = { path = "client" }
lesavka_common = { path = "common" }
lesavka_server = { path = "server" }
chacha20poly1305 = "0.10"
gstreamer = { version = "0.23", features = ["v1_22"] }
gstreamer-app = { version = "0.23", features = ["v1_22"] }
gstreamer-video = { version = "0.23", features = ["v1_22"] }
gtk = { version = "0.8", package = "gtk4", features = ["v4_6"] }
winit = "0.30"
serial_test = { workspace = true }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
shell-escape = "0.1"
temp-env = { workspace = true }
tempfile = { workspace = true }
tokio = { version = "1.45", features = ["full", "macros", "rt-multi-thread", "sync", "time"] }
tokio-stream = "0.1"
tonic = { version = "0.13", features = ["transport"] }
tonic-reflection = "0.13"
tracing = "0.1"
tracing-appender = "0.2"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "ansi"] }
udev = "0.8"
v4l = "0.14"

[[test]]
name = "client_relayctl_binary_contract"
path = "tests/api/client/bin/lesavka_relayctl/client_relayctl_binary_contract.rs"

[[test]]
name = "client_relayctl_process_contract"
path = "tests/api/client/bin/lesavka_relayctl/client_relayctl_process_contract.rs"

[[test]]
name = "client_keyboard_paste_rpc_contract"
path = "tests/api/client/input/keyboard/client_keyboard_paste_rpc_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "common_cli_binary_contract"
path = "tests/api/common/cli/common_cli_binary_contract.rs"

[[test]]
name = "common_cli_contract"
path = "tests/api/common/cli/common_cli_contract.rs"

[[test]]
name = "handshake_camera_contract"
path = "tests/api/common/handshake/handshake_camera_contract.rs"

[[test]]
name = "server_main_rpc_contract"
path = "tests/api/server/main/server_main_rpc_contract.rs"

[[test]]
name = "server_main_rpc_reset_contract"
path = "tests/api/server/main/server_main_rpc_reset_contract.rs"

[[test]]
name = "server_main_state_rpc_contract"
path = "tests/api/server/main/server_main_state_rpc_contract.rs"

[[test]]
name = "server_auth_rpc_contract"
path = "tests/api/server/auth/server_auth_rpc_contract.rs"

[[test]]
name = "server_upstream_media_audio_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_audio_contract.rs"

[[test]]
name = "server_upstream_media_bundle_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_bundle_contract.rs"

[[test]]
name = "server_upstream_media_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_contract.rs"

[[test]]
name = "server_upstream_media_pairing_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_pairing_contract.rs"

[[test]]
name = "server_upstream_media_v2_handoff_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_v2_handoff_contract.rs"

[[test]]
name = "server_upstream_media_video_contract"
path = "tests/api/server/upstream_media_runtime/server_upstream_media_video_contract.rs"

[[test]]
name = "uplink_backpressure_chaos_contract"
path = "tests/chaos/client/uplink/uplink_backpressure_chaos_contract.rs"

[[test]]
name = "hevc_mjpeg_guard_chaos_contract"
path = "tests/chaos/server/video_sinks/hevc_mjpeg_guard_chaos_contract.rs"

[[test]]
name = "client_server_rct_route_chaos_contract"
path = "tests/chaos/client/server/rct/client_server_rct_route_chaos_contract.rs"

[[test]]
name = "input_disconnect_chaos_contract"
path = "tests/chaos/input/input_disconnect_chaos_contract.rs"

[[test]]
name = "input_packet_ordering_chaos_contract"
path = "tests/chaos/input/input_packet_ordering_chaos_contract.rs"

[[test]]
name = "downstream_video_stall_chaos_contract"
path = "tests/chaos/downstream/video/downstream_video_stall_chaos_contract.rs"

[[test]]
name = "interrupted_install_safe_state_contract"
path = "tests/chaos/system/interrupted_install_safe_state_contract.rs"

[[test]]
name = "client_video_support_include_contract"
path = "tests/compatibility/client/video_support/client_video_support_include_contract.rs"

[[test]]
name = "client_opus_transport_contract"
path = "tests/compatibility/client/audio/client_opus_transport_contract.rs"

[[test]]
name = "server_camera_runtime_contract"
path = "tests/compatibility/server/camera/server_camera_runtime_contract.rs"

[[test]]
name = "server_uvc_runtime_contract"
path = "tests/compatibility/server/uvc/server_uvc_runtime_contract.rs"

[[test]]
name = "hevc_mjpeg_profile_matrix_contract"
path = "tests/compatibility/server/video/hevc_mjpeg_profile_matrix_contract.rs"

[[test]]
name = "video_support_contract"
path = "tests/compatibility/video/video_support_contract.rs"

[[test]]
name = "client_uplink_component_contract"
path = "tests/component/client/uplink/client_uplink_component_contract.rs"

[[test]]
name = "client_app_include_contract"
path = "tests/contract/client/app/client_app_include_contract.rs"

[[test]]
name = "client_app_process_contract"
path = "tests/contract/client/app/client_app_process_contract.rs"

[[test]]
name = "client_camera_include_contract"
path = "tests/contract/client/input/camera/client_camera_include_contract.rs"

[[test]]
name = "client_camera_timing_contract"
path = "tests/contract/client/input/camera/client_camera_timing_contract.rs"

[[test]]
name = "client_inputs_contract"
path = "tests/contract/client/input/inputs/client_inputs_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_inputs_extra_contract"
path = "tests/contract/client/input/inputs/client_inputs_extra_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_inputs_routing_contract"
path = "tests/contract/client/input/inputs/client_inputs_routing_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_keyboard_clipboard_contract"
path = "tests/contract/client/input/keyboard/client_keyboard_clipboard_contract.rs"

[[test]]
name = "client_keyboard_include_contract"
path = "tests/contract/client/input/keyboard/client_keyboard_include_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_keyboard_include_extra_contract"
path = "tests/contract/client/input/keyboard/client_keyboard_include_extra_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_keyboard_process_contract"
path = "tests/contract/client/input/keyboard/client_keyboard_process_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_keyboard_shift_contract"
path = "tests/contract/client/input/keyboard/client_keyboard_shift_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_keymap_contract"
path = "tests/contract/client/input/keyboard/client_keymap_contract.rs"

[[test]]
name = "client_microphone_gain_control_contract"
path = "tests/contract/client/input/microphone/client_microphone_gain_control_contract.rs"

[[test]]
name = "client_microphone_include_contract"
path = "tests/contract/client/input/microphone/client_microphone_include_contract.rs"

[[test]]
name = "client_microphone_requested_source_contract"
path = "tests/contract/client/input/microphone/client_microphone_requested_source_contract.rs"

[[test]]
name = "client_microphone_source_contract"
path = "tests/contract/client/input/microphone/client_microphone_source_contract.rs"

[[test]]
name = "client_microphone_startup_contract"
path = "tests/contract/client/input/microphone/client_microphone_startup_contract.rs"

[[test]]
name = "client_microphone_tap_contract"
path = "tests/contract/client/input/microphone/client_microphone_tap_contract.rs"

[[test]]
name = "client_mouse_include_contract"
path = "tests/contract/client/input/mouse/client_mouse_include_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_mouse_include_extra_contract"
path = "tests/contract/client/input/mouse/client_mouse_include_extra_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_mouse_uinput_contract"
path = "tests/contract/client/input/mouse/client_mouse_uinput_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_main_binary_contract"
path = "tests/contract/client/main/client_main_binary_contract.rs"

[[test]]
name = "client_main_process_contract"
path = "tests/contract/client/main/client_main_process_contract.rs"

[[test]]
name = "client_output_audio_include_contract"
path = "tests/contract/client/output/audio/client_output_audio_include_contract.rs"

[[test]]
name = "client_output_display_include_contract"
path = "tests/contract/client/output/display/client_output_display_include_contract.rs"

[[test]]
name = "client_output_video_include_contract"
path = "tests/contract/client/output/video/client_output_video_include_contract.rs"

[[test]]
name = "client_paste_contract"
path = "tests/contract/client/paste/client_paste_contract.rs"

[[test]]
name = "client_browser_sync_script_contract"
path = "tests/contract/client/sync_probe/client_browser_sync_script_contract.rs"

[[test]]
name = "client_hevc_bundle_audit_contract"
path = "tests/contract/client/sync_probe/client_hevc_bundle_audit_contract.rs"

[[test]]
name = "shared_hid_contract"
path = "tests/contract/common/hid/shared_hid_contract.rs"

[[test]]
name = "server_core_script_contract"
path = "tests/contract/scripts/daemon/server_core_script_contract.rs"

[[test]]
name = "server_audio_include_contract"
path = "tests/contract/server/audio/server_audio_include_contract.rs"

[[test]]
name = "server_opus_uac_contract"
path = "tests/contract/server/audio/server_opus_uac_contract.rs"

[[test]]
name = "server_camera_contract"
path = "tests/contract/server/camera/server_camera_contract.rs"

[[test]]
name = "server_gadget_include_contract"
path = "tests/contract/server/gadget/server_gadget_include_contract.rs"

[[test]]
name = "server_main_binary_contract"
path = "tests/contract/server/main/server_main_binary_contract.rs"

[[test]]
name = "server_main_binary_extra_contract"
path = "tests/contract/server/main/server_main_binary_extra_contract.rs"

[[test]]
name = "server_main_eye_hub_contract"
path = "tests/contract/server/main/server_main_eye_hub_contract.rs"

[[test]]
name = "server_main_media_extra_contract"
path = "tests/contract/server/main/server_main_media_extra_contract.rs"

[[test]]
name = "server_main_process_contract"
path = "tests/contract/server/main/server_main_process_contract.rs"

[[test]]
name = "server_runtime_contract"
path = "tests/contract/server/runtime_support/server_runtime_contract.rs"

[[test]]
name = "server_uvc_binary_contract"
path = "tests/contract/server/uvc/server_uvc_binary_contract.rs"

[[test]]
name = "server_uvc_binary_extra_contract"
path = "tests/contract/server/uvc/server_uvc_binary_extra_contract.rs"

[[test]]
name = "server_uvc_process_contract"
path = "tests/contract/server/uvc/server_uvc_process_contract.rs"

[[test]]
name = "server_uvc_script_contract"
path = "tests/contract/server/uvc/server_uvc_script_contract.rs"

[[test]]
name = "server_video_include_contract"
path = "tests/contract/server/video/server_video_include_contract.rs"

[[test]]
name = "downstream_video_mode_decoder_matrix_contract"
path = "tests/compatibility/downstream/video/downstream_video_mode_decoder_matrix_contract.rs"

[[test]]
name = "server_video_sinks_include_contract"
path = "tests/contract/server/video_sinks/server_video_sinks_include_contract.rs"

[[test]]
name = "report_schema_contract"
path = "tests/contract/diagnostics/report_schema_contract.rs"

[[test]]
name = "quality_ratchet_evidence_contract"
path = "tests/contract/testing/quality_ratchet_evidence_contract.rs"

[[test]]
name = "upstream_media_e2e_contract"
path = "tests/e2e/scripts/manual/upstream_media_e2e_contract.rs"

[[test]]
name = "client_rct_transport_summary_golden_contract"
path = "tests/golden/diagnostics/client_rct_transport_summary_golden_contract.rs"

[[test]]
name = "client_server_rct_blind_route_e2e_contract"
path = "tests/e2e/client/server/rct/client_server_rct_blind_route_e2e_contract.rs"

[[test]]
name = "server_rct_output_probe_e2e_contract"
path = "tests/e2e/server/rct/server_rct_output_probe_e2e_contract.rs"

[[test]]
name = "client_install_script_contract"
path = "tests/installer/scripts/install/client_install_script_contract.rs"

[[test]]
name = "server_install_script_contract"
path = "tests/installer/scripts/install/server_install_script_contract.rs"

[[test]]
name = "install_version_path_contract"
path = "tests/installer/scripts/install/install_version_path_contract.rs"

[[test]]
name = "relay_proto_integration_contract"
path = "tests/integration/common/proto/relay_proto_integration_contract.rs"

[[test]]
name = "relay_opus_proto_integration_contract"
path = "tests/integration/common/proto/relay_opus_proto_integration_contract.rs"

[[test]]
name = "client_server_upstream_bundle_integration"
path = "tests/integration/client/server/upstream/client_server_upstream_bundle_integration.rs"

[[test]]
name = "client_server_audio_epoch_integration"
path = "tests/integration/client/server/audio/client_server_audio_epoch_integration.rs"

[[test]]
name = "client_live_media_control_integration"
path = "tests/integration/client/runtime_controls/client_live_media_control_integration.rs"

[[test]]
name = "client_server_input_stream_integration"
path = "tests/integration/client/server/input/client_server_input_stream_integration.rs"

[[test]]
name = "hevc_mjpeg_spool_integration"
path = "tests/integration/server/video_sinks/hevc_mjpeg_spool_integration.rs"

[[test]]
name = "client_manual_sync_script_contract"
path = "tests/manual/client/sync_probe/client_manual_sync_script_contract.rs"

[[test]]
name = "client_rct_transport_probe_contract"
path = "tests/manual/client/sync_probe/client_rct_transport_probe_contract.rs"

[[test]]
name = "client_server_rc_matrix_script_contract"
path = "tests/manual/client/sync_probe/client_server_rc_matrix_script_contract.rs"

[[test]]
name = "server_rct_mode_matrix_manual_contract"
path = "tests/manual/server/rct/server_rct_mode_matrix_manual_contract.rs"

[[test]]
name = "rct_uvc_artifact_probe_manual_contract"
path = "tests/manual/server/rct/rct_uvc_artifact_probe_manual_contract.rs"

[[test]]
name = "synthetic_rct_uvc_probe_manual_contract"
path = "tests/manual/server/rct/synthetic_rct_uvc_probe_manual_contract.rs"

[[test]]
name = "google_meet_observer_manual_contract"
path = "tests/manual/google_meet/google_meet_observer_manual_contract.rs"

[[test]]
name = "uvc_frame_meta_log_contract"
path = "tests/manual/scripts/manual/uvc_frame_meta_log_contract.rs"

[[test]]
name = "probe_artifact_contract"
path = "tests/manual/artifacts/probe_artifact_contract.rs"

[[test]]
name = "hardware_media_smoke_contract"
path = "tests/manual/hardware_media/hardware_media_smoke_contract.rs"

[[test]]
name = "tethys_downstream_audio_manual_contract"
path = "tests/manual/audio/tethys_downstream_audio_manual_contract.rs"

[[test]]
name = "client_uplink_performance_contract"
path = "tests/performance/client/uplink/client_uplink_performance_contract.rs"

[[test]]
name = "opus_transport_budget_contract"
path = "tests/performance/client/uplink/opus_transport_budget_contract.rs"

[[test]]
name = "hevc_mjpeg_handoff_performance_contract"
path = "tests/performance/server/video_sinks/hevc_mjpeg_handoff_performance_contract.rs"

[[test]]
name = "server_rct_quality_budget_contract"
path = "tests/performance/server/rct/server_rct_quality_budget_contract.rs"

[[test]]
name = "client_server_rct_timing_budget_contract"
path = "tests/performance/client/server/rct/client_server_rct_timing_budget_contract.rs"

[[test]]
name = "input_latency_budget_contract"
path = "tests/performance/input/input_latency_budget_contract.rs"

[[test]]
name = "downstream_video_latency_budget_contract"
path = "tests/performance/downstream/video/downstream_video_latency_budget_contract.rs"

[[test]]
name = "performance_gate_script_contract"
path = "tests/performance/scripts/ci/performance_gate_script_contract.rs"

[[test]]
name = "stage_timing_contract"
path = "tests/performance/diagnostics/stage_timing_contract.rs"

[[test]]
name = "client_inputs_toggle_contract"
path = "tests/regression/client/input/inputs/client_inputs_toggle_contract.rs"

[[test]]
name = "client_keyboard_activation_contract"
path = "tests/regression/client/input/keyboard/client_keyboard_activation_contract.rs"
required-features = ["disruptive-input-tests"]

[[test]]
name = "client_live_controls_regression_contract"
path = "tests/regression/client/ui/client_live_controls_regression_contract.rs"

[[test]]
name = "install_preserves_calibration_contract"
path = "tests/regression/install/install_preserves_calibration_contract.rs"

[[test]]
name = "install_preserves_codec_settings_contract"
path = "tests/regression/install/install_preserves_codec_settings_contract.rs"

[[test]]
name = "server_gadget_recovery_contract"
path = "tests/regression/server/gadget/server_gadget_recovery_contract.rs"

[[test]]
name = "server_main_usb_recovery_contract"
path = "tests/regression/server/main/server_main_usb_recovery_contract.rs"

[[test]]
name = "server_mjpeg_normalizer_memory_regression"
path = "tests/regression/server/video_sinks/server_mjpeg_normalizer_memory_regression.rs"

[[test]]
name = "client_log_noise_contract"
path = "tests/reliability/client/diagnostics/client_log_noise_contract.rs"

[[test]]
name = "input_transport_gate_safety_contract"
path = "tests/reliability/scripts/ci/input_transport_gate_safety_contract.rs"

[[test]]
name = "jenkins_cadence_contract"
path = "tests/reliability/scripts/ci/jenkins_cadence_contract.rs"

[[test]]
name = "log_spam_prevention_contract"
path = "tests/reliability/diagnostics/log_spam_prevention_contract.rs"

[[test]]
name = "client_uplink_freshness_contract"
path = "tests/reliability/client/uplink/client_uplink_freshness_contract.rs"

[[test]]
name = "server_upstream_media_pairing_freshness_contract"
path = "tests/reliability/server/upstream_media_runtime/server_upstream_media_pairing_freshness_contract.rs"

[[test]]
name = "audio_epoch_recovery_reliability_contract"
path = "tests/reliability/audio/audio_epoch_recovery_reliability_contract.rs"

[[test]]
name = "server_rct_profile_switch_recovery_contract"
path = "tests/reliability/server/rct/server_rct_profile_switch_recovery_contract.rs"

[[test]]
name = "video_downstream_feed_contract"
path = "tests/reliability/video/video_downstream_feed_contract.rs"

[[test]]
name = "downstream_blackout_recovery_contract"
path = "tests/reliability/downstream/video/downstream_blackout_recovery_contract.rs"

[[test]]
name = "tls_security_contract"
path = "tests/security/scripts/install/tls_security_contract.rs"

[[test]]
name = "client_paste_security_contract"
path = "tests/security/client/paste/client_paste_security_contract.rs"

[[test]]
name = "cert_key_permissions_contract"
path = "tests/security/install/cert_key_permissions_contract.rs"

[[test]]
name = "server_tls_security_contract"
path = "tests/security/server/tls/server_tls_security_contract.rs"

[[test]]
name = "upstream_media_payload_security_contract"
path = "tests/security/server/upstream_media/upstream_media_payload_security_contract.rs"

[[test]]
name = "client_runtime_smoke_contract"
path = "tests/smoke/client/runtime/client_runtime_smoke_contract.rs"

[[test]]
name = "server_runtime_smoke_contract"
path = "tests/smoke/server/runtime_support/server_runtime_smoke_contract.rs"

[[test]]
name = "server_video_sink_smoke_contract"
path = "tests/smoke/server/video_sinks/server_video_sink_smoke_contract.rs"

[[test]]
name = "system_installation_contract"
path = "tests/system/scripts/install/system_installation_contract.rs"

[[test]]
name = "systemd_unit_env_contract"
path = "tests/system/scripts/install/systemd_unit_env_contract.rs"

[[test]]
name = "client_launcher_layout_contract"
path = "tests/ui/client/launcher/client_launcher_layout_contract.rs"

[[test]]
name = "client_launcher_runtime_contract"
path = "tests/ui/client/launcher/client_launcher_runtime_contract.rs"

[[test]]
name = "client_audio_recovery_ui_contract"
path = "tests/ui/client/launcher/client_audio_recovery_ui_contract.rs"

[[test]]
name = "client_codec_transport_ui_contract"
path = "tests/ui/client/launcher/client_codec_transport_ui_contract.rs"

[[test]]
name = "client_layout_contract"
path = "tests/ui/client/launcher/client_layout_contract.rs"

[[test]]
name = "common_hid_unit"
path = "tests/unit/common/hid/common_hid_unit.rs"

[[test]]
name = "common_audio_transport_unit"
path = "tests/unit/common/audio/common_audio_transport_unit.rs"

[[test]]
name = "common_hid_edge_cases_unit"
path = "tests/unit/common/hid/common_hid_edge_cases_unit.rs"

[[test]]
name = "client_upstream_bundle_queue_unit"
path = "tests/unit/client/uplink/client_upstream_bundle_queue_unit.rs"

[[test]]
name = "client_upstream_keyframe_state_unit"
path = "tests/unit/client/uplink/client_upstream_keyframe_state_unit.rs"

[[test]]
name = "client_audio_recovery_config_unit"
path = "tests/unit/client/app/client_audio_recovery_config_unit.rs"

[[test]]
name = "hevc_mjpeg_guard_unit"
path = "tests/unit/server/video_sinks/hevc_mjpeg_guard_unit.rs"
