Skip to main content

rocketmq_remoting/protocol/header/
reset_offset_request_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 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}