Skip to main content

rocketmq_protocol/protocol/header/
get_meta_data_response_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 rocketmq_macros::RequestHeaderCodec;
16use serde::Deserialize;
17use serde::Serialize;
18
19use crate::protocol::CheetahString;
20
21#[derive(Clone, Debug, Serialize, Deserialize, Default, RequestHeaderCodec)]
22#[serde(rename_all = "camelCase")]
23#[header(
24    type_id = "rocketmq_protocol::protocol::header::get_meta_data_response_header::GetMetaDataResponseHeader",
25    java_class = "org.apache.rocketmq.remoting.protocol.header.controller.GetMetaDataResponseHeader"
26)]
27pub struct GetMetaDataResponseHeader {
28    pub group: Option<CheetahString>,
29    pub controller_leader_id: Option<CheetahString>,
30    pub controller_leader_address: Option<CheetahString>,
31    pub is_leader: Option<bool>,
32    pub peers: Option<CheetahString>,
33    #[header(range = "i64")]
34    pub last_log_index: Option<u64>,
35    #[header(range = "i64")]
36    pub committed_log_index: Option<u64>,
37    #[header(range = "i64")]
38    pub applied_log_index: Option<u64>,
39}
40
41#[cfg(test)]
42impl GetMetaDataResponseHeader {
43    const GROUP: &'static str = "group";
44    const CONTROLLER_LEADER_ID: &'static str = "controllerLeaderId";
45    const CONTROLLER_LEADER_ADDRESS: &'static str = "controllerLeaderAddress";
46    const IS_LEADER: &'static str = "isLeader";
47    const PEERS: &'static str = "peers";
48    const LAST_LOG_INDEX: &'static str = "lastLogIndex";
49    const COMMITTED_LOG_INDEX: &'static str = "committedLogIndex";
50    const APPLIED_LOG_INDEX: &'static str = "appliedLogIndex";
51}
52
53#[cfg(test)]
54mod tests {
55    use std::collections::HashMap;
56
57    use super::*;
58    use crate::protocol::command_custom_header::CommandCustomHeader;
59    use crate::protocol::command_custom_header::FromMap;
60
61    #[test]
62    fn get_meta_data_response_header_serializes_correctly() {
63        let header = GetMetaDataResponseHeader {
64            group: Some(CheetahString::from_static_str("test_group")),
65            controller_leader_id: Some(CheetahString::from_static_str("1")),
66            controller_leader_address: Some(CheetahString::from_static_str("192.168.1.1:9876")),
67            is_leader: Some(true),
68            peers: Some(CheetahString::from_static_str("192.168.1.1:9876,192.168.1.2:9876")),
69            last_log_index: Some(103),
70            committed_log_index: Some(102),
71            applied_log_index: Some(101),
72        };
73        let map = header.to_map().unwrap();
74        assert_eq!(
75            map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::GROUP))
76                .unwrap(),
77            "test_group"
78        );
79        assert_eq!(
80            map.get(&CheetahString::from_static_str(
81                GetMetaDataResponseHeader::CONTROLLER_LEADER_ID
82            ))
83            .unwrap(),
84            "1"
85        );
86        assert_eq!(
87            map.get(&CheetahString::from_static_str(
88                GetMetaDataResponseHeader::CONTROLLER_LEADER_ADDRESS
89            ))
90            .unwrap(),
91            "192.168.1.1:9876"
92        );
93        assert_eq!(
94            map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::IS_LEADER))
95                .unwrap(),
96            "true"
97        );
98        assert_eq!(
99            map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::PEERS))
100                .unwrap(),
101            "192.168.1.1:9876,192.168.1.2:9876"
102        );
103        assert_eq!(
104            map.get(&CheetahString::from_static_str(
105                GetMetaDataResponseHeader::LAST_LOG_INDEX
106            ))
107            .unwrap(),
108            "103"
109        );
110        assert_eq!(
111            map.get(&CheetahString::from_static_str(
112                GetMetaDataResponseHeader::COMMITTED_LOG_INDEX
113            ))
114            .unwrap(),
115            "102"
116        );
117        assert_eq!(
118            map.get(&CheetahString::from_static_str(
119                GetMetaDataResponseHeader::APPLIED_LOG_INDEX
120            ))
121            .unwrap(),
122            "101"
123        );
124    }
125
126    #[test]
127    fn get_meta_data_response_header_deserializes_correctly() {
128        let mut map = HashMap::new();
129        map.insert(
130            CheetahString::from_static_str(GetMetaDataResponseHeader::GROUP),
131            CheetahString::from("test_group"),
132        );
133        map.insert(
134            CheetahString::from_static_str(GetMetaDataResponseHeader::CONTROLLER_LEADER_ID),
135            CheetahString::from("1"),
136        );
137        map.insert(
138            CheetahString::from_static_str(GetMetaDataResponseHeader::CONTROLLER_LEADER_ADDRESS),
139            CheetahString::from("192.168.1.1:9876"),
140        );
141        map.insert(
142            CheetahString::from_static_str(GetMetaDataResponseHeader::IS_LEADER),
143            CheetahString::from("true"),
144        );
145        map.insert(
146            CheetahString::from_static_str(GetMetaDataResponseHeader::PEERS),
147            CheetahString::from("192.168.1.1:9876,192.168.1.2:9876"),
148        );
149        map.insert(
150            CheetahString::from_static_str(GetMetaDataResponseHeader::LAST_LOG_INDEX),
151            CheetahString::from("103"),
152        );
153        map.insert(
154            CheetahString::from_static_str(GetMetaDataResponseHeader::COMMITTED_LOG_INDEX),
155            CheetahString::from("102"),
156        );
157        map.insert(
158            CheetahString::from_static_str(GetMetaDataResponseHeader::APPLIED_LOG_INDEX),
159            CheetahString::from("101"),
160        );
161        let header = <GetMetaDataResponseHeader as FromMap>::from(&map).unwrap();
162        assert_eq!(header.group, Some(CheetahString::from_static_str("test_group")));
163        assert_eq!(header.controller_leader_id, Some(CheetahString::from_static_str("1")));
164        assert_eq!(
165            header.controller_leader_address,
166            Some(CheetahString::from_static_str("192.168.1.1:9876"))
167        );
168        assert_eq!(header.is_leader, Some(true));
169        assert_eq!(
170            header.peers,
171            Some(CheetahString::from_static_str("192.168.1.1:9876,192.168.1.2:9876"))
172        );
173        assert_eq!(header.last_log_index, Some(103));
174        assert_eq!(header.committed_log_index, Some(102));
175        assert_eq!(header.applied_log_index, Some(101));
176    }
177
178    #[test]
179    fn get_meta_data_response_header_handles_missing_optional_fields() {
180        let map = HashMap::new();
181        let header = <GetMetaDataResponseHeader as FromMap>::from(&map).unwrap();
182        assert!(header.group.is_none());
183        assert!(header.controller_leader_id.is_none());
184        assert!(header.controller_leader_address.is_none());
185        assert!(header.is_leader.is_none());
186        assert!(header.peers.is_none());
187        assert!(header.last_log_index.is_none());
188        assert!(header.committed_log_index.is_none());
189        assert!(header.applied_log_index.is_none());
190    }
191}