Skip to main content

rocketmq_remoting/protocol/header/broker/
broker_heartbeat_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
20#[derive(Debug, Serialize, Deserialize, Default, RequestHeaderCodecV2)]
21pub struct BrokerHeartbeatRequestHeader {
22    #[serde(rename = "clusterName")]
23    #[required]
24    pub cluster_name: CheetahString,
25
26    #[serde(rename = "brokerAddr")]
27    #[required]
28    pub broker_addr: CheetahString,
29
30    #[serde(rename = "brokerName")]
31    #[required]
32    pub broker_name: CheetahString,
33
34    #[serde(rename = "brokerId")]
35    pub broker_id: Option<i64>,
36
37    pub epoch: Option<i32>,
38
39    #[serde(rename = "maxOffset")]
40    pub max_offset: Option<i64>,
41
42    #[serde(rename = "confirmOffset")]
43    pub confirm_offset: Option<i64>,
44
45    #[serde(rename = "heartbeatTimeoutMills")]
46    pub heartbeat_timeout_mills: Option<i64>,
47
48    #[serde(rename = "electionPriority")]
49    pub election_priority: Option<i32>,
50}
51
52#[cfg(test)]
53mod tests {
54    use cheetah_string::CheetahString;
55
56    use super::*;
57
58    #[test]
59    fn broker_heartbeat_request_header_with_required_fields() {
60        let header = BrokerHeartbeatRequestHeader {
61            cluster_name: CheetahString::from("testCluster"),
62            broker_addr: CheetahString::from("testAddr"),
63            broker_name: CheetahString::from("testBroker"),
64            broker_id: Some(1),
65            epoch: Some(1),
66            max_offset: Some(100),
67            confirm_offset: Some(50),
68            heartbeat_timeout_mills: Some(3000),
69            election_priority: Some(1),
70        };
71        assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
72        assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
73        assert_eq!(header.broker_name, CheetahString::from("testBroker"));
74        assert_eq!(header.broker_id, Some(1));
75        assert_eq!(header.epoch, Some(1));
76        assert_eq!(header.max_offset, Some(100));
77        assert_eq!(header.confirm_offset, Some(50));
78        assert_eq!(header.heartbeat_timeout_mills, Some(3000));
79        assert_eq!(header.election_priority, Some(1));
80    }
81
82    #[test]
83    fn broker_heartbeat_request_header_with_optional_fields() {
84        let header = BrokerHeartbeatRequestHeader {
85            cluster_name: CheetahString::from("testCluster"),
86            broker_addr: CheetahString::from("testAddr"),
87            broker_name: CheetahString::from("testBroker"),
88            broker_id: None,
89            epoch: None,
90            max_offset: None,
91            confirm_offset: None,
92            heartbeat_timeout_mills: None,
93            election_priority: None,
94        };
95        assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
96        assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
97        assert_eq!(header.broker_name, CheetahString::from("testBroker"));
98        assert!(header.broker_id.is_none());
99        assert!(header.epoch.is_none());
100        assert!(header.max_offset.is_none());
101        assert!(header.confirm_offset.is_none());
102        assert!(header.heartbeat_timeout_mills.is_none());
103        assert!(header.election_priority.is_none());
104    }
105
106    #[test]
107    fn broker_heartbeat_request_header_with_empty_values() {
108        let header = BrokerHeartbeatRequestHeader {
109            cluster_name: CheetahString::from(""),
110            broker_addr: CheetahString::from(""),
111            broker_name: CheetahString::from(""),
112            broker_id: None,
113            epoch: None,
114            max_offset: None,
115            confirm_offset: None,
116            heartbeat_timeout_mills: None,
117            election_priority: None,
118        };
119        assert_eq!(header.cluster_name, CheetahString::from(""));
120        assert_eq!(header.broker_addr, CheetahString::from(""));
121        assert_eq!(header.broker_name, CheetahString::from(""));
122        assert!(header.broker_id.is_none());
123        assert!(header.epoch.is_none());
124        assert!(header.max_offset.is_none());
125        assert!(header.confirm_offset.is_none());
126        assert!(header.heartbeat_timeout_mills.is_none());
127        assert!(header.election_priority.is_none());
128    }
129
130    #[test]
131    fn broker_heartbeat_request_header_with_long_values() {
132        let long_string = "a".repeat(1000);
133        let header = BrokerHeartbeatRequestHeader {
134            cluster_name: CheetahString::from(&long_string),
135            broker_addr: CheetahString::from(&long_string),
136            broker_name: CheetahString::from(&long_string),
137            broker_id: Some(1),
138            epoch: Some(1),
139            max_offset: Some(100),
140            confirm_offset: Some(50),
141            heartbeat_timeout_mills: Some(3000),
142            election_priority: Some(1),
143        };
144        assert_eq!(header.cluster_name, CheetahString::from(&long_string));
145        assert_eq!(header.broker_addr, CheetahString::from(&long_string));
146        assert_eq!(header.broker_name, CheetahString::from(&long_string));
147        assert_eq!(header.broker_id, Some(1));
148        assert_eq!(header.epoch, Some(1));
149        assert_eq!(header.max_offset, Some(100));
150        assert_eq!(header.confirm_offset, Some(50));
151        assert_eq!(header.heartbeat_timeout_mills, Some(3000));
152        assert_eq!(header.election_priority, Some(1));
153    }
154}