Skip to main content

rocketmq_protocol/protocol/header/
unregister_client_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::RequestHeaderCodec;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::rpc::rpc_request_header::RpcRequestHeader;
21
22#[derive(Debug, Serialize, Deserialize, Default, RequestHeaderCodec)]
23#[header(
24    type_id = "rocketmq_protocol::protocol::header::unregister_client_request_header::UnregisterClientRequestHeader",
25    java_class = "org.apache.rocketmq.remoting.protocol.header.UnregisterClientRequestHeader"
26)]
27pub struct UnregisterClientRequestHeader {
28    #[serde(rename = "clientID", alias = "clientId")]
29    #[header(key = "clientID", alias = "clientId", alias_conflict = "prefer_canonical", required)]
30    pub client_id: CheetahString,
31    pub producer_group: Option<CheetahString>,
32    pub consumer_group: Option<CheetahString>,
33    #[serde(flatten)]
34    #[header(flatten, presence = "always")]
35    pub rpc_request_header: Option<RpcRequestHeader>,
36}
37
38#[cfg(test)]
39mod tests {
40
41    use std::collections::HashMap;
42
43    use cheetah_string::CheetahString;
44
45    use super::*;
46    use crate::protocol::command_custom_header::CommandCustomHeader;
47    use crate::protocol::command_custom_header::FromMap;
48
49    #[test]
50    fn un_register_client_request_header_serializes_correctly() {
51        let header: UnregisterClientRequestHeader = UnregisterClientRequestHeader {
52            client_id: CheetahString::from_static_str("test_client_id"),
53            producer_group: Some(CheetahString::from_static_str("test_producer_group")),
54            consumer_group: Some(CheetahString::from_static_str("test_consumer_group")),
55            rpc_request_header: None,
56        };
57        let map = header.to_map().unwrap();
58        assert_eq!(
59            map.get(&CheetahString::from_static_str("consumerGroup")).unwrap(),
60            "test_consumer_group"
61        );
62        assert_eq!(
63            map.get(&CheetahString::from_static_str("clientID")).unwrap(),
64            "test_client_id"
65        );
66        assert_eq!(
67            map.get(&CheetahString::from_static_str("producerGroup")).unwrap(),
68            "test_producer_group"
69        );
70        assert_eq!(map.get(&CheetahString::from_static_str("rpcRequestHeader")), None);
71    }
72
73    #[test]
74    fn un_register_client_request_header_deserializes_correctly() {
75        let mut map = HashMap::new();
76        map.insert(
77            CheetahString::from_static_str("consumerGroup"),
78            CheetahString::from_static_str("test_consumer_group"),
79        );
80        map.insert(
81            CheetahString::from_static_str("clientID"),
82            CheetahString::from_static_str("test_client_id"),
83        );
84        map.insert(
85            CheetahString::from_static_str("producerGroup"),
86            CheetahString::from_static_str("test_producer_group"),
87        );
88        let header: UnregisterClientRequestHeader = <UnregisterClientRequestHeader as FromMap>::from(&map).unwrap();
89        assert_eq!(header.consumer_group.as_deref(), Some("test_consumer_group"));
90        assert_eq!(header.client_id, "test_client_id");
91        assert_eq!(header.producer_group.as_deref(), Some("test_producer_group"));
92    }
93
94    #[test]
95    fn un_register_client_request_header_missing_optional_fields() {
96        let mut map = HashMap::new();
97        map.insert(
98            CheetahString::from_static_str("clientID"),
99            CheetahString::from_static_str("test_client_id"),
100        );
101
102        let header: UnregisterClientRequestHeader = <UnregisterClientRequestHeader as FromMap>::from(&map).unwrap();
103        assert_eq!(header.client_id, "test_client_id");
104        assert!(header.rpc_request_header.is_some());
105    }
106
107    #[test]
108    fn un_register_client_request_header_accepts_legacy_client_id_key() {
109        let mut map = HashMap::new();
110        map.insert(
111            CheetahString::from_static_str("clientId"),
112            CheetahString::from_static_str("test_client_id"),
113        );
114
115        let header: UnregisterClientRequestHeader = <UnregisterClientRequestHeader as FromMap>::from(&map).unwrap();
116
117        assert_eq!(header.client_id, "test_client_id");
118    }
119
120    #[test]
121    fn un_register_client_request_header_deserialize_from_json() {
122        let data = r#"{"clientID":"test_client_id","consumerGroup":"test_consumer_group"}"#;
123        let header: UnregisterClientRequestHeader = serde_json::from_str(data).unwrap();
124        assert_eq!(header.client_id, CheetahString::from_static_str("test_client_id"));
125        assert_eq!(header.consumer_group.as_deref(), None);
126        assert!(header.rpc_request_header.is_some());
127    }
128}