rocketmq_remoting/protocol/header/
reset_offset_request_header.rs

1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17use 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}