Skip to main content

rocketmq_remoting/protocol/header/
change_invisible_time_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 std::fmt::Display;
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(Serialize, Deserialize, Debug, Default, RequestHeaderCodecV2)]
25#[serde(rename_all = "camelCase")]
26pub struct ChangeInvisibleTimeRequestHeader {
27    #[required]
28    pub consumer_group: CheetahString,
29
30    #[required]
31    pub topic: CheetahString,
32
33    #[required]
34    pub queue_id: i32,
35
36    //startOffset popTime invisibleTime queueId
37    #[required]
38    pub extra_info: CheetahString,
39
40    #[required]
41    pub offset: i64,
42
43    #[required]
44    pub invisible_time: i64,
45    #[serde(flatten)]
46    pub topic_request_header: Option<TopicRequestHeader>,
47}
48
49impl Display for ChangeInvisibleTimeRequestHeader {
50    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        write!(
52            f,
53            "ChangeInvisibleTimeRequestHeader {{ consumer_group: {}, topic: {}, queue_id: {}, extra_info: {}, offset: \
54             {}, invisible_time: {} }}",
55            self.consumer_group, self.topic, self.queue_id, self.extra_info, self.offset, self.invisible_time
56        )
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use cheetah_string::CheetahString;
63    use serde_json;
64
65    use super::*;
66
67    #[test]
68    fn change_invisible_time_request_header_display_format() {
69        let header = ChangeInvisibleTimeRequestHeader {
70            consumer_group: CheetahString::from("group1"),
71            topic: CheetahString::from("topic1"),
72            queue_id: 1,
73            extra_info: CheetahString::from("info"),
74            offset: 12345,
75            invisible_time: 67890,
76            topic_request_header: None,
77        };
78        assert_eq!(
79            format!("{}", header),
80            "ChangeInvisibleTimeRequestHeader { consumer_group: group1, topic: topic1, queue_id: 1, extra_info: info, \
81             offset: 12345, invisible_time: 67890 }"
82        );
83    }
84
85    #[test]
86    fn change_invisible_time_request_header_display_format_with_topic_request_header() {
87        let header = ChangeInvisibleTimeRequestHeader {
88            consumer_group: CheetahString::from("group1"),
89            topic: CheetahString::from("topic1"),
90            queue_id: 1,
91            extra_info: CheetahString::from("info"),
92            offset: 12345,
93            invisible_time: 67890,
94            topic_request_header: Some(TopicRequestHeader {
95                rpc_request_header: None,
96                lo: None,
97            }),
98        };
99        assert_eq!(
100            format!("{}", header),
101            "ChangeInvisibleTimeRequestHeader { consumer_group: group1, topic: topic1, queue_id: 1, extra_info: info, \
102             offset: 12345, invisible_time: 67890 }"
103        );
104    }
105
106    #[test]
107    fn change_invisible_time_request_header_serialize() {
108        let header = ChangeInvisibleTimeRequestHeader {
109            consumer_group: CheetahString::from("group1"),
110            topic: CheetahString::from("topic1"),
111            queue_id: 1,
112            extra_info: CheetahString::from("info"),
113            offset: 12345,
114            invisible_time: 67890,
115            topic_request_header: None,
116        };
117        let serialized = serde_json::to_string(&header).unwrap();
118        assert_eq!(
119            serialized,
120            r#"{"consumerGroup":"group1","topic":"topic1","queueId":1,"extraInfo":"info","offset":12345,"invisibleTime":67890}"#
121        );
122    }
123
124    #[test]
125    fn change_invisible_time_request_header_deserialize() {
126        let json = r#"{"consumerGroup":"group1","topic":"topic1","queueId":1,"extraInfo":"info","offset":12345,"invisibleTime":67890}"#;
127        let header: ChangeInvisibleTimeRequestHeader = serde_json::from_str(json).unwrap();
128        assert_eq!(header.consumer_group, CheetahString::from("group1"));
129        assert_eq!(header.topic, CheetahString::from("topic1"));
130        assert_eq!(header.queue_id, 1);
131        assert_eq!(header.extra_info, CheetahString::from("info"));
132        assert_eq!(header.offset, 12345);
133        assert_eq!(header.invisible_time, 67890);
134    }
135}