rocketmq_remoting/protocol/body/
consume_queue_data.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 std::fmt::Display;
18
19use cheetah_string::CheetahString;
20use serde::Deserialize;
21use serde::Serialize;
22
23#[derive(Debug, Clone, Serialize, Deserialize, Default)]
24#[serde(rename_all = "camelCase")]
25pub struct ConsumeQueueData {
26    pub physic_offset: i64,
27    pub physic_size: i32,
28    pub tags_code: i64,
29    pub extend_data_json: Option<CheetahString>,
30    pub bit_map: Option<CheetahString>,
31    pub eval: bool,
32    pub msg: Option<CheetahString>,
33}
34
35impl Display for ConsumeQueueData {
36    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37        write!(
38            f,
39            "ConsumeQueueData [physic_offset={}, physic_size={}, tags_code={}, \
40             extend_data_json={:?}, bit_map={:?}, eval={}, msg={:?}]",
41            self.physic_offset,
42            self.physic_size,
43            self.tags_code,
44            self.extend_data_json,
45            self.bit_map,
46            self.eval,
47            self.msg
48        )
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use cheetah_string::CheetahString;
55
56    use super::*;
57
58    #[test]
59    fn consume_queue_data_display_format() {
60        let data = ConsumeQueueData {
61            physic_offset: 123,
62            physic_size: 456,
63            tags_code: 789,
64            extend_data_json: Some(CheetahString::from("extend_data")),
65            bit_map: Some(CheetahString::from("bit_map")),
66            eval: true,
67            msg: Some(CheetahString::from("message")),
68        };
69        let display = format!("{}", data);
70        assert_eq!(
71            display,
72            "ConsumeQueueData [physic_offset=123, physic_size=456, tags_code=789, \
73             extend_data_json=Some(\"extend_data\"), bit_map=Some(\"bit_map\"), eval=true, \
74             msg=Some(\"message\")]"
75        );
76    }
77
78    #[test]
79    fn consume_queue_data_default_values() {
80        let data: ConsumeQueueData = Default::default();
81        assert_eq!(data.physic_offset, 0);
82        assert_eq!(data.physic_size, 0);
83        assert_eq!(data.tags_code, 0);
84        assert!(data.extend_data_json.is_none());
85        assert!(data.bit_map.is_none());
86        assert!(!data.eval);
87        assert!(data.msg.is_none());
88    }
89
90    #[test]
91    fn consume_queue_data_serialization() {
92        let data = ConsumeQueueData {
93            physic_offset: 123,
94            physic_size: 456,
95            tags_code: 789,
96            extend_data_json: Some(CheetahString::from("extend_data")),
97            bit_map: Some(CheetahString::from("bit_map")),
98            eval: true,
99            msg: Some(CheetahString::from("message")),
100        };
101        let serialized = serde_json::to_string(&data).unwrap();
102        assert_eq!(
103            serialized,
104            r#"{"physicOffset":123,"physicSize":456,"tagsCode":789,"extendDataJson":"extend_data","bitMap":"bit_map","eval":true,"msg":"message"}"#
105        );
106    }
107
108    #[test]
109    fn consume_queue_data_deserialization() {
110        let json = r#"{"physicOffset":123,"physicSize":456,"tagsCode":789,"extendDataJson":"extend_data","bitMap":"bit_map","eval":true,"msg":"message"}"#;
111        let deserialized: ConsumeQueueData = serde_json::from_str(json).unwrap();
112        assert_eq!(deserialized.physic_offset, 123);
113        assert_eq!(deserialized.physic_size, 456);
114        assert_eq!(deserialized.tags_code, 789);
115        assert_eq!(
116            deserialized.extend_data_json.unwrap(),
117            CheetahString::from("extend_data")
118        );
119        assert_eq!(
120            deserialized.bit_map.unwrap(),
121            CheetahString::from("bit_map")
122        );
123        assert!(deserialized.eval);
124        assert_eq!(deserialized.msg.unwrap(), CheetahString::from("message"));
125    }
126
127    #[test]
128    fn consume_queue_data_deserialization_missing_fields() {
129        let json = r#"{"physicOffset":123,"physicSize":456,"tagsCode":789,"eval":false}"#;
130        let deserialized: ConsumeQueueData = serde_json::from_str(json).unwrap();
131        assert_eq!(deserialized.physic_offset, 123);
132        assert_eq!(deserialized.physic_size, 456);
133        assert_eq!(deserialized.tags_code, 789);
134        assert!(deserialized.extend_data_json.is_none());
135        assert!(deserialized.bit_map.is_none());
136        assert!(!deserialized.eval);
137        assert!(deserialized.msg.is_none());
138    }
139}