rocketmq_remoting/protocol/header/
reset_offset_request_header.rs1use cheetah_string::CheetahString;
18use rocketmq_macros::RequestHeaderCodecV2;
19use serde::Deserialize;
20use serde::Serialize;
21
22use crate::rpc::topic_request_header::TopicRequestHeader;
23
24#[derive(Clone, Debug, Serialize, Deserialize, RequestHeaderCodecV2)]
25#[serde(rename_all = "camelCase")]
26pub struct ResetOffsetRequestHeader {
27 #[required]
28 pub topic: CheetahString,
29 #[required]
30 pub group: CheetahString,
31 pub queue_id: i32,
32 pub offset: Option<i64>,
33 #[required]
34 pub timestamp: i64,
35 #[required]
36 pub is_force: bool,
37
38 #[serde(flatten)]
39 pub topic_request_header: Option<TopicRequestHeader>,
40}
41
42impl Default for ResetOffsetRequestHeader {
43 fn default() -> Self {
44 ResetOffsetRequestHeader {
45 topic: CheetahString::empty(),
46 group: CheetahString::empty(),
47 queue_id: -1,
48 offset: None,
49 timestamp: 0,
50 is_force: false,
51 topic_request_header: None,
52 }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use cheetah_string::CheetahString;
59
60 use super::*;
61
62 #[test]
63 fn reset_offset_request_header_serializes_correctly() {
64 let header = ResetOffsetRequestHeader {
65 topic: CheetahString::from_static_str("test_topic"),
66 group: CheetahString::from_static_str("test_group"),
67 queue_id: 1,
68 offset: Some(100),
69 timestamp: 1234567890,
70 is_force: true,
71 topic_request_header: None,
72 };
73 let serialized = serde_json::to_string(&header).unwrap();
74 let expected = r#"{"topic":"test_topic","group":"test_group","queueId":1,"offset":100,"timestamp":1234567890,"isForce":true}"#;
75 assert_eq!(serialized, expected);
76 }
77
78 #[test]
79 fn reset_offset_request_header_deserializes_correctly() {
80 let data = r#"{"topic":"test_topic","group":"test_group","queueId":1,"offset":100,"timestamp":1234567890,"isForce":true}"#;
81 let header: ResetOffsetRequestHeader = serde_json::from_str(data).unwrap();
82 assert_eq!(header.topic, CheetahString::from_static_str("test_topic"));
83 assert_eq!(header.group, CheetahString::from_static_str("test_group"));
84 assert_eq!(header.queue_id, 1);
85 assert_eq!(header.offset.unwrap(), 100);
86 assert_eq!(header.timestamp, 1234567890);
87 assert!(header.is_force);
88 }
89
90 #[test]
91 fn reset_offset_request_header_handles_missing_optional_fields() {
92 let data = r#"{"topic":"test_topic","group":"test_group","queueId":1,"timestamp":1234567890,"isForce":true}"#;
93 let header: ResetOffsetRequestHeader = serde_json::from_str(data).unwrap();
94 assert_eq!(header.topic, CheetahString::from_static_str("test_topic"));
95 assert_eq!(header.group, CheetahString::from_static_str("test_group"));
96 assert_eq!(header.queue_id, 1);
97 assert!(header.offset.is_none());
98 assert_eq!(header.timestamp, 1234567890);
99 assert!(header.is_force);
100 }
101
102 #[test]
103 fn reset_offset_request_header_handles_invalid_data() {
104 let data = r#"{"topic":12345,"group":"test_group","queueId":1,"timestamp":1234567890,"isForce":true}"#;
105 let result: Result<ResetOffsetRequestHeader, _> = serde_json::from_str(data);
106 assert!(result.is_err());
107 }
108
109 #[test]
110 fn reset_offset_request_header_default_values() {
111 let header = ResetOffsetRequestHeader::default();
112 assert_eq!(header.topic, CheetahString::empty());
113 assert_eq!(header.group, CheetahString::empty());
114 assert_eq!(header.queue_id, -1);
115 assert!(header.offset.is_none());
116 assert_eq!(header.timestamp, 0);
117 assert!(!header.is_force);
118 }
119}