fix(sync): keep uvc recovery aligned with runtime policy
This commit is contained in:
parent
e89271e46c
commit
fbfa450e4a
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1642,7 +1642,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1676,7 +1676,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1688,7 +1688,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.14.34"
|
version = "0.14.35"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -85,6 +85,10 @@ impl UsbGadget {
|
|||||||
env::var("LESAVKA_CORE_HELPER").unwrap_or_else(|_| "/usr/local/bin/lesavka-core.sh".into())
|
env::var("LESAVKA_CORE_HELPER").unwrap_or_else(|_| "/usr/local/bin/lesavka-core.sh".into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn uvc_fallback_mode() -> String {
|
||||||
|
env::var("LESAVKA_UVC_FALLBACK").unwrap_or_else(|_| "0".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
fn run_forced_core_rebuild(&self) -> Result<String> {
|
fn run_forced_core_rebuild(&self) -> Result<String> {
|
||||||
let helper = Self::core_helper_path();
|
let helper = Self::core_helper_path();
|
||||||
let output = Command::new(&helper)
|
let output = Command::new(&helper)
|
||||||
@ -92,7 +96,7 @@ impl UsbGadget {
|
|||||||
.env("LESAVKA_ATTACH_WRITE_UDC", "1")
|
.env("LESAVKA_ATTACH_WRITE_UDC", "1")
|
||||||
.env("LESAVKA_DETACH_CLEAR_UDC", "1")
|
.env("LESAVKA_DETACH_CLEAR_UDC", "1")
|
||||||
.env("LESAVKA_RELOAD_UVCVIDEO", "1")
|
.env("LESAVKA_RELOAD_UVCVIDEO", "1")
|
||||||
.env("LESAVKA_UVC_FALLBACK", "1")
|
.env("LESAVKA_UVC_FALLBACK", Self::uvc_fallback_mode())
|
||||||
.env(
|
.env(
|
||||||
"LESAVKA_UVC_CODEC",
|
"LESAVKA_UVC_CODEC",
|
||||||
env::var("LESAVKA_UVC_CODEC").unwrap_or_else(|_| "mjpeg".to_string()),
|
env::var("LESAVKA_UVC_CODEC").unwrap_or_else(|_| "mjpeg".to_string()),
|
||||||
|
|||||||
@ -402,13 +402,56 @@ printf 'configured\n' > "$LESAVKA_GADGET_SYSFS_ROOT/class/udc/fake-ctrl.usb/stat
|
|||||||
"LESAVKA_ATTACH_WRITE_UDC=1",
|
"LESAVKA_ATTACH_WRITE_UDC=1",
|
||||||
"LESAVKA_DETACH_CLEAR_UDC=1",
|
"LESAVKA_DETACH_CLEAR_UDC=1",
|
||||||
"LESAVKA_RELOAD_UVCVIDEO=1",
|
"LESAVKA_RELOAD_UVCVIDEO=1",
|
||||||
"LESAVKA_UVC_FALLBACK=1",
|
"LESAVKA_UVC_FALLBACK=0",
|
||||||
"LESAVKA_UVC_CODEC=mjpeg",
|
"LESAVKA_UVC_CODEC=mjpeg",
|
||||||
] {
|
] {
|
||||||
assert!(dumped.contains(line), "{line} missing from {dumped}");
|
assert!(dumped.contains(line), "{line} missing from {dumped}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn recover_enumeration_honors_explicit_uvc_fallback_override() {
|
||||||
|
let dir = tempdir().expect("tempdir");
|
||||||
|
let ctrl = "fake-ctrl.usb";
|
||||||
|
build_fake_tree(dir.path(), ctrl, "lesavka-test", "not attached");
|
||||||
|
let helper = dir.path().join("fake-core-env-override.sh");
|
||||||
|
let env_dump = dir.path().join("helper-env-override.txt");
|
||||||
|
write_helper(
|
||||||
|
&helper,
|
||||||
|
r#"#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
cat > "$LESAVKA_HELPER_ENV_DUMP" <<EOF
|
||||||
|
LESAVKA_UVC_FALLBACK=${LESAVKA_UVC_FALLBACK:-}
|
||||||
|
EOF
|
||||||
|
printf 'configured\n' > "$LESAVKA_GADGET_SYSFS_ROOT/class/udc/fake-ctrl.usb/state"
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
with_fake_roots(&dir.path().join("sys"), &dir.path().join("cfg"), || {
|
||||||
|
with_fast_recovery_env(&helper, || {
|
||||||
|
with_var("LESAVKA_UVC_FALLBACK", Some("1"), || {
|
||||||
|
with_var(
|
||||||
|
"LESAVKA_HELPER_ENV_DUMP",
|
||||||
|
Some(env_dump.to_string_lossy().to_string()),
|
||||||
|
|| {
|
||||||
|
let gadget = UsbGadget::new("lesavka-test");
|
||||||
|
gadget
|
||||||
|
.recover_enumeration()
|
||||||
|
.expect("forced rebuild should recover fake UDC");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
let dumped = std::fs::read_to_string(env_dump).expect("read helper env dump");
|
||||||
|
assert!(
|
||||||
|
dumped.contains("LESAVKA_UVC_FALLBACK=1"),
|
||||||
|
"explicit fallback override missing from {dumped}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[serial]
|
#[serial]
|
||||||
fn recover_enumeration_reports_clear_failure_when_helper_leaves_udc_unattached() {
|
fn recover_enumeration_reports_clear_failure_when_helper_leaves_udc_unattached() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user