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