rocketmq_protocol/protocol/header/
get_meta_data_response_header.rs1use 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}