Skip to main content

rocketmq_remoting/protocol/header/
get_consumer_status_request_header.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use cheetah_string::CheetahString;
16use rocketmq_macros::RequestHeaderCodecV2;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::rpc::rpc_request_header::RpcRequestHeader;
21
22/// Request header for getting consumer status from client.
23#[derive(Clone, Debug, Serialize, Deserialize, Default, RequestHeaderCodecV2)]
24#[serde(rename_all = "camelCase")]
25pub struct GetConsumerStatusRequestHeader {
26    #[required]
27    pub topic: CheetahString,
28
29    #[required]
30    pub group: CheetahString,
31
32    pub client_addr: Option<CheetahString>,
33
34    #[serde(flatten)]
35    pub rpc_request_header: Option<RpcRequestHeader>,
36}
37
38impl GetConsumerStatusRequestHeader {
39    pub fn new(topic: CheetahString, group: CheetahString) -> Self {
40        Self {
41            topic,
42            group,
43            client_addr: None,
44            rpc_request_header: None,
45        }
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use std::collections::HashMap;
52
53    use super::*;
54    use crate::protocol::command_custom_header::FromMap;
55
56    #[test]
57    fn get_consumer_status_request_header_default() {
58        let header = GetConsumerStatusRequestHeader::default();
59        assert_eq!(header.topic, "");
60        assert_eq!(header.group, "");
61        assert!(header.client_addr.is_none());
62        assert!(header.rpc_request_header.is_none());
63    }
64
65    #[test]
66    fn get_consumer_status_request_header_new() {
67        let header = GetConsumerStatusRequestHeader::new(CheetahString::from("topic1"), CheetahString::from("group1"));
68        assert_eq!(header.topic, "topic1");
69        assert_eq!(header.group, "group1");
70        assert!(header.client_addr.is_none());
71        assert!(header.rpc_request_header.is_none());
72    }
73
74    #[test]
75    fn get_consumer_status_request_header_serialization() {
76        let header = GetConsumerStatusRequestHeader {
77            topic: CheetahString::from("topic1"),
78            group: CheetahString::from("group1"),
79            client_addr: Some(CheetahString::from("127.0.0.1")),
80            rpc_request_header: Some(RpcRequestHeader {
81                broker_name: Some(CheetahString::from("broker")),
82                ..Default::default()
83            }),
84        };
85        let json = serde_json::to_string(&header).unwrap();
86        assert!(json.contains("\"topic\":\"topic1\""));
87        assert!(json.contains("\"group\":\"group1\""));
88        assert!(json.contains("\"clientAddr\":\"127.0.0.1\""));
89        assert!(json.contains("\"brokerName\":\"broker\""));
90    }
91
92    #[test]
93    fn get_consumer_status_request_header_deserialization() {
94        let json = r#"{"topic":"topic1","group":"group1","clientAddr":"127.0.0.1","brokerName":"broker"}"#;
95        let header: GetConsumerStatusRequestHeader = serde_json::from_str(json).unwrap();
96        assert_eq!(header.topic, "topic1");
97        assert_eq!(header.group, "group1");
98        assert_eq!(header.client_addr, Some(CheetahString::from("127.0.0.1")));
99        assert_eq!(
100            header.rpc_request_header.unwrap().broker_name,
101            Some(CheetahString::from("broker"))
102        );
103    }
104
105    #[test]
106    fn get_consumer_status_request_header_from_map() {
107        let mut map = HashMap::new();
108        map.insert(CheetahString::from("topic"), CheetahString::from("topic1"));
109        map.insert(CheetahString::from("group"), CheetahString::from("group1"));
110        map.insert(CheetahString::from("clientAddr"), CheetahString::from("127.0.0.1"));
111        map.insert(CheetahString::from("brokerName"), CheetahString::from("broker1"));
112
113        let header = <GetConsumerStatusRequestHeader as FromMap>::from(&map).unwrap();
114        assert_eq!(header.topic, "topic1");
115        assert_eq!(header.group, "group1");
116        assert_eq!(header.client_addr, Some(CheetahString::from("127.0.0.1")));
117        assert_eq!(
118            header.rpc_request_header.unwrap().broker_name,
119            Some(CheetahString::from("broker1"))
120        );
121    }
122}