[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 = "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 = "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 = "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"