Skip to main content

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