Skip to main content

rocketmq_remoting/protocol/header/namesrv/
broker_request.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 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}