Skip to main content

rocketmq_remoting/protocol/header/
polling_info_response_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 rocketmq_macros::RequestHeaderCodecV2;
16
17#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq, Default, RequestHeaderCodecV2)]
18#[serde(rename_all = "camelCase")]
19pub struct PollingInfoResponseHeader {
20    #[required]
21    pub polling_num: i32,
22}
23
24#[cfg(test)]
25mod tests {
26    use serde_json;
27
28    use super::*;
29
30    #[test]
31    fn test_polling_info_response_header_default() {
32        let header = PollingInfoResponseHeader::default();
33        assert_eq!(header.polling_num, 0);
34    }
35
36    #[test]
37    fn test_polling_info_response_header_new_with_positive_value() {
38        let header = PollingInfoResponseHeader { polling_num: 100 };
39        assert_eq!(header.polling_num, 100);
40    }
41
42    #[test]
43    fn test_polling_info_response_header_new_with_negative_value() {
44        let header = PollingInfoResponseHeader { polling_num: -1 };
45        assert_eq!(header.polling_num, -1);
46    }
47
48    #[test]
49    fn test_polling_info_response_header_new_with_zero() {
50        let header = PollingInfoResponseHeader { polling_num: 0 };
51        assert_eq!(header.polling_num, 0);
52    }
53
54    #[test]
55    fn test_polling_info_response_header_new_with_max_value() {
56        let header = PollingInfoResponseHeader { polling_num: i32::MAX };
57        assert_eq!(header.polling_num, i32::MAX);
58    }
59
60    #[test]
61    fn test_polling_info_response_header_new_with_min_value() {
62        let header = PollingInfoResponseHeader { polling_num: i32::MIN };
63        assert_eq!(header.polling_num, i32::MIN);
64    }
65
66    #[test]
67    fn test_polling_info_response_header_clone() {
68        let header1 = PollingInfoResponseHeader { polling_num: 42 };
69        let header2 = header1.clone();
70        assert_eq!(header1, header2);
71        assert_eq!(header2.polling_num, 42);
72    }
73
74    #[test]
75    fn test_polling_info_response_header_equality() {
76        let header1 = PollingInfoResponseHeader { polling_num: 100 };
77        let header2 = PollingInfoResponseHeader { polling_num: 100 };
78        let header3 = PollingInfoResponseHeader { polling_num: 200 };
79
80        assert_eq!(header1, header2);
81        assert_ne!(header1, header3);
82    }
83
84    #[test]
85    fn test_polling_info_response_header_debug() {
86        let header = PollingInfoResponseHeader { polling_num: 123 };
87        let debug_str = format!("{:?}", header);
88        assert!(debug_str.contains("PollingInfoResponseHeader"));
89        assert!(debug_str.contains("123"));
90    }
91
92    #[test]
93    fn test_polling_info_response_header_serialize_to_json() {
94        let header = PollingInfoResponseHeader { polling_num: 99 };
95        let json = serde_json::to_string(&header).unwrap();
96        assert_eq!(json, r#"{"pollingNum":99}"#);
97    }
98
99    #[test]
100    fn test_polling_info_response_header_serialize_with_zero() {
101        let header = PollingInfoResponseHeader { polling_num: 0 };
102        let json = serde_json::to_string(&header).unwrap();
103        assert_eq!(json, r#"{"pollingNum":0}"#);
104    }
105
106    #[test]
107    fn test_polling_info_response_header_serialize_with_negative() {
108        let header = PollingInfoResponseHeader { polling_num: -50 };
109        let json = serde_json::to_string(&header).unwrap();
110        assert_eq!(json, r#"{"pollingNum":-50}"#);
111    }
112
113    #[test]
114    fn test_polling_info_response_header_deserialize_from_json() {
115        let json = r#"{"pollingNum":88}"#;
116        let header: PollingInfoResponseHeader = serde_json::from_str(json).unwrap();
117        assert_eq!(header.polling_num, 88);
118    }
119
120    #[test]
121    fn test_polling_info_response_header_deserialize_with_zero() {
122        let json = r#"{"pollingNum":0}"#;
123        let header: PollingInfoResponseHeader = serde_json::from_str(json).unwrap();
124        assert_eq!(header.polling_num, 0);
125    }
126
127    #[test]
128    fn test_polling_info_response_header_deserialize_with_negative() {
129        let json = r#"{"pollingNum":-100}"#;
130        let header: PollingInfoResponseHeader = serde_json::from_str(json).unwrap();
131        assert_eq!(header.polling_num, -100);
132    }
133
134    #[test]
135    fn test_polling_info_response_header_serialize_deserialize_roundtrip() {
136        let original = PollingInfoResponseHeader { polling_num: 777 };
137        let json = serde_json::to_string(&original).unwrap();
138        let deserialized: PollingInfoResponseHeader = serde_json::from_str(&json).unwrap();
139        assert_eq!(original, deserialized);
140    }
141
142    #[test]
143    fn test_polling_info_response_header_serialize_deserialize_max_value() {
144        let original = PollingInfoResponseHeader { polling_num: i32::MAX };
145        let json = serde_json::to_string(&original).unwrap();
146        let deserialized: PollingInfoResponseHeader = serde_json::from_str(&json).unwrap();
147        assert_eq!(original, deserialized);
148    }
149
150    #[test]
151    fn test_polling_info_response_header_serialize_deserialize_min_value() {
152        let original = PollingInfoResponseHeader { polling_num: i32::MIN };
153        let json = serde_json::to_string(&original).unwrap();
154        let deserialized: PollingInfoResponseHeader = serde_json::from_str(&json).unwrap();
155        assert_eq!(original, deserialized);
156    }
157
158    #[test]
159    fn test_polling_info_response_header_camel_case_field_name() {
160        let header = PollingInfoResponseHeader { polling_num: 50 };
161        let json = serde_json::to_string(&header).unwrap();
162        // 验证字段名是 camelCase 格式(pollingNum 而不是 polling_num)
163        assert!(json.contains("pollingNum"));
164        assert!(!json.contains("polling_num"));
165    }
166
167    #[test]
168    fn test_polling_info_response_header_deserialize_invalid_json() {
169        let invalid_json = r#"{"invalidField":123}"#;
170        let result: Result<PollingInfoResponseHeader, _> = serde_json::from_str(invalid_json);
171        // 应该失败,因为缺少必需的 pollingNum 字段
172        assert!(result.is_err());
173    }
174
175    #[test]
176    fn test_polling_info_response_header_deserialize_wrong_type() {
177        let invalid_json = r#"{"pollingNum":"not_a_number"}"#;
178        let result: Result<PollingInfoResponseHeader, _> = serde_json::from_str(invalid_json);
179        // 应该失败,因为类型不匹配
180        assert!(result.is_err());
181    }
182
183    #[test]
184    fn test_polling_info_response_header_multiple_instances() {
185        let headers = [
186            PollingInfoResponseHeader { polling_num: 1 },
187            PollingInfoResponseHeader { polling_num: 2 },
188            PollingInfoResponseHeader { polling_num: 3 },
189        ];
190
191        assert_eq!(headers.len(), 3);
192        assert_eq!(headers[0].polling_num, 1);
193        assert_eq!(headers[1].polling_num, 2);
194        assert_eq!(headers[2].polling_num, 3);
195    }
196
197    #[test]
198    fn test_polling_info_response_header_mutation() {
199        let mut header = PollingInfoResponseHeader { polling_num: 10 };
200        assert_eq!(header.polling_num, 10);
201
202        header.polling_num = 20;
203        assert_eq!(header.polling_num, 20);
204
205        header.polling_num += 5;
206        assert_eq!(header.polling_num, 25);
207    }
208
209    #[test]
210    fn test_polling_info_response_header_pretty_print_json() {
211        let header = PollingInfoResponseHeader { polling_num: 456 };
212        let json = serde_json::to_string_pretty(&header).unwrap();
213        assert!(json.contains("pollingNum"));
214        assert!(json.contains("456"));
215    }
216
217    #[test]
218    fn test_polling_info_response_header_from_value() {
219        let json_value = serde_json::json!({
220            "pollingNum": 888
221        });
222        let header: PollingInfoResponseHeader = serde_json::from_value(json_value).unwrap();
223        assert_eq!(header.polling_num, 888);
224    }
225
226    #[test]
227    fn test_polling_info_response_header_to_value() {
228        let header = PollingInfoResponseHeader { polling_num: 999 };
229        let json_value = serde_json::to_value(&header).unwrap();
230        assert_eq!(json_value["pollingNum"], 999);
231    }
232
233    #[test]
234    fn test_polling_info_response_header_typical_use_cases() {
235        // 测试典型的轮询场景
236        let no_polling = PollingInfoResponseHeader { polling_num: 0 };
237        let low_polling = PollingInfoResponseHeader { polling_num: 5 };
238        let medium_polling = PollingInfoResponseHeader { polling_num: 50 };
239        let high_polling = PollingInfoResponseHeader { polling_num: 500 };
240
241        assert_eq!(no_polling.polling_num, 0);
242        assert_eq!(low_polling.polling_num, 5);
243        assert_eq!(medium_polling.polling_num, 50);
244        assert_eq!(high_polling.polling_num, 500);
245    }
246}