Skip to main content

rocketmq_remoting/protocol/header/
notify_unsubscribe_lite_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::RequestHeaderCodecV2;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::rpc::rpc_request_header::RpcRequestHeader;
21
22#[derive(Clone, Debug, Serialize, Deserialize, RequestHeaderCodecV2)]
23#[serde(rename_all = "camelCase")]
24pub struct NotifyUnsubscribeLiteRequestHeader {
25    #[required]
26    pub lite_topic: CheetahString,
27
28    #[required]
29    pub consumer_group: CheetahString,
30
31    #[required]
32    pub client_id: CheetahString,
33
34    #[serde(flatten)]
35    pub rpc_request_header: Option<RpcRequestHeader>,
36}
37
38#[cfg(test)]
39mod tests {
40    use std::collections::HashMap;
41
42    use super::*;
43    use crate::protocol::command_custom_header::CommandCustomHeader;
44    use crate::protocol::command_custom_header::FromMap;
45
46    #[test]
47    fn notify_unsubscribe_lite_request_header_round_trips_ext_fields() {
48        let header = NotifyUnsubscribeLiteRequestHeader {
49            lite_topic: CheetahString::from_static_str("lite-topic"),
50            consumer_group: CheetahString::from_static_str("consumer-group"),
51            client_id: CheetahString::from_static_str("client-id"),
52            rpc_request_header: None,
53        };
54
55        let map = header.to_map().expect("header should encode to ext fields");
56        assert_eq!(
57            map.get(&CheetahString::from_static_str("liteTopic")),
58            Some(&CheetahString::from_static_str("lite-topic"))
59        );
60        assert_eq!(
61            map.get(&CheetahString::from_static_str("consumerGroup")),
62            Some(&CheetahString::from_static_str("consumer-group"))
63        );
64        assert_eq!(
65            map.get(&CheetahString::from_static_str("clientId")),
66            Some(&CheetahString::from_static_str("client-id"))
67        );
68
69        let decoded =
70            <NotifyUnsubscribeLiteRequestHeader as FromMap>::from(&map).expect("header should decode from ext fields");
71        assert_eq!(decoded.lite_topic, "lite-topic");
72        assert_eq!(decoded.consumer_group, "consumer-group");
73        assert_eq!(decoded.client_id, "client-id");
74    }
75
76    #[test]
77    fn notify_unsubscribe_lite_request_header_requires_java_fields() {
78        let mut map = HashMap::new();
79        map.insert(
80            CheetahString::from_static_str("liteTopic"),
81            CheetahString::from_static_str("lite-topic"),
82        );
83        map.insert(
84            CheetahString::from_static_str("consumerGroup"),
85            CheetahString::from_static_str("consumer-group"),
86        );
87
88        assert!(
89            <NotifyUnsubscribeLiteRequestHeader as FromMap>::from(&map).is_err(),
90            "clientId is required by the Java header contract"
91        );
92    }
93}