use rocketmq_macros::RequestHeaderCodec;
use serde::Deserialize;
use serde::Serialize;
use crate::protocol::CheetahString;
#[derive(Clone, Debug, Serialize, Deserialize, Default, RequestHeaderCodec)]
#[serde(rename_all = "camelCase")]
#[header(
type_id = "rocketmq_protocol::protocol::header::get_meta_data_response_header::GetMetaDataResponseHeader",
java_class = "org.apache.rocketmq.remoting.protocol.header.controller.GetMetaDataResponseHeader"
)]
pub struct GetMetaDataResponseHeader {
pub group: Option<CheetahString>,
pub controller_leader_id: Option<CheetahString>,
pub controller_leader_address: Option<CheetahString>,
pub is_leader: Option<bool>,
pub peers: Option<CheetahString>,
#[header(range = "i64")]
pub last_log_index: Option<u64>,
#[header(range = "i64")]
pub committed_log_index: Option<u64>,
#[header(range = "i64")]
pub applied_log_index: Option<u64>,
}
#[cfg(test)]
impl GetMetaDataResponseHeader {
const GROUP: &'static str = "group";
const CONTROLLER_LEADER_ID: &'static str = "controllerLeaderId";
const CONTROLLER_LEADER_ADDRESS: &'static str = "controllerLeaderAddress";
const IS_LEADER: &'static str = "isLeader";
const PEERS: &'static str = "peers";
const LAST_LOG_INDEX: &'static str = "lastLogIndex";
const COMMITTED_LOG_INDEX: &'static str = "committedLogIndex";
const APPLIED_LOG_INDEX: &'static str = "appliedLogIndex";
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
use super::*;
use crate::protocol::command_custom_header::CommandCustomHeader;
use crate::protocol::command_custom_header::FromMap;
#[test]
fn get_meta_data_response_header_serializes_correctly() {
let header = GetMetaDataResponseHeader {
group: Some(CheetahString::from_static_str("test_group")),
controller_leader_id: Some(CheetahString::from_static_str("1")),
controller_leader_address: Some(CheetahString::from_static_str("192.168.1.1:9876")),
is_leader: Some(true),
peers: Some(CheetahString::from_static_str("192.168.1.1:9876,192.168.1.2:9876")),
last_log_index: Some(103),
committed_log_index: Some(102),
applied_log_index: Some(101),
};
let map = header.to_map().unwrap();
assert_eq!(
map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::GROUP))
.unwrap(),
"test_group"
);
assert_eq!(
map.get(&CheetahString::from_static_str(
GetMetaDataResponseHeader::CONTROLLER_LEADER_ID
))
.unwrap(),
"1"
);
assert_eq!(
map.get(&CheetahString::from_static_str(
GetMetaDataResponseHeader::CONTROLLER_LEADER_ADDRESS
))
.unwrap(),
"192.168.1.1:9876"
);
assert_eq!(
map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::IS_LEADER))
.unwrap(),
"true"
);
assert_eq!(
map.get(&CheetahString::from_static_str(GetMetaDataResponseHeader::PEERS))
.unwrap(),
"192.168.1.1:9876,192.168.1.2:9876"
);
assert_eq!(
map.get(&CheetahString::from_static_str(
GetMetaDataResponseHeader::LAST_LOG_INDEX
))
.unwrap(),
"103"
);
assert_eq!(
map.get(&CheetahString::from_static_str(
GetMetaDataResponseHeader::COMMITTED_LOG_INDEX
))
.unwrap(),
"102"
);
assert_eq!(
map.get(&CheetahString::from_static_str(
GetMetaDataResponseHeader::APPLIED_LOG_INDEX
))
.unwrap(),
"101"
);
}
#[test]
fn get_meta_data_response_header_deserializes_correctly() {
let mut map = HashMap::new();
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::GROUP),
CheetahString::from("test_group"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::CONTROLLER_LEADER_ID),
CheetahString::from("1"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::CONTROLLER_LEADER_ADDRESS),
CheetahString::from("192.168.1.1:9876"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::IS_LEADER),
CheetahString::from("true"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::PEERS),
CheetahString::from("192.168.1.1:9876,192.168.1.2:9876"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::LAST_LOG_INDEX),
CheetahString::from("103"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::COMMITTED_LOG_INDEX),
CheetahString::from("102"),
);
map.insert(
CheetahString::from_static_str(GetMetaDataResponseHeader::APPLIED_LOG_INDEX),
CheetahString::from("101"),
);
let header = <GetMetaDataResponseHeader as FromMap>::from(&map).unwrap();
assert_eq!(header.group, Some(CheetahString::from_static_str("test_group")));
assert_eq!(header.controller_leader_id, Some(CheetahString::from_static_str("1")));
assert_eq!(
header.controller_leader_address,
Some(CheetahString::from_static_str("192.168.1.1:9876"))
);
assert_eq!(header.is_leader, Some(true));
assert_eq!(
header.peers,
Some(CheetahString::from_static_str("192.168.1.1:9876,192.168.1.2:9876"))
);
assert_eq!(header.last_log_index, Some(103));
assert_eq!(header.committed_log_index, Some(102));
assert_eq!(header.applied_log_index, Some(101));
}
#[test]
fn get_meta_data_response_header_handles_missing_optional_fields() {
let map = HashMap::new();
let header = <GetMetaDataResponseHeader as FromMap>::from(&map).unwrap();
assert!(header.group.is_none());
assert!(header.controller_leader_id.is_none());
assert!(header.controller_leader_address.is_none());
assert!(header.is_leader.is_none());
assert!(header.peers.is_none());
assert!(header.last_log_index.is_none());
assert!(header.committed_log_index.is_none());
assert!(header.applied_log_index.is_none());
}
}