16
16
*/
17
17
package org .apache .logging .log4j .core .async ;
18
18
19
- import static org .hamcrest .CoreMatchers .sameInstance ;
20
- import static org .hamcrest .MatcherAssert .assertThat ;
21
- import static org .junit .jupiter .api .Assertions .assertArrayEquals ;
22
- import static org .junit .jupiter .api .Assertions .assertEquals ;
23
- import static org .junit .jupiter .api .Assertions .assertFalse ;
24
- import static org .junit .jupiter .api .Assertions .assertNotNull ;
25
- import static org .junit .jupiter .api .Assertions .assertNotSame ;
26
- import static org .junit .jupiter .api .Assertions .assertTrue ;
27
- import static org .junit .jupiter .api .Assertions .fail ;
19
+ import static org .assertj .core .api .Assertions .as ;
20
+ import static org .assertj .core .api .Assertions .assertThat ;
21
+ import static org .assertj .core .api .Assertions .assertThatCode ;
22
+ import static org .assertj .core .api .Assertions .fail ;
23
+ import static org .mockito .Mockito .mock ;
24
+ import static org .mockito .Mockito .verify ;
25
+ import static org .mockito .Mockito .verifyNoMoreInteractions ;
28
26
29
27
import java .util .Arrays ;
30
28
import org .apache .logging .log4j .Level ;
31
29
import org .apache .logging .log4j .Marker ;
32
30
import org .apache .logging .log4j .MarkerManager ;
33
31
import org .apache .logging .log4j .ThreadContext .ContextStack ;
34
32
import org .apache .logging .log4j .core .LogEvent ;
33
+ import org .apache .logging .log4j .core .time .Clock ;
34
+ import org .apache .logging .log4j .core .time .NanoClock ;
35
35
import org .apache .logging .log4j .core .time .internal .DummyNanoClock ;
36
36
import org .apache .logging .log4j .core .time .internal .FixedPreciseClock ;
37
37
import org .apache .logging .log4j .message .Message ;
38
38
import org .apache .logging .log4j .message .ReusableMessageFactory ;
39
39
import org .apache .logging .log4j .message .SimpleMessage ;
40
40
import org .apache .logging .log4j .spi .MutableThreadContextStack ;
41
+ import org .apache .logging .log4j .util .StringMap ;
42
+ import org .assertj .core .api .InstanceOfAssertFactories ;
41
43
import org .junit .jupiter .api .Tag ;
42
44
import org .junit .jupiter .api .Test ;
43
45
44
46
/**
45
47
* Tests the RingBufferLogEvent class.
46
48
*/
47
49
@ Tag ("async" )
48
- public class RingBufferLogEventTest {
50
+ class RingBufferLogEventTest {
49
51
50
52
@ Test
51
- public void testToImmutable () {
53
+ void testToImmutable () {
52
54
final LogEvent logEvent = new RingBufferLogEvent ();
53
- assertNotSame (logEvent , logEvent .toImmutable ());
55
+ assertThat (logEvent ). isNotSameAs ( logEvent .toImmutable ());
54
56
}
55
57
56
58
/**
57
- * @see <a href="https://issues.apache.org/jira/browse/LOG4J2-2816">LOG4J2-2816</a>
59
+ * Reproduces <a href="https://issues.apache.org/jira/browse/LOG4J2-2816">LOG4J2-2816</a>.
58
60
*/
59
61
@ Test
60
- public void testIsPopulated () {
62
+ void testIsPopulated () {
61
63
final RingBufferLogEvent evt = new RingBufferLogEvent ();
62
-
63
- assertFalse (evt .isPopulated ());
64
+ assertThat (evt .isPopulated ()).isFalse ();
64
65
65
66
final String loggerName = null ;
66
67
final Marker marker = null ;
@@ -88,15 +89,15 @@ public void testIsPopulated() {
88
89
new FixedPreciseClock (),
89
90
new DummyNanoClock (1 ));
90
91
91
- assertTrue (evt .isPopulated ());
92
+ assertThat (evt .isPopulated ()). isTrue ( );
92
93
93
94
evt .clear ();
94
95
95
- assertFalse (evt .isPopulated ());
96
+ assertThat (evt .isPopulated ()). isFalse ( );
96
97
}
97
98
98
99
@ Test
99
- public void testGetLevelReturnsOffIfNullLevelSet () {
100
+ void testGetLevelReturnsOffIfNullLevelSet () {
100
101
final RingBufferLogEvent evt = new RingBufferLogEvent ();
101
102
final String loggerName = null ;
102
103
final Marker marker = null ;
@@ -123,11 +124,11 @@ public void testGetLevelReturnsOffIfNullLevelSet() {
123
124
location ,
124
125
new FixedPreciseClock (),
125
126
new DummyNanoClock (1 ));
126
- assertEquals ( Level . OFF , evt .getLevel ());
127
+ assertThat ( evt .getLevel ()). isEqualTo ( Level . OFF );
127
128
}
128
129
129
130
@ Test
130
- public void testGetMessageReturnsNonNullMessage () {
131
+ void testGetMessageReturnsNonNullMessage () {
131
132
final RingBufferLogEvent evt = new RingBufferLogEvent ();
132
133
final String loggerName = null ;
133
134
final Marker marker = null ;
@@ -154,11 +155,11 @@ public void testGetMessageReturnsNonNullMessage() {
154
155
location ,
155
156
new FixedPreciseClock (),
156
157
new DummyNanoClock (1 ));
157
- assertNotNull (evt .getMessage ());
158
+ assertThat (evt .getMessage ()). isNotNull ( );
158
159
}
159
160
160
161
@ Test
161
- public void testGetMillisReturnsConstructorMillisForNormalMessage () {
162
+ void testGetMillisReturnsConstructorMillisForNormalMessage () {
162
163
final RingBufferLogEvent evt = new RingBufferLogEvent ();
163
164
final String loggerName = null ;
164
165
final Marker marker = null ;
@@ -185,12 +186,12 @@ public void testGetMillisReturnsConstructorMillisForNormalMessage() {
185
186
location ,
186
187
new FixedPreciseClock (123 , 456 ),
187
188
new DummyNanoClock (1 ));
188
- assertEquals ( 123 , evt .getTimeMillis ());
189
- assertEquals ( 456 , evt .getInstant ().getNanoOfMillisecond ());
189
+ assertThat ( evt .getTimeMillis ()). isEqualTo ( 123 );
190
+ assertThat ( evt .getInstant ().getNanoOfMillisecond ()). isEqualTo ( 456 );
190
191
}
191
192
192
193
@ Test
193
- public void testCreateMementoReturnsCopy () {
194
+ void testCreateMementoReturnsCopy () {
194
195
final RingBufferLogEvent evt = new RingBufferLogEvent ();
195
196
final String loggerName = "logger.name" ;
196
197
final Marker marker = MarkerManager .getMarker ("marked man" );
@@ -220,24 +221,24 @@ public void testCreateMementoReturnsCopy() {
220
221
evt .getContextData ().putValue ("key" , "value" );
221
222
222
223
final LogEvent actual = evt .toMemento ();
223
- assertEquals ( evt .getLoggerName (), actual .getLoggerName ());
224
- assertEquals ( evt .getMarker (), actual .getMarker ());
225
- assertEquals ( evt .getLoggerFqcn (), actual .getLoggerFqcn ());
226
- assertEquals ( evt .getLevel (), actual .getLevel ());
227
- assertEquals ( evt .getMessage (), actual .getMessage ());
228
- assertEquals ( evt .getThrown (), actual .getThrown ());
229
- assertEquals ( evt .getContextData (), actual .getContextData ());
230
- assertEquals ( evt .getContextStack (), actual .getContextStack ());
231
- assertEquals ( evt .getThreadName (), actual .getThreadName ());
232
- assertEquals ( evt .getTimeMillis (), actual .getTimeMillis ());
233
- assertEquals (
234
- evt . getInstant (). getNanoOfMillisecond (), actual .getInstant ().getNanoOfMillisecond ());
235
- assertEquals ( evt .getSource (), actual .getSource ());
236
- assertEquals ( evt .getThrownProxy (), actual .getThrownProxy ());
224
+ assertThat ( actual .getLoggerName ()). isEqualTo ( evt .getLoggerName ());
225
+ assertThat ( actual .getMarker ()). isEqualTo ( evt .getMarker ());
226
+ assertThat ( actual .getLoggerFqcn ()). isEqualTo ( evt .getLoggerFqcn ());
227
+ assertThat ( actual .getLevel ()). isEqualTo ( evt .getLevel ());
228
+ assertThat ( actual .getMessage ()). isEqualTo ( evt .getMessage ());
229
+ assertThat ( actual .getThrown ()). isEqualTo ( evt .getThrown ());
230
+ assertThat ( actual .getContextData ()). isEqualTo ( evt .getContextData ());
231
+ assertThat ( actual .getContextStack ()). isEqualTo ( evt .getContextStack ());
232
+ assertThat ( actual .getThreadName ()). isEqualTo ( evt .getThreadName ());
233
+ assertThat ( actual .getTimeMillis ()). isEqualTo ( evt .getTimeMillis ());
234
+ assertThat ( actual . getInstant (). getNanoOfMillisecond ())
235
+ . isEqualTo ( evt .getInstant ().getNanoOfMillisecond ());
236
+ assertThat ( actual .getSource ()). isEqualTo ( evt .getSource ());
237
+ assertThat ( actual .getThrownProxy ()). isEqualTo ( evt .getThrownProxy ());
237
238
}
238
239
239
240
@ Test
240
- public void testCreateMementoRetainsParametersAndFormat () {
241
+ void testCreateMementoRetainsParametersAndFormat () {
241
242
final RingBufferLogEvent evt = new RingBufferLogEvent ();
242
243
// Initialize the event with parameters
243
244
evt .swapParameters (new Object [10 ]);
@@ -271,16 +272,16 @@ public void testCreateMementoRetainsParametersAndFormat() {
271
272
evt .getContextData ().putValue ("key" , "value" );
272
273
273
274
final Message actual = evt .toMemento ().getMessage ();
274
- assertEquals ( "Hello {}!" , actual . getFormat () );
275
- assertArrayEquals ( new String [] {"World" }, actual . getParameters () );
276
- assertEquals ( "Hello World!" , actual . getFormattedMessage () );
275
+ assertThat ( actual . getFormat ()). isEqualTo ( "Hello {}!" );
276
+ assertThat ( actual . getParameters ()). isEqualTo ( new String [] {"World" });
277
+ assertThat ( actual . getFormattedMessage ()). isEqualTo ( "Hello World!" );
277
278
} finally {
278
- factory . recycle (message );
279
+ ReusableMessageFactory . release (message );
279
280
}
280
281
}
281
282
282
283
@ Test
283
- public void testMementoReuse () {
284
+ void testMementoReuse () {
284
285
final RingBufferLogEvent evt = new RingBufferLogEvent ();
285
286
// Initialize the event with parameters
286
287
evt .swapParameters (new Object [10 ]);
@@ -315,25 +316,99 @@ public void testMementoReuse() {
315
316
316
317
final Message memento1 = evt .memento ();
317
318
final Message memento2 = evt .memento ();
318
- assertThat (memento1 , sameInstance (memento2 ) );
319
+ assertThat (memento1 ). isSameAs (memento2 );
319
320
} finally {
320
321
factory .recycle (message );
321
322
}
322
323
}
323
324
324
325
@ Test
325
- public void testMessageTextNeverThrowsNpe () {
326
+ void testMessageTextNeverThrowsNpe () {
326
327
final RingBufferLogEvent evt = new RingBufferLogEvent ();
327
- try {
328
- evt .getFormattedMessage ();
329
- } catch (final NullPointerException e ) {
330
- fail ("the messageText field was not set" );
331
- }
328
+ assertThatCode (evt ::getFormattedMessage ).doesNotThrowAnyException ();
332
329
}
333
330
334
331
@ Test
335
- public void testForEachParameterNothingSet () {
332
+ void testForEachParameterNothingSet () {
336
333
final RingBufferLogEvent evt = new RingBufferLogEvent ();
337
- evt .forEachParameter ((parameter , parameterIndex , state ) -> fail ("Should not have been called" ), null );
334
+ assertThatCode (() -> evt .forEachParameter (
335
+ (parameter , parameterIndex , state ) -> fail ("Should not have been called" ), null ))
336
+ .doesNotThrowAnyException ();
337
+ }
338
+
339
+ /**
340
+ * Reproduces <a href="https://github.com/apache/logging-log4j2/issues/2234">#2234</a>.
341
+ */
342
+ @ Test
343
+ void testGettersAndClear () {
344
+
345
+ // Create mock fields
346
+ final long salt = (long ) (Math .random () * 1_000L );
347
+ final AsyncLogger asyncLogger = mock (AsyncLogger .class );
348
+ final String loggerName = "LoggerName-" + salt ;
349
+ final Marker marker = MarkerManager .getMarker ("marker-" + salt );
350
+ final String fqcn = "a.b.c_" + salt ;
351
+ final Level level = Level .TRACE ;
352
+ final Message message = mock (Message .class );
353
+ final Throwable throwable = mock (Throwable .class );
354
+ final StringMap contextData = mock (StringMap .class );
355
+ final ContextStack contextStack = mock (ContextStack .class );
356
+ final String threadName = "threadName-" + salt ;
357
+ final StackTraceElement location = new RuntimeException ().getStackTrace ()[0 ];
358
+
359
+ // Create the log event
360
+ final Clock clock = mock (Clock .class );
361
+ final NanoClock nanoClock = mock (NanoClock .class );
362
+ final RingBufferLogEvent event = new RingBufferLogEvent ();
363
+ event .setValues (
364
+ asyncLogger ,
365
+ loggerName ,
366
+ marker ,
367
+ fqcn ,
368
+ level ,
369
+ message ,
370
+ throwable ,
371
+ contextData ,
372
+ contextStack ,
373
+ -1 ,
374
+ threadName ,
375
+ -1 ,
376
+ location ,
377
+ clock ,
378
+ nanoClock );
379
+
380
+ // Verify getters
381
+ assertThat (event .getLoggerName ()).isSameAs (loggerName );
382
+ assertThat (event .getMarker ()).isSameAs (marker );
383
+ assertThat (event .getLoggerFqcn ()).isSameAs (fqcn );
384
+ assertThat (event .getLevel ()).isSameAs (level );
385
+ assertThat (event .getMessage ()).isSameAs (message );
386
+ assertThat (event .getThrowable ()).isSameAs (throwable );
387
+ assertThat (event .getContextData ()).isSameAs (contextData );
388
+ assertThat (event .getContextStack ()).isSameAs (contextStack );
389
+ assertThat (event .getThreadName ()).isSameAs (threadName );
390
+ assertThat (event .getSource ()).isSameAs (location );
391
+
392
+ // Verify clear
393
+ event .clear ();
394
+ assertThat (event .getLoggerName ()).isNull ();
395
+ assertThat (event .getMarker ()).isNull ();
396
+ assertThat (event .getLoggerFqcn ()).isNull ();
397
+ assertThat (event .getLevel ()).isEqualTo (Level .OFF );
398
+ verify (message ).getFormattedMessage ();
399
+ assertThat (event .getMessage ())
400
+ .isNotSameAs (message )
401
+ .extracting (Message ::getFormattedMessage , as (InstanceOfAssertFactories .STRING ))
402
+ .isEmpty ();
403
+ assertThat (event .getThrowable ()).isNull ();
404
+ verify (contextData ).isFrozen ();
405
+ verify (contextData ).clear ();
406
+ assertThat (event .getContextData ()).isSameAs (contextData );
407
+ assertThat (event .getContextStack ()).isNull ();
408
+ assertThat (event .getThreadName ()).isNull ();
409
+ assertThat (event .getSource ()).isNull ();
410
+
411
+ // Verify interaction exhaustion
412
+ verifyNoMoreInteractions (asyncLogger , message , throwable , contextData , contextStack );
338
413
}
339
414
}
0 commit comments