rocketmq_remoting/protocol/header/namesrv/
broker_request.rs1use std::fmt::Display;
16
17use cheetah_string::CheetahString;
18use rocketmq_macros::RequestHeaderCodecV2;
19use serde::Deserialize;
20use serde::Serialize;
21
22#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
23#[serde(rename_all = "camelCase")]
24pub struct UnRegisterBrokerRequestHeader {
25 #[required]
26 pub broker_name: CheetahString,
27
28 #[required]
29 pub broker_addr: CheetahString,
30
31 #[required]
32 pub cluster_name: CheetahString,
33
34 #[required]
35 pub broker_id: u64,
36}
37
38impl UnRegisterBrokerRequestHeader {
39 pub fn new(
40 broker_name: impl Into<CheetahString>,
41 broker_addr: impl Into<CheetahString>,
42 cluster_name: impl Into<CheetahString>,
43 broker_id: u64,
44 ) -> Self {
45 Self {
46 broker_name: broker_name.into(),
47 broker_addr: broker_addr.into(),
48 cluster_name: cluster_name.into(),
49 broker_id,
50 }
51 }
52}
53
54impl Display for UnRegisterBrokerRequestHeader {
55 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56 write!(
57 f,
58 "UnRegisterBrokerRequestHeader {{ brokerName: {}, brokerAddr: {}, clusterName: {}, brokerId: {} }}",
59 self.broker_name, self.broker_addr, self.cluster_name, self.broker_id
60 )
61 }
62}
63
64#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
65#[serde(rename_all = "camelCase")]
66pub struct BrokerHeartbeatRequestHeader {
67 #[required]
68 pub cluster_name: CheetahString,
69
70 #[required]
71 pub broker_addr: CheetahString,
72
73 #[required]
74 pub broker_name: CheetahString,
75 pub broker_id: Option<i64>,
76 pub epoch: Option<i32>,
77 pub max_offset: Option<i64>,
78 pub confirm_offset: Option<i64>,
79 pub heartbeat_timeout_mills: Option<i64>,
80 pub election_priority: Option<i32>,
81}
82
83#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
84#[serde(rename_all = "camelCase")]
85pub struct GetBrokerMemberGroupRequestHeader {
86 #[required]
87 pub cluster_name: CheetahString,
88 #[required]
89 pub broker_name: CheetahString,
90}
91
92impl GetBrokerMemberGroupRequestHeader {
93 pub fn new(cluster_name: impl Into<CheetahString>, broker_name: impl Into<CheetahString>) -> Self {
94 Self {
95 cluster_name: cluster_name.into(),
96 broker_name: broker_name.into(),
97 }
98 }
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104
105 #[test]
106 fn new_creates_instance_with_correct_values() {
107 let header = GetBrokerMemberGroupRequestHeader::new("testCluster", "testBroker");
108 assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
109 assert_eq!(header.broker_name, CheetahString::from("testBroker"));
110 }
111
112 #[test]
113 fn new_creates_instance_with_empty_values() {
114 let header = GetBrokerMemberGroupRequestHeader::new("", "");
115 assert_eq!(header.cluster_name, CheetahString::from(""));
116 assert_eq!(header.broker_name, CheetahString::from(""));
117 }
118
119 #[test]
120 fn new_creates_instance_with_long_values() {
121 let long_string = "a".repeat(1000);
122 let header = GetBrokerMemberGroupRequestHeader::new(&long_string, &long_string);
123 assert_eq!(header.cluster_name, CheetahString::from(&long_string));
124 assert_eq!(header.broker_name, CheetahString::from(&long_string));
125 }
126
127 #[test]
128 fn broker_heartbeat_request_header_with_required_fields() {
129 let header = BrokerHeartbeatRequestHeader {
130 cluster_name: CheetahString::from("testCluster"),
131 broker_addr: CheetahString::from("testAddr"),
132 broker_name: CheetahString::from("testBroker"),
133 broker_id: Some(1),
134 epoch: Some(1),
135 max_offset: Some(100),
136 confirm_offset: Some(50),
137 heartbeat_timeout_mills: Some(3000),
138 election_priority: Some(1),
139 };
140 assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
141 assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
142 assert_eq!(header.broker_name, CheetahString::from("testBroker"));
143 assert_eq!(header.broker_id, Some(1));
144 assert_eq!(header.epoch, Some(1));
145 assert_eq!(header.max_offset, Some(100));
146 assert_eq!(header.confirm_offset, Some(50));
147 assert_eq!(header.heartbeat_timeout_mills, Some(3000));
148 assert_eq!(header.election_priority, Some(1));
149 }
150
151 #[test]
152 fn broker_heartbeat_request_header_with_optional_fields() {
153 let header = BrokerHeartbeatRequestHeader {
154 cluster_name: CheetahString::from("testCluster"),
155 broker_addr: CheetahString::from("testAddr"),
156 broker_name: CheetahString::from("testBroker"),
157 broker_id: None,
158 epoch: None,
159 max_offset: None,
160 confirm_offset: None,
161 heartbeat_timeout_mills: None,
162 election_priority: None,
163 };
164 assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
165 assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
166 assert_eq!(header.broker_name, CheetahString::from("testBroker"));
167 assert!(header.broker_id.is_none());
168 assert!(header.epoch.is_none());
169 assert!(header.max_offset.is_none());
170 assert!(header.confirm_offset.is_none());
171 assert!(header.heartbeat_timeout_mills.is_none());
172 assert!(header.election_priority.is_none());
173 }
174
175 #[test]
176 fn broker_heartbeat_request_header_with_empty_values() {
177 let header = BrokerHeartbeatRequestHeader {
178 cluster_name: CheetahString::from(""),
179 broker_addr: CheetahString::from(""),
180 broker_name: CheetahString::from(""),
181 broker_id: None,
182 epoch: None,
183 max_offset: None,
184 confirm_offset: None,
185 heartbeat_timeout_mills: None,
186 election_priority: None,
187 };
188 assert_eq!(header.cluster_name, CheetahString::from(""));
189 assert_eq!(header.broker_addr, CheetahString::from(""));
190 assert_eq!(header.broker_name, CheetahString::from(""));
191 assert!(header.broker_id.is_none());
192 assert!(header.epoch.is_none());
193 assert!(header.max_offset.is_none());
194 assert!(header.confirm_offset.is_none());
195 assert!(header.heartbeat_timeout_mills.is_none());
196 assert!(header.election_priority.is_none());
197 }
198
199 #[test]
200 fn broker_heartbeat_request_header_with_long_values() {
201 let long_string = "a".repeat(1000);
202 let header = BrokerHeartbeatRequestHeader {
203 cluster_name: CheetahString::from(&long_string),
204 broker_addr: CheetahString::from(&long_string),
205 broker_name: CheetahString::from(&long_string),
206 broker_id: Some(1),
207 epoch: Some(1),
208 max_offset: Some(100),
209 confirm_offset: Some(50),
210 heartbeat_timeout_mills: Some(3000),
211 election_priority: Some(1),
212 };
213 assert_eq!(header.cluster_name, CheetahString::from(&long_string));
214 assert_eq!(header.broker_addr, CheetahString::from(&long_string));
215 assert_eq!(header.broker_name, CheetahString::from(&long_string));
216 assert_eq!(header.broker_id, Some(1));
217 assert_eq!(header.epoch, Some(1));
218 assert_eq!(header.max_offset, Some(100));
219 assert_eq!(header.confirm_offset, Some(50));
220 assert_eq!(header.heartbeat_timeout_mills, Some(3000));
221 assert_eq!(header.election_priority, Some(1));
222 }
223
224 #[test]
225 fn unregister_broker_request_header_display() {
226 let header = UnRegisterBrokerRequestHeader::new("name", "addr", "cluster", 1);
227 let display = format!("{}", header);
228 let expected =
229 "UnRegisterBrokerRequestHeader { brokerName: name, brokerAddr: addr, clusterName: cluster, brokerId: 1 }";
230 assert_eq!(display, expected);
231 }
232}