@@ -24,10 +24,14 @@ use async_trait::async_trait;
2424use iggy:: prelude:: Client ;
2525use iggy:: prelude:: Identifier ;
2626use iggy:: prelude:: IggyExpiry ;
27+ use iggy:: prelude:: IggyMessage ;
2728use iggy:: prelude:: MaxTopicSize ;
29+ use iggy:: prelude:: Partitioning ;
2830use iggy_cli:: commands:: binary_system:: stats:: GetStatsOutput ;
31+ use iggy_common:: Stats ;
2932use predicates:: str:: { contains, starts_with} ;
3033use serial_test:: parallel;
34+ use std:: str:: FromStr ;
3135
3236#[ derive( Debug , Clone , Copy , Eq , PartialEq ) ]
3337enum TestStatsCmdOutput {
@@ -97,7 +101,10 @@ impl IggyCmdTestCase for TestStatsCmd {
97101 . stdout ( contains ( "Segments Count | 5" ) )
98102 . stdout ( contains ( "Message Count | 0" ) )
99103 // Note: Client count can vary due to connection lifecycle; at least 2 expected
100- . stdout ( contains ( "Consumer Groups Count | 0" ) ) ;
104+ . stdout ( contains ( "Consumer Groups Count | 0" ) )
105+ . stdout ( contains ( "Threads Count" ) )
106+ . stdout ( contains ( "Free Disk Space" ) )
107+ . stdout ( contains ( "Total Disk Space" ) ) ;
101108 }
102109 TestStatsCmdOutput :: Set ( GetStatsOutput :: List ) => {
103110 command_state
@@ -107,7 +114,10 @@ impl IggyCmdTestCase for TestStatsCmd {
107114 . stdout ( contains ( "Partitions Count|5" ) )
108115 . stdout ( contains ( "Segments Count|5" ) )
109116 . stdout ( contains ( "Message Count|0" ) )
110- . stdout ( contains ( "Consumer Groups Count|0" ) ) ;
117+ . stdout ( contains ( "Consumer Groups Count|0" ) )
118+ . stdout ( contains ( "Threads Count|" ) )
119+ . stdout ( contains ( "Free Disk Space|" ) )
120+ . stdout ( contains ( "Total Disk Space|" ) ) ;
111121 }
112122 TestStatsCmdOutput :: Set ( GetStatsOutput :: Json ) => {
113123 command_state
@@ -117,7 +127,10 @@ impl IggyCmdTestCase for TestStatsCmd {
117127 . stdout ( contains ( r#""partitions_count": 5"# ) )
118128 . stdout ( contains ( r#""segments_count": 5"# ) )
119129 . stdout ( contains ( r#""messages_count": 0"# ) )
120- . stdout ( contains ( r#""consumer_groups_count": 0"# ) ) ;
130+ . stdout ( contains ( r#""consumer_groups_count": 0"# ) )
131+ . stdout ( contains ( r#""threads_count":"# ) )
132+ . stdout ( contains ( r#""free_disk_space":"# ) )
133+ . stdout ( contains ( r#""total_disk_space":"# ) ) ;
121134 }
122135 TestStatsCmdOutput :: Set ( GetStatsOutput :: Toml ) => {
123136 command_state
@@ -127,7 +140,10 @@ impl IggyCmdTestCase for TestStatsCmd {
127140 . stdout ( contains ( "partitions_count = 5" ) )
128141 . stdout ( contains ( "segments_count = 5" ) )
129142 . stdout ( contains ( "messages_count = 0" ) )
130- . stdout ( contains ( "consumer_groups_count = 0" ) ) ;
143+ . stdout ( contains ( "consumer_groups_count = 0" ) )
144+ . stdout ( contains ( "threads_count =" ) )
145+ . stdout ( contains ( "free_disk_space =" ) )
146+ . stdout ( contains ( "total_disk_space =" ) ) ;
131147 }
132148 }
133149 }
@@ -143,6 +159,109 @@ impl IggyCmdTestCase for TestStatsCmd {
143159 }
144160}
145161
162+ struct TestStatsCmdWithMessages {
163+ stream_id : u32 ,
164+ topic_id : u32 ,
165+ }
166+
167+ impl TestStatsCmdWithMessages {
168+ fn new ( ) -> Self {
169+ Self {
170+ stream_id : 0 ,
171+ topic_id : 0 ,
172+ }
173+ }
174+ }
175+
176+ #[ async_trait]
177+ impl IggyCmdTestCase for TestStatsCmdWithMessages {
178+ async fn prepare_server_state ( & mut self , client : & dyn Client ) {
179+ let stream = client. create_stream ( "size-test" ) . await ;
180+ assert ! ( stream. is_ok( ) ) ;
181+ let stream_details = stream. unwrap ( ) ;
182+ self . stream_id = stream_details. id ;
183+
184+ let topic = client
185+ . create_topic (
186+ & self . stream_id . try_into ( ) . unwrap ( ) ,
187+ "topic" ,
188+ 1 ,
189+ Default :: default ( ) ,
190+ None ,
191+ IggyExpiry :: NeverExpire ,
192+ MaxTopicSize :: ServerDefault ,
193+ )
194+ . await ;
195+ assert ! ( topic. is_ok( ) ) ;
196+ let topic_details = topic. unwrap ( ) ;
197+ self . topic_id = topic_details. id ;
198+
199+ let mut messages = ( 1 ..=10 )
200+ . filter_map ( |id| IggyMessage :: from_str ( format ! ( "Test message {id}" ) . as_str ( ) ) . ok ( ) )
201+ . collect :: < Vec < _ > > ( ) ;
202+ let send_status = client
203+ . send_messages (
204+ & self . stream_id . try_into ( ) . unwrap ( ) ,
205+ & self . topic_id . try_into ( ) . unwrap ( ) ,
206+ & Partitioning :: default ( ) ,
207+ & mut messages,
208+ )
209+ . await ;
210+ assert ! ( send_status. is_ok( ) ) ;
211+ }
212+
213+ fn get_command ( & self ) -> IggyCmdCommand {
214+ IggyCmdCommand :: new ( )
215+ . arg ( "stats" )
216+ . arg ( "-o" )
217+ . arg ( "json" )
218+ . opt ( "-q" )
219+ . with_env_credentials ( )
220+ }
221+
222+ fn verify_command ( & self , command_state : Assert ) {
223+ let assert = command_state. success ( ) ;
224+ let stdout = String :: from_utf8_lossy ( & assert. get_output ( ) . stdout ) ;
225+ let stats: Stats =
226+ serde_json:: from_str ( & stdout) . expect ( "Failed to parse stats JSON output" ) ;
227+
228+ assert ! (
229+ stats. messages_count > 0 ,
230+ "messages_count should be > 0 after sending messages"
231+ ) ;
232+ assert ! (
233+ stats. messages_size_bytes. as_bytes_u64( ) > 0 ,
234+ "messages_size_bytes should be > 0 after sending messages"
235+ ) ;
236+ assert ! (
237+ stats. free_disk_space. as_bytes_u64( ) > 0 ,
238+ "free_disk_space should be > 0"
239+ ) ;
240+ assert ! (
241+ stats. total_disk_space. as_bytes_u64( ) > 0 ,
242+ "total_disk_space should be > 0"
243+ ) ;
244+ assert ! (
245+ stats. free_disk_space. as_bytes_u64( ) <= stats. total_disk_space. as_bytes_u64( ) ,
246+ "free_disk_space should be <= total_disk_space"
247+ ) ;
248+ }
249+
250+ async fn verify_server_state ( & self , client : & dyn Client ) {
251+ client
252+ . delete_topic (
253+ & self . stream_id . try_into ( ) . unwrap ( ) ,
254+ & self . topic_id . try_into ( ) . unwrap ( ) ,
255+ )
256+ . await
257+ . unwrap ( ) ;
258+ client
259+ . delete_stream ( & self . stream_id . try_into ( ) . unwrap ( ) )
260+ . await
261+ . unwrap ( ) ;
262+ }
263+ }
264+
146265#[ tokio:: test]
147266#[ parallel]
148267pub async fn should_be_successful ( ) {
@@ -172,6 +291,9 @@ pub async fn should_be_successful() {
172291 GetStatsOutput :: Toml ,
173292 ) ) )
174293 . await ;
294+ iggy_cmd_test
295+ . execute_test ( TestStatsCmdWithMessages :: new ( ) )
296+ . await ;
175297}
176298
177299#[ tokio:: test]
0 commit comments