From 084e18f772dab0edc0027ee3d99605968405cebe Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 17 Feb 2026 11:58:10 +0100 Subject: [PATCH 1/3] test: add unit test for GetConsumeStatsRequestHeader --- .../get_consume_stats_request_header.rs | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/rocketmq-remoting/src/protocol/header/get_consume_stats_request_header.rs b/rocketmq-remoting/src/protocol/header/get_consume_stats_request_header.rs index ba719e07b..7d64ef072 100644 --- a/rocketmq-remoting/src/protocol/header/get_consume_stats_request_header.rs +++ b/rocketmq-remoting/src/protocol/header/get_consume_stats_request_header.rs @@ -30,9 +30,6 @@ pub struct GetConsumeStatsRequestHeader { } impl GetConsumeStatsRequestHeader { - // pub const CONSUMER_GROUP: &'static str = "consumerGroup"; - // pub const TOPIC: &'static str = "topic"; - pub fn get_consumer_group(&self) -> &CheetahString { &self.consumer_group } @@ -47,3 +44,57 @@ impl GetConsumeStatsRequestHeader { self.topic = topic; } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_consume_stats_request_header() { + let mut header = GetConsumeStatsRequestHeader { + consumer_group: CheetahString::from("testGroup"), + topic: CheetahString::from("testTopic"), + topic_request_header: None, + }; + + assert_eq!(header.get_consumer_group(), "testGroup"); + assert_eq!(header.get_topic(), "testTopic"); + + header.set_consumer_group(CheetahString::from("newGroup")); + header.set_topic(CheetahString::from("newTopic")); + + assert_eq!(header.get_consumer_group(), "newGroup"); + assert_eq!(header.get_topic(), "newTopic"); + } + #[test] + fn get_consume_stats_request_header_serde() { + let header = GetConsumeStatsRequestHeader { + consumer_group: CheetahString::from("testGroup"), + topic: CheetahString::from("testTopic"), + topic_request_header: None, + }; + + let json = serde_json::to_string(&header).unwrap(); + println!("Serialized JSON: {}", json); + + let deserialized: GetConsumeStatsRequestHeader = serde_json::from_str(&json).unwrap(); + assert_eq!(deserialized.get_consumer_group(), "testGroup"); + assert_eq!(deserialized.get_topic(), "testTopic"); + } + + #[test] + fn get_consume_stats_request_header_deserialize_with_extra_fields() { + let json = r#" + { + "consumerGroup": "testGroup", + "topic": "testTopic", + "extraField1": "extraValue1", + "extraField2": "extraValue2" + } + "#; + + let deserialized: GetConsumeStatsRequestHeader = serde_json::from_str(json).unwrap(); + assert_eq!(deserialized.get_consumer_group(), "testGroup"); + assert_eq!(deserialized.get_topic(), "testTopic"); + } +} From ab1e11a25e03f97d4dbdac1d58c618f045871c4d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 18 Feb 2026 14:30:26 +0100 Subject: [PATCH 2/3] test: add tests for QueryTopicsByConsumerRequestHeader --- ...query_topics_by_consumer_request_header.rs | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs b/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs index 8551c53c2..e30006059 100644 --- a/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs +++ b/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs @@ -107,4 +107,141 @@ mod tests { Some(CheetahString::from("broker1")) ); } + + #[test] + fn debug_impl_contains_group() { + let header = QueryTopicsByConsumerRequestHeader::new("dbg_group"); + let s = format!("{:?}", header); + assert!(s.contains("group")); + assert!(s.contains("dbg_group")); + } + + #[test] + fn getter_setter_multiple_calls() { + let mut header = QueryTopicsByConsumerRequestHeader::new("g1"); + assert_eq!(header.get_group(), "g1"); + header.set_group(CheetahString::from("g2")); + assert_eq!(header.get_group(), "g2"); + header.set_group(CheetahString::from("g3")); + assert_eq!(header.get_group(), "g3"); + } + + #[test] + fn serde_deserialize_missing_required_field_errors() { + let json = r#"{}"#; + let res: Result = serde_json::from_str(json); + assert!(res.is_err()); + } + + #[test] + fn serialization_includes_group_and_flattened_none() { + let header = QueryTopicsByConsumerRequestHeader::new(""); + let json = serde_json::to_string(&header).unwrap(); + assert!(json.contains("\"group\":")); + // rpc_request_header is None so brokerName should not appear + assert!(!json.contains("brokerName")); + } + + #[test] + fn serialization_with_rpc_request_header_some() { + let header = QueryTopicsByConsumerRequestHeader { + group: CheetahString::from("g_with_rpc"), + rpc_request_header: Some(RpcRequestHeader { + broker_name: Some(CheetahString::from("brokerX")), + ..Default::default() + }), + }; + let json = serde_json::to_string(&header).unwrap(); + assert!(json.contains("\"group\":\"g_with_rpc\"")); + assert!(json.contains("\"brokerName\":\"brokerX\"")); + } + + #[test] + fn deserialization_with_extra_fields_ignored() { + let json = r#"{"group":"gextra","unknownField":"x"}"#; + let header: QueryTopicsByConsumerRequestHeader = serde_json::from_str(json).unwrap(); + assert_eq!(header.group, "gextra"); + } + + #[test] + fn round_trip_serialization_deserialization() { + let header = QueryTopicsByConsumerRequestHeader { + group: CheetahString::from("round"), + rpc_request_header: Some(RpcRequestHeader { + broker_name: Some(CheetahString::from("rb")), + ..Default::default() + }), + }; + let json = serde_json::to_string(&header).unwrap(); + let header2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json).unwrap(); + assert_eq!(header2.group, "round"); + assert_eq!( + header2.rpc_request_header.unwrap().broker_name, + Some(CheetahString::from("rb")) + ); + } + + #[test] + fn nested_rpc_request_header_access_none_and_some() { + let header_none = QueryTopicsByConsumerRequestHeader::new("g_none"); + assert!(header_none + .rpc_request_header + .as_ref() + .and_then(|h| h.broker_name.clone()) + .is_none()); + + let header_some = QueryTopicsByConsumerRequestHeader { + group: CheetahString::from("g_some"), + rpc_request_header: Some(RpcRequestHeader { + broker_name: Some(CheetahString::from("bk1")), + ..Default::default() + }), + }; + assert_eq!( + header_some + .rpc_request_header + .as_ref() + .and_then(|h| h.broker_name.clone()), + Some(CheetahString::from("bk1")) + ); + } + + #[test] + fn special_characters_and_long_group_names() { + let special = "g-💖-\n-\u{2764}"; + let header = QueryTopicsByConsumerRequestHeader::new(special); + let json = serde_json::to_string(&header).unwrap(); + let header2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json).unwrap(); + assert_eq!(header2.group, special); + + let long: String = std::iter::repeat('a').take(5000).collect(); + let header_long = QueryTopicsByConsumerRequestHeader::new(long.clone()); + let json_long = serde_json::to_string(&header_long).unwrap(); + let header_long2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json_long).unwrap(); + assert_eq!(header_long2.group, long.as_str()); + } + + #[test] + fn malformed_json_and_wrong_field_types_error() { + let bad = "{"; + let res: Result = serde_json::from_str(bad); + assert!(res.is_err()); + + let wrong_type = r#"{"group":123}"#; + let res2: Result = serde_json::from_str(wrong_type); + assert!(res2.is_err()); + } + + #[test] + fn struct_size_check_and_empty_group_behavior() { + use std::mem; + let _sz = mem::size_of::(); + assert!(_sz > 0); + + let header_empty = QueryTopicsByConsumerRequestHeader::new(""); + let json = serde_json::to_string(&header_empty).unwrap(); + assert!(json.contains("\"group\":\"\"")); + let header2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json).unwrap(); + assert_eq!(header2.group, ""); + } } From f0a1a2a7db77b2cbe9f19be9a7f8ca4a49a7201f Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 18 Feb 2026 14:36:19 +0100 Subject: [PATCH 3/3] clippy fix --- .../protocol/header/query_topics_by_consumer_request_header.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs b/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs index e30006059..f236d1196 100644 --- a/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs +++ b/rocketmq-remoting/src/protocol/header/query_topics_by_consumer_request_header.rs @@ -214,7 +214,7 @@ mod tests { let header2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json).unwrap(); assert_eq!(header2.group, special); - let long: String = std::iter::repeat('a').take(5000).collect(); + let long = "a".repeat(5000); let header_long = QueryTopicsByConsumerRequestHeader::new(long.clone()); let json_long = serde_json::to_string(&header_long).unwrap(); let header_long2: QueryTopicsByConsumerRequestHeader = serde_json::from_str(&json_long).unwrap();