fix27: исправлен парсер root-класса tc без ложных совпадений

This commit is contained in:
2026-05-12 14:34:28 +05:00
parent ead1130e5f
commit a9bac8fdad
+17 -8
View File
@@ -606,14 +606,17 @@ fn is_not_found_error(stderr_or_msg: &str) -> bool {
fn parse_root_class_rate_ceil(raw: &str, class_id: &str) -> Option<ClassRateCeil> { fn parse_root_class_rate_ceil(raw: &str, class_id: &str) -> Option<ClassRateCeil> {
for line in raw.lines() { for line in raw.lines() {
let t = line.trim(); let t = line.trim();
if !t.contains("class htb") if !t.contains("class htb") || !t.contains(" rate ") || !t.contains(" ceil ") {
|| !t.contains(class_id)
|| !t.contains(" rate ")
|| !t.contains(" ceil ")
{
continue; continue;
} }
let toks: Vec<&str> = t.split_whitespace().collect(); let toks: Vec<&str> = t.split_whitespace().collect();
let class = toks
.iter()
.position(|v| *v == "htb")
.and_then(|i| toks.get(i + 1))?;
if *class != class_id {
continue;
}
let rate = toks let rate = toks
.iter() .iter()
.position(|v| *v == "rate") .position(|v| *v == "rate")
@@ -1125,10 +1128,16 @@ mod tests {
#[test] #[test]
fn parse_root_rate_ceil() { fn parse_root_rate_ceil() {
let raw = "class htb 1:1 root rate 1000Mbit ceil 1000Mbit"; let raw = "class htb 1:10 parent 1:1 leaf 800f: prio 0 rate 50Mbit ceil 50Mbit burst 1600b cburst 1600b\nclass htb 1:1 root rate 500Mbit ceil 500Mbit burst 1600b cburst 1600b";
let rc = parse_root_class_rate_ceil(raw, "1:1").expect("root class exists"); let rc = parse_root_class_rate_ceil(raw, "1:1").expect("root class exists");
assert_eq!(normalize_tc_rate(&rc.rate), "1000mbit"); assert_eq!(normalize_tc_rate(&rc.rate), "500mbit");
assert_eq!(normalize_tc_rate(&rc.ceil), "1000mbit"); assert_eq!(normalize_tc_rate(&rc.ceil), "500mbit");
}
#[test]
fn parse_root_rate_ceil_returns_none_when_only_parent_matches() {
let raw = "class htb 1:10 parent 1:1 leaf 800f: prio 0 rate 50Mbit ceil 50Mbit burst 1600b cburst 1600b";
assert!(parse_root_class_rate_ceil(raw, "1:1").is_none());
} }
#[test] #[test]