1616
1717package org .springframework .boot .logging .logback ;
1818
19+ import java .util .List ;
1920import java .util .function .Supplier ;
2021
2122import ch .qos .logback .classic .LoggerContext ;
3132
3233import org .springframework .boot .testsupport .system .CapturedOutput ;
3334import org .springframework .boot .testsupport .system .OutputCaptureExtension ;
35+ import org .springframework .test .util .ReflectionTestUtils ;
3436
3537import static org .assertj .core .api .Assertions .assertThat ;
3638import static org .mockito .ArgumentMatchers .any ;
@@ -49,6 +51,15 @@ class SystemStatusListenerTests {
4951
5052 private static final String TEST_MESSAGE = "testtesttest" ;
5153
54+ private final StatusManager statusManager = mock (StatusManager .class );
55+
56+ private final LoggerContext loggerContext = mock (LoggerContext .class );
57+
58+ SystemStatusListenerTests () {
59+ given (this .loggerContext .getStatusManager ()).willReturn (this .statusManager );
60+ given (this .statusManager .add (any (StatusListener .class ))).willReturn (true );
61+ }
62+
5263 @ Test
5364 void addStatusWithInfoLevelWhenNoDebugDoesNotPrint (CapturedOutput output ) {
5465 addStatus (false , () -> new InfoStatus (TEST_MESSAGE , null ));
@@ -91,15 +102,43 @@ void addStatusWithErrorLevelWhenDebugPrintsToSystemOut(CapturedOutput output) {
91102 assertThat (output .getErr ()).doesNotContain (TEST_MESSAGE );
92103 }
93104
105+ @ Test
106+ void shouldRetrospectivePrintStatusOnStartAndDebugIsDisabled (CapturedOutput output ) {
107+ given (this .statusManager .getCopyOfStatusList ()).willReturn (List .of (new ErrorStatus (TEST_MESSAGE , null ),
108+ new WarnStatus (TEST_MESSAGE , null ), new InfoStatus (TEST_MESSAGE , null )));
109+ addStatus (false , () -> new InfoStatus (TEST_MESSAGE , null ));
110+ assertThat (output .getErr ()).contains ("WARN " + TEST_MESSAGE );
111+ assertThat (output .getErr ()).contains ("ERROR " + TEST_MESSAGE );
112+ assertThat (output .getErr ()).doesNotContain ("INFO" );
113+ assertThat (output .getOut ()).isEmpty ();
114+ }
115+
116+ @ Test
117+ void shouldRetrospectivePrintStatusOnStartAndDebugIsEnabled (CapturedOutput output ) {
118+ given (this .statusManager .getCopyOfStatusList ()).willReturn (List .of (new ErrorStatus (TEST_MESSAGE , null ),
119+ new WarnStatus (TEST_MESSAGE , null ), new InfoStatus (TEST_MESSAGE , null )));
120+ addStatus (true , () -> new InfoStatus (TEST_MESSAGE , null ));
121+ assertThat (output .getErr ()).isEmpty ();
122+ assertThat (output .getOut ()).contains ("WARN " + TEST_MESSAGE );
123+ assertThat (output .getOut ()).contains ("ERROR " + TEST_MESSAGE );
124+ assertThat (output .getOut ()).contains ("INFO " + TEST_MESSAGE );
125+ }
126+
127+ @ Test
128+ void shouldNotRetrospectivePrintWhenStatusIsOutdated (CapturedOutput output ) {
129+ ErrorStatus outdatedStatus = new ErrorStatus (TEST_MESSAGE , null );
130+ ReflectionTestUtils .setField (outdatedStatus , "timestamp" , System .currentTimeMillis () - 300 );
131+ given (this .statusManager .getCopyOfStatusList ()).willReturn (List .of (outdatedStatus ));
132+ addStatus (false , () -> new InfoStatus (TEST_MESSAGE , null ));
133+ assertThat (output .getOut ()).isEmpty ();
134+ assertThat (output .getErr ()).isEmpty ();
135+ }
136+
94137 private void addStatus (boolean debug , Supplier <Status > statusFactory ) {
95- StatusManager statusManager = mock (StatusManager .class );
96- given (statusManager .add (any (StatusListener .class ))).willReturn (true );
97- LoggerContext loggerContext = mock (LoggerContext .class );
98- given (loggerContext .getStatusManager ()).willReturn (statusManager );
99- SystemStatusListener .addTo (loggerContext , debug );
138+ SystemStatusListener .addTo (this .loggerContext , debug );
100139 ArgumentCaptor <StatusListener > listener = ArgumentCaptor .forClass (StatusListener .class );
101- then (statusManager ).should ().add (listener .capture ());
102- assertThat (listener .getValue ()).extracting ("context" ).isSameAs (loggerContext );
140+ then (this . statusManager ).should ().add (listener .capture ());
141+ assertThat (listener .getValue ()).extracting ("context" ).isSameAs (this . loggerContext );
103142 listener .getValue ().addStatusEvent (statusFactory .get ());
104143 }
105144
0 commit comments