rocketmq_remoting/protocol/heartbeat/
consumer_data.rs1use std::collections::HashSet;
18use std::hash::Hash;
19
20use cheetah_string::CheetahString;
21use rocketmq_common::common::consumer::consume_from_where::ConsumeFromWhere;
22use serde::Deserialize;
23use serde::Serialize;
24
25use crate::protocol::heartbeat::consume_type::ConsumeType;
26use crate::protocol::heartbeat::message_model::MessageModel;
27use crate::protocol::heartbeat::subscription_data::SubscriptionData;
28
29#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, Default)]
30#[serde(rename_all = "camelCase")]
31pub struct ConsumerData {
32 pub group_name: CheetahString,
33 pub consume_type: ConsumeType,
34 pub message_model: MessageModel,
35 pub consume_from_where: ConsumeFromWhere,
36 pub subscription_data_set: HashSet<SubscriptionData>,
37 pub unit_mode: bool,
38}
39
40impl Hash for ConsumerData {
41 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
42 self.group_name.hash(state);
43 self.consume_type.hash(state);
44 self.message_model.hash(state);
45 self.consume_from_where.hash(state);
46 self.subscription_data_set
47 .iter()
48 .for_each(|code| code.hash(state));
49 self.unit_mode.hash(state);
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use std::collections::HashSet;
56
57 use cheetah_string::CheetahString;
58 use rocketmq_common::common::consumer::consume_from_where::ConsumeFromWhere;
59
60 use super::*;
61 use crate::protocol::heartbeat::consume_type::ConsumeType;
62 use crate::protocol::heartbeat::message_model::MessageModel;
63 use crate::protocol::heartbeat::subscription_data::SubscriptionData;
64
65 #[test]
66 fn consumer_data_default_values() {
67 let consumer_data = ConsumerData::default();
68 assert_eq!(consumer_data.group_name, CheetahString::new());
69 assert_eq!(consumer_data.consume_type, ConsumeType::default());
70 assert_eq!(consumer_data.message_model, MessageModel::default());
71 assert_eq!(
72 consumer_data.consume_from_where,
73 ConsumeFromWhere::default()
74 );
75 assert!(consumer_data.subscription_data_set.is_empty());
76 assert!(!consumer_data.unit_mode);
77 }
78
79 #[test]
80 fn consumer_data_equality() {
81 let mut subscription_data_set = HashSet::new();
82 subscription_data_set.insert(SubscriptionData::default());
83
84 let consumer_data1 = ConsumerData {
85 group_name: CheetahString::from("group1"),
86 consume_type: ConsumeType::default(),
87 message_model: MessageModel::default(),
88 consume_from_where: ConsumeFromWhere::default(),
89 subscription_data_set: subscription_data_set.clone(),
90 unit_mode: false,
91 };
92
93 let consumer_data2 = ConsumerData {
94 group_name: CheetahString::from("group1"),
95 consume_type: ConsumeType::default(),
96 message_model: MessageModel::default(),
97 consume_from_where: ConsumeFromWhere::default(),
98 subscription_data_set,
99 unit_mode: false,
100 };
101
102 assert_eq!(consumer_data1, consumer_data2);
103 }
104
105 #[test]
106 fn consumer_data_inequality() {
107 let consumer_data1 = ConsumerData {
108 group_name: CheetahString::from("group1"),
109 consume_type: ConsumeType::default(),
110 message_model: MessageModel::default(),
111 consume_from_where: ConsumeFromWhere::default(),
112 subscription_data_set: HashSet::new(),
113 unit_mode: false,
114 };
115
116 let consumer_data2 = ConsumerData {
117 group_name: CheetahString::from("group2"),
118 consume_type: ConsumeType::default(),
119 message_model: MessageModel::default(),
120 consume_from_where: ConsumeFromWhere::default(),
121 subscription_data_set: HashSet::new(),
122 unit_mode: false,
123 };
124
125 assert_ne!(consumer_data1, consumer_data2);
126 }
127
128 #[test]
129 fn consumer_data_hash() {
130 use std::collections::hash_map::DefaultHasher;
131 use std::hash::Hash;
132 use std::hash::Hasher;
133
134 let consumer_data = ConsumerData {
135 group_name: CheetahString::from("group1"),
136 consume_type: ConsumeType::default(),
137 message_model: MessageModel::default(),
138 consume_from_where: ConsumeFromWhere::default(),
139 subscription_data_set: HashSet::new(),
140 unit_mode: false,
141 };
142
143 let mut hasher = DefaultHasher::new();
144 consumer_data.hash(&mut hasher);
145 let hash1 = hasher.finish();
146
147 let mut hasher = DefaultHasher::new();
148 consumer_data.hash(&mut hasher);
149 let hash2 = hasher.finish();
150
151 assert_eq!(hash1, hash2);
152 }
153}