reifydb_sub_flow/transaction/
metrics.rs

1/// Metrics for tracking FlowTransaction operations
2#[derive(Debug, Clone, Default)]
3pub struct FlowTransactionMetrics {
4	pub reads: usize,
5	pub writes: usize,
6	pub removes: usize,
7	pub state_operations: usize,
8}
9
10impl FlowTransactionMetrics {
11	pub fn new() -> Self {
12		Self::default()
13	}
14
15	pub fn increment_reads(&mut self) {
16		self.reads += 1;
17	}
18
19	pub fn increment_writes(&mut self) {
20		self.writes += 1;
21	}
22
23	pub fn increment_removes(&mut self) {
24		self.removes += 1;
25	}
26
27	pub fn increment_state_operations(&mut self) {
28		self.state_operations += 1;
29	}
30}
31
32#[cfg(test)]
33mod tests {
34	use super::*;
35
36	#[tokio::test]
37	async fn test_new_metrics() {
38		let metrics = FlowTransactionMetrics::new();
39		assert_eq!(metrics.reads, 0);
40		assert_eq!(metrics.writes, 0);
41		assert_eq!(metrics.removes, 0);
42		assert_eq!(metrics.state_operations, 0);
43	}
44
45	#[tokio::test]
46	async fn test_default_metrics() {
47		let metrics = FlowTransactionMetrics::default();
48		assert_eq!(metrics.reads, 0);
49		assert_eq!(metrics.writes, 0);
50		assert_eq!(metrics.removes, 0);
51		assert_eq!(metrics.state_operations, 0);
52	}
53
54	#[tokio::test]
55	async fn test_increment_reads() {
56		let mut metrics = FlowTransactionMetrics::new();
57		assert_eq!(metrics.reads, 0);
58
59		metrics.increment_reads();
60		assert_eq!(metrics.reads, 1);
61
62		metrics.increment_reads();
63		assert_eq!(metrics.reads, 2);
64
65		// Other metrics should not change
66		assert_eq!(metrics.writes, 0);
67		assert_eq!(metrics.removes, 0);
68		assert_eq!(metrics.state_operations, 0);
69	}
70
71	#[tokio::test]
72	async fn test_increment_writes() {
73		let mut metrics = FlowTransactionMetrics::new();
74		assert_eq!(metrics.writes, 0);
75
76		metrics.increment_writes();
77		assert_eq!(metrics.writes, 1);
78
79		metrics.increment_writes();
80		assert_eq!(metrics.writes, 2);
81
82		// Other metrics should not change
83		assert_eq!(metrics.reads, 0);
84		assert_eq!(metrics.removes, 0);
85		assert_eq!(metrics.state_operations, 0);
86	}
87
88	#[tokio::test]
89	async fn test_increment_removes() {
90		let mut metrics = FlowTransactionMetrics::new();
91		assert_eq!(metrics.removes, 0);
92
93		metrics.increment_removes();
94		assert_eq!(metrics.removes, 1);
95
96		metrics.increment_removes();
97		assert_eq!(metrics.removes, 2);
98
99		// Other metrics should not change
100		assert_eq!(metrics.reads, 0);
101		assert_eq!(metrics.writes, 0);
102		assert_eq!(metrics.state_operations, 0);
103	}
104
105	#[tokio::test]
106	async fn test_increment_state_operations() {
107		let mut metrics = FlowTransactionMetrics::new();
108		assert_eq!(metrics.state_operations, 0);
109
110		metrics.increment_state_operations();
111		assert_eq!(metrics.state_operations, 1);
112
113		metrics.increment_state_operations();
114		assert_eq!(metrics.state_operations, 2);
115
116		// Other metrics should not change
117		assert_eq!(metrics.reads, 0);
118		assert_eq!(metrics.writes, 0);
119		assert_eq!(metrics.removes, 0);
120	}
121
122	#[tokio::test]
123	async fn test_mixed_metrics() {
124		let mut metrics = FlowTransactionMetrics::new();
125
126		metrics.increment_reads();
127		metrics.increment_reads();
128		metrics.increment_writes();
129		metrics.increment_removes();
130		metrics.increment_state_operations();
131		metrics.increment_state_operations();
132		metrics.increment_state_operations();
133
134		assert_eq!(metrics.reads, 2);
135		assert_eq!(metrics.writes, 1);
136		assert_eq!(metrics.removes, 1);
137		assert_eq!(metrics.state_operations, 3);
138	}
139
140	#[tokio::test]
141	async fn test_metrics_clone() {
142		let mut original = FlowTransactionMetrics::new();
143		original.increment_reads();
144		original.increment_writes();
145
146		let cloned = original.clone();
147		assert_eq!(cloned.reads, 1);
148		assert_eq!(cloned.writes, 1);
149		assert_eq!(cloned.removes, 0);
150		assert_eq!(cloned.state_operations, 0);
151	}
152}