rocketmq_remoting/protocol/header/broker/
broker_heartbeat_request_header.rs

1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18use cheetah_string::CheetahString;
19use rocketmq_macros::RequestHeaderCodecV2;
20use serde::Deserialize;
21use serde::Serialize;
22
23#[derive(Debug, Serialize, Deserialize, Default, RequestHeaderCodecV2)]
24pub struct BrokerHeartbeatRequestHeader {
25    #[serde(rename = "clusterName")]
26    #[required]
27    pub cluster_name: CheetahString,
28
29    #[serde(rename = "brokerAddr")]
30    #[required]
31    pub broker_addr: CheetahString,
32
33    #[serde(rename = "brokerName")]
34    #[required]
35    pub broker_name: CheetahString,
36
37    #[serde(rename = "brokerId")]
38    pub broker_id: Option<i64>,
39
40    pub epoch: Option<i32>,
41
42    #[serde(rename = "maxOffset")]
43    pub max_offset: Option<i64>,
44
45    #[serde(rename = "confirmOffset")]
46    pub confirm_offset: Option<i64>,
47
48    #[serde(rename = "heartbeatTimeoutMills")]
49    pub heartbeat_timeout_mills: Option<i64>,
50
51    #[serde(rename = "electionPriority")]
52    pub election_priority: Option<i32>,
53}
54
55#[cfg(test)]
56mod tests {
57    use cheetah_string::CheetahString;
58
59    use super::*;
60
61    #[test]
62    fn broker_heartbeat_request_header_with_required_fields() {
63        let header = BrokerHeartbeatRequestHeader {
64            cluster_name: CheetahString::from("testCluster"),
65            broker_addr: CheetahString::from("testAddr"),
66            broker_name: CheetahString::from("testBroker"),
67            broker_id: Some(1),
68            epoch: Some(1),
69            max_offset: Some(100),
70            confirm_offset: Some(50),
71            heartbeat_timeout_mills: Some(3000),
72            election_priority: Some(1),
73        };
74        assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
75        assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
76        assert_eq!(header.broker_name, CheetahString::from("testBroker"));
77        assert_eq!(header.broker_id, Some(1));
78        assert_eq!(header.epoch, Some(1));
79        assert_eq!(header.max_offset, Some(100));
80        assert_eq!(header.confirm_offset, Some(50));
81        assert_eq!(header.heartbeat_timeout_mills, Some(3000));
82        assert_eq!(header.election_priority, Some(1));
83    }
84
85    #[test]
86    fn broker_heartbeat_request_header_with_optional_fields() {
87        let header = BrokerHeartbeatRequestHeader {
88            cluster_name: CheetahString::from("testCluster"),
89            broker_addr: CheetahString::from("testAddr"),
90            broker_name: CheetahString::from("testBroker"),
91            broker_id: None,
92            epoch: None,
93            max_offset: None,
94            confirm_offset: None,
95            heartbeat_timeout_mills: None,
96            election_priority: None,
97        };
98        assert_eq!(header.cluster_name, CheetahString::from("testCluster"));
99        assert_eq!(header.broker_addr, CheetahString::from("testAddr"));
100        assert_eq!(header.broker_name, CheetahString::from("testBroker"));
101        assert!(header.broker_id.is_none());
102        assert!(header.epoch.is_none());
103        assert!(header.max_offset.is_none());
104        assert!(header.confirm_offset.is_none());
105        assert!(header.heartbeat_timeout_mills.is_none());
106        assert!(header.election_priority.is_none());
107    }
108
109    #[test]
110    fn broker_heartbeat_request_header_with_empty_values() {
111        let header = BrokerHeartbeatRequestHeader {
112            cluster_name: CheetahString::from(""),
113            broker_addr: CheetahString::from(""),
114            broker_name: CheetahString::from(""),
115            broker_id: None,
116            epoch: None,
117            max_offset: None,
118            confirm_offset: None,
119            heartbeat_timeout_mills: None,
120            election_priority: None,
121        };
122        assert_eq!(header.cluster_name, CheetahString::from(""));
123        assert_eq!(header.broker_addr, CheetahString::from(""));
124        assert_eq!(header.broker_name, CheetahString::from(""));
125        assert!(header.broker_id.is_none());
126        assert!(header.epoch.is_none());
127        assert!(header.max_offset.is_none());
128        assert!(header.confirm_offset.is_none());
129        assert!(header.heartbeat_timeout_mills.is_none());
130        assert!(header.election_priority.is_none());
131    }
132
133    #[test]
134    fn broker_heartbeat_request_header_with_long_values() {
135        let long_string = "a".repeat(1000);
136        let header = BrokerHeartbeatRequestHeader {
137            cluster_name: CheetahString::from(&long_string),
138            broker_addr: CheetahString::from(&long_string),
139            broker_name: CheetahString::from(&long_string),
140            broker_id: Some(1),
141            epoch: Some(1),
142            max_offset: Some(100),
143            confirm_offset: Some(50),
144            heartbeat_timeout_mills: Some(3000),
145            election_priority: Some(1),
146        };
147        assert_eq!(header.cluster_name, CheetahString::from(&long_string));
148        assert_eq!(header.broker_addr, CheetahString::from(&long_string));
149        assert_eq!(header.broker_name, CheetahString::from(&long_string));
150        assert_eq!(header.broker_id, Some(1));
151        assert_eq!(header.epoch, Some(1));
152        assert_eq!(header.max_offset, Some(100));
153        assert_eq!(header.confirm_offset, Some(50));
154        assert_eq!(header.heartbeat_timeout_mills, Some(3000));
155        assert_eq!(header.election_priority, Some(1));
156    }
157}