rocketmq_remoting/protocol/header/controller/
elect_master_request_header.rs1use 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}