Skip to main content

rocketmq_protocol/protocol/header/controller/
alter_sync_state_set_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::alter_sync_state_set_request_header::AlterSyncStateSetRequestHeader",
28    java_class = "org.apache.rocketmq.remoting.protocol.header.controller.AlterSyncStateSetRequestHeader"
29)]
30pub struct AlterSyncStateSetRequestHeader {
31    #[header(default, default_semantic = "literal:")]
32    pub broker_name: CheetahString,
33    #[header(default, default_semantic = "literal:0")]
34    pub master_broker_id: i64,
35    #[header(default, default_semantic = "literal:0")]
36    pub master_epoch: i32,
37    #[serde(default = "default_invoke_time")]
38    #[header(
39        default_with = "default_invoke_time",
40        default_semantic = "dynamic:current_time_millis",
41        range = "i64"
42    )]
43    pub invoke_time: u64,
44}
45
46impl Default for AlterSyncStateSetRequestHeader {
47    fn default() -> Self {
48        Self {
49            broker_name: CheetahString::new(),
50            master_broker_id: 0,
51            master_epoch: 0,
52            invoke_time: default_invoke_time(),
53        }
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use std::collections::HashMap;
60
61    use super::*;
62    use crate::protocol::command_custom_header::CommandCustomHeader;
63    use crate::protocol::command_custom_header::FromMap;
64
65    #[test]
66    fn alter_sync_state_set_request_header_serializes_correctly() {
67        let header = AlterSyncStateSetRequestHeader {
68            broker_name: CheetahString::from_static_str("test_broker"),
69            master_broker_id: 1234567890,
70            master_epoch: 5,
71            invoke_time: 1234567891,
72        };
73        let map = header.to_map().unwrap();
74        assert_eq!(
75            map.get(&CheetahString::from_static_str("brokerName")).unwrap(),
76            "test_broker"
77        );
78        assert_eq!(
79            map.get(&CheetahString::from_static_str("masterBrokerId")).unwrap(),
80            "1234567890"
81        );
82        assert_eq!(map.get(&CheetahString::from_static_str("masterEpoch")).unwrap(), "5");
83        assert_eq!(
84            map.get(&CheetahString::from_static_str("invokeTime")).unwrap(),
85            "1234567891"
86        );
87    }
88
89    #[test]
90    fn alter_sync_state_set_request_header_deserializes_correctly() {
91        let mut map = HashMap::new();
92        map.insert(
93            CheetahString::from_static_str("brokerName"),
94            CheetahString::from_static_str("test_broker"),
95        );
96        map.insert(
97            CheetahString::from_static_str("masterBrokerId"),
98            CheetahString::from_static_str("1234567890"),
99        );
100        map.insert(
101            CheetahString::from_static_str("masterEpoch"),
102            CheetahString::from_static_str("5"),
103        );
104
105        let header = <AlterSyncStateSetRequestHeader as FromMap>::from(&map).unwrap();
106        assert_eq!(header.broker_name, "test_broker");
107        assert_eq!(header.master_broker_id, 1234567890);
108        assert_eq!(header.master_epoch, 5);
109        assert!(header.invoke_time > 0);
110    }
111
112    #[test]
113    fn alter_sync_state_set_request_header_default() {
114        let header = AlterSyncStateSetRequestHeader::default();
115        assert_eq!(header.broker_name, "");
116        assert_eq!(header.master_broker_id, 0);
117        assert_eq!(header.master_epoch, 0);
118        assert!(header.invoke_time > 0);
119    }
120}