@@ -153,7 +153,10 @@ impl<W: Write> OutputClient<W> {
153153 . flatten ( )
154154 . or ( primary. footer ) ;
155155
156- if matches ! ( behavior, OutputClientBehavior :: Grouped ) {
156+ // Only output group logs header and footers if there are logs to be printed
157+ if matches ! ( behavior, OutputClientBehavior :: Grouped )
158+ && buffers. as_ref ( ) . is_some_and ( |b| !b. is_empty ( ) )
159+ {
157160 let buffers = buffers
158161 . as_ref ( )
159162 . expect ( "grouped logging requires buffer to be present" ) ;
@@ -464,6 +467,29 @@ mod test {
464467 }
465468 }
466469
470+ #[ test]
471+ fn test_grouped_logs_no_output_no_marginals ( ) -> io:: Result < ( ) > {
472+ let sink = OutputSink :: new ( Vec :: new ( ) , Vec :: new ( ) ) ;
473+ let mut logger = sink. logger ( OutputClientBehavior :: Grouped ) ;
474+ logger. with_header_footer (
475+ Some ( Arc :: new ( |_| "header\n " . into ( ) ) ) ,
476+ Some ( Arc :: new ( |_| "footer\n " . into ( ) ) ) ,
477+ ) ;
478+
479+ // Don't write any logs
480+ let logs = logger. finish ( false ) ?;
481+
482+ // Should have empty buffer since no logs were written
483+ assert ! ( logs. is_none( ) || logs. unwrap( ) . is_empty( ) ) ;
484+
485+ let SinkWriters { out, err } = Arc :: into_inner ( sink. writers ) . unwrap ( ) . into_inner ( ) . unwrap ( ) ;
486+ // Headers and footers should not be written when there are no logs
487+ assert_eq ! ( out, b"" ) ;
488+ assert_eq ! ( err, b"" ) ;
489+
490+ Ok ( ( ) )
491+ }
492+
467493 #[ test]
468494 fn assert_output_writer_sync ( ) {
469495 // This is the bound required for a value to be held across an await
0 commit comments