Skip to main content

rocketmq_remoting/protocol/header/controller/
elect_master_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_common::TimeUtils::current_millis;
17use rocketmq_macros::RequestHeaderCodecV2;
18use serde::Deserialize;
19use serde::Serialize;
20
21#[derive(Clone, Debug, Serialize, Deserialize, RequestHeaderCodecV2)]
22#[serde(rename_all = "camelCase")]
23pub struct ElectMasterRequestHeader {
24    #[required]
25    pub cluster_name: CheetahString,
26
27    #[required]
28    pub broker_name: CheetahString,
29
30    #[required]
31    pub broker_id: i64,
32
33    #[required]
34    pub designate_elect: bool,
35
36    pub invoke_time: u64,
37}
38
39impl ElectMasterRequestHeader {
40    pub fn new(
41        cluster_name: impl Into<CheetahString>,
42        broker_name: impl Into<CheetahString>,
43        broker_id: i64,
44        designate_elect: bool,
45        invoke_time: u64,
46    ) -> Self {
47        Self {
48            cluster_name: cluster_name.into(),
49            broker_name: broker_name.into(),
50            broker_id,
51            designate_elect,
52            invoke_time,
53        }
54    }
55}
56
57impl Default for ElectMasterRequestHeader {
58    fn default() -> Self {
59        Self {
60            cluster_name: CheetahString::new(),
61            broker_name: CheetahString::new(),
62            broker_id: 0,
63            designate_elect: false,
64            invoke_time: current_millis(),
65        }
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use std::collections::HashMap;
72
73    use super::*;
74    use crate::protocol::command_custom_header::CommandCustomHeader;
75    use crate::protocol::command_custom_header::FromMap;
76
77    #[test]
78    fn elect_master_request_header_new() {
79        let header = ElectMasterRequestHeader::new("test_cluster", "test_broker", 123, true, 1234567890);
80        assert_eq!(header.cluster_name, "test_cluster");
81        assert_eq!(header.broker_name, "test_broker");
82        assert_eq!(header.broker_id, 123);
83        assert!(header.designate_elect);
84        assert_eq!(header.invoke_time, 1234567890);
85    }
86
87    #[test]
88    fn elect_master_request_header_serializes_correctly() {
89        let header = ElectMasterRequestHeader::new("test_cluster", "test_broker", 123, true, 1234567890);
90        let map = header.to_map().unwrap();
91        assert_eq!(
92            map.get(&CheetahString::from_static_str("clusterName")).unwrap(),
93            "test_cluster"
94        );
95        assert_eq!(
96            map.get(&CheetahString::from_static_str("brokerName")).unwrap(),
97            "test_broker"
98        );
99        assert_eq!(map.get(&CheetahString::from_static_str("brokerId")).unwrap(), "123");
100        assert_eq!(
101            map.get(&CheetahString::from_static_str("designateElect")).unwrap(),
102            "true"
103        );
104        assert_eq!(
105            map.get(&CheetahString::from_static_str("invokeTime")).unwrap(),
106            "1234567890"
107        );
108    }
109
110    #[test]
111    fn elect_master_request_header_deserializes_correctly() {
112        let mut map = HashMap::new();
113        map.insert(
114            CheetahString::from_static_str("clusterName"),
115            CheetahString::from_static_str("test_cluster"),
116        );
117        map.insert(
118            CheetahString::from_static_str("brokerName"),
119            CheetahString::from_static_str("test_broker"),
120        );
121        map.insert(
122            CheetahString::from_static_str("brokerId"),
123            CheetahString::from_static_str("123"),
124        );
125        map.insert(
126            CheetahString::from_static_str("designateElect"),
127            CheetahString::from_static_str("true"),
128        );
129        map.insert(
130            CheetahString::from_static_str("invokeTime"),
131            CheetahString::from_static_str("1234567890"),
132        );
133
134        let header = <ElectMasterRequestHeader as FromMap>::from(&map).unwrap();
135        assert_eq!(header.cluster_name, "test_cluster");
136        assert_eq!(header.broker_name, "test_broker");
137        assert_eq!(header.broker_id, 123);
138        assert!(header.designate_elect);
139        assert_eq!(header.invoke_time, 1234567890);
140    }
141
142    #[test]
143    fn elect_master_request_header_default() {
144        let header = ElectMasterRequestHeader::default();
145        assert_eq!(header.cluster_name, "");
146        assert_eq!(header.broker_name, "");
147        assert_eq!(header.broker_id, 0);
148        assert!(!header.designate_elect);
149        assert!(header.invoke_time > 0);
150    }
151
152    #[test]
153    fn elect_master_request_header_clone() {
154        let header = ElectMasterRequestHeader::new("test_cluster", "test_broker", 123, true, 1234567890);
155        let cloned = header.clone();
156        assert_eq!(header.cluster_name, cloned.cluster_name);
157        assert_eq!(header.broker_name, cloned.broker_name);
158        assert_eq!(header.broker_id, cloned.broker_id);
159        assert_eq!(header.designate_elect, cloned.designate_elect);
160        assert_eq!(header.invoke_time, cloned.invoke_time);
161    }
162}