diff --git a/traffic_core/src/traffic.rs b/traffic_core/src/traffic.rs index 43c94da..2a7f4f7 100644 --- a/traffic_core/src/traffic.rs +++ b/traffic_core/src/traffic.rs @@ -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 { for line in raw.lines() { let t = line.trim(); - if !t.contains("class htb") - || !t.contains(class_id) - || !t.contains(" rate ") - || !t.contains(" ceil ") - { + if !t.contains("class htb") || !t.contains(" rate ") || !t.contains(" ceil ") { continue; } 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 .iter() .position(|v| *v == "rate") @@ -1125,10 +1128,16 @@ mod tests { #[test] 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"); - assert_eq!(normalize_tc_rate(&rc.rate), "1000mbit"); - assert_eq!(normalize_tc_rate(&rc.ceil), "1000mbit"); + assert_eq!(normalize_tc_rate(&rc.rate), "500mbit"); + 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]