16
16
*/
17
17
package org .apache .logging .log4j .core .async ;
18
18
19
- import static org .hamcrest .CoreMatchers .sameInstance ;
20
- import static org .junit .Assert .assertArrayEquals ;
21
- import static org .junit .Assert .assertEquals ;
22
- import static org .junit .Assert .assertFalse ;
23
- import static org .junit .Assert .assertNotNull ;
24
- import static org .junit .Assert .assertNull ;
25
- import static org .junit .Assert .assertThat ;
26
- import static org .junit .Assert .assertTrue ;
27
- import static org .junit .Assert .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 .io .ByteArrayInputStream ;
30
28
import java .io .ByteArrayOutputStream ;
38
36
import org .apache .logging .log4j .ThreadContext .ContextStack ;
39
37
import org .apache .logging .log4j .core .LogEvent ;
40
38
import org .apache .logging .log4j .core .impl .ThrowableProxy ;
41
- import org .apache .logging .log4j .core .test .categories .AsyncLoggers ;
42
39
import org .apache .logging .log4j .core .time .internal .FixedPreciseClock ;
40
+ import org .apache .logging .log4j .core .util .Clock ;
43
41
import org .apache .logging .log4j .core .util .DummyNanoClock ;
42
+ import org .apache .logging .log4j .core .util .NanoClock ;
44
43
import org .apache .logging .log4j .message .Message ;
45
44
import org .apache .logging .log4j .message .ReusableMessageFactory ;
46
45
import org .apache .logging .log4j .message .SimpleMessage ;
47
46
import org .apache .logging .log4j .spi .MutableThreadContextStack ;
48
47
import org .apache .logging .log4j .util .FilteredObjectInputStream ;
49
48
import org .apache .logging .log4j .util .StringMap ;
50
- import org .junit . Assert ;
51
- import org .junit .Test ;
52
- import org .junit .experimental . categories . Category ;
49
+ import org .assertj . core . api . InstanceOfAssertFactories ;
50
+ import org .junit .jupiter . api . Tag ;
51
+ import org .junit .jupiter . api . Test ;
53
52
54
53
/**
55
54
* Tests the RingBufferLogEvent class.
56
55
*/
57
- @ Category ( AsyncLoggers . class )
58
- public class RingBufferLogEventTest {
56
+ @ Tag ( "async" )
57
+ class RingBufferLogEventTest {
59
58
60
59
@ Test
61
- public void testToImmutable () {
60
+ void testToImmutable () {
62
61
final LogEvent logEvent = new RingBufferLogEvent ();
63
- Assert . assertNotSame (logEvent , logEvent .toImmutable ());
62
+ assertThat (logEvent ). isNotSameAs ( logEvent .toImmutable ());
64
63
}
65
64
66
65
/**
67
- * @see <a href="https://issues.apache.org/jira/browse/LOG4J2-2816">LOG4J2-2816</a>
66
+ * Reproduces <a href="https://issues.apache.org/jira/browse/LOG4J2-2816">LOG4J2-2816</a>.
68
67
*/
69
68
@ Test
70
- public void testIsPopulated () {
69
+ void testIsPopulated () {
71
70
final RingBufferLogEvent evt = new RingBufferLogEvent ();
72
-
73
- assertFalse (evt .isPopulated ());
71
+ assertThat (evt .isPopulated ()).isFalse ();
74
72
75
73
final String loggerName = null ;
76
74
final Marker marker = null ;
@@ -98,15 +96,15 @@ public void testIsPopulated() {
98
96
new FixedPreciseClock (),
99
97
new DummyNanoClock (1 ));
100
98
101
- assertTrue (evt .isPopulated ());
99
+ assertThat (evt .isPopulated ()). isTrue ( );
102
100
103
101
evt .clear ();
104
102
105
- assertFalse (evt .isPopulated ());
103
+ assertThat (evt .isPopulated ()). isFalse ( );
106
104
}
107
105
108
106
@ Test
109
- public void testGetLevelReturnsOffIfNullLevelSet () {
107
+ void testGetLevelReturnsOffIfNullLevelSet () {
110
108
final RingBufferLogEvent evt = new RingBufferLogEvent ();
111
109
final String loggerName = null ;
112
110
final Marker marker = null ;
@@ -133,11 +131,11 @@ public void testGetLevelReturnsOffIfNullLevelSet() {
133
131
location ,
134
132
new FixedPreciseClock (),
135
133
new DummyNanoClock (1 ));
136
- assertEquals ( Level . OFF , evt .getLevel ());
134
+ assertThat ( evt .getLevel ()). isEqualTo ( Level . OFF );
137
135
}
138
136
139
137
@ Test
140
- public void testGetMessageReturnsNonNullMessage () {
138
+ void testGetMessageReturnsNonNullMessage () {
141
139
final RingBufferLogEvent evt = new RingBufferLogEvent ();
142
140
final String loggerName = null ;
143
141
final Marker marker = null ;
@@ -164,11 +162,11 @@ public void testGetMessageReturnsNonNullMessage() {
164
162
location ,
165
163
new FixedPreciseClock (),
166
164
new DummyNanoClock (1 ));
167
- assertNotNull (evt .getMessage ());
165
+ assertThat (evt .getMessage ()). isNotNull ( );
168
166
}
169
167
170
168
@ Test
171
- public void testGetMillisReturnsConstructorMillisForNormalMessage () {
169
+ void testGetMillisReturnsConstructorMillisForNormalMessage () {
172
170
final RingBufferLogEvent evt = new RingBufferLogEvent ();
173
171
final String loggerName = null ;
174
172
final Marker marker = null ;
@@ -195,12 +193,12 @@ public void testGetMillisReturnsConstructorMillisForNormalMessage() {
195
193
location ,
196
194
new FixedPreciseClock (123 , 456 ),
197
195
new DummyNanoClock (1 ));
198
- assertEquals ( 123 , evt .getTimeMillis ());
199
- assertEquals ( 456 , evt .getInstant ().getNanoOfMillisecond ());
196
+ assertThat ( evt .getTimeMillis ()). isEqualTo ( 123 );
197
+ assertThat ( evt .getInstant ().getNanoOfMillisecond ()). isEqualTo ( 456 );
200
198
}
201
199
202
200
@ Test
203
- public void testSerializationDeserialization () throws IOException , ClassNotFoundException {
201
+ void testSerializationDeserialization () throws IOException , ClassNotFoundException {
204
202
final RingBufferLogEvent evt = new RingBufferLogEvent ();
205
203
final String loggerName = "logger.name" ;
206
204
final Marker marker = null ;
@@ -235,24 +233,24 @@ public void testSerializationDeserialization() throws IOException, ClassNotFound
235
233
236
234
final ObjectInputStream in = new FilteredObjectInputStream (new ByteArrayInputStream (baos .toByteArray ()));
237
235
final RingBufferLogEvent other = (RingBufferLogEvent ) in .readObject ();
238
- assertEquals ( loggerName , other .getLoggerName ());
239
- assertEquals ( marker , other .getMarker ());
240
- assertEquals ( fqcn , other .getLoggerFqcn ());
241
- assertEquals ( level , other .getLevel ());
242
- assertEquals ( data , other .getMessage ());
243
- assertNull ( "null after serialization" , other .getThrown ());
244
- assertEquals ( new ThrowableProxy (t ), other . getThrownProxy ( ));
245
- assertEquals ( evt .getContextData (), other .getContextData ());
246
- assertEquals ( contextStack , other .getContextStack ());
247
- assertEquals ( threadName , other .getThreadName ());
248
- assertEquals ( location , other .getSource ());
249
- assertEquals ( 12345 , other .getTimeMillis ());
250
- assertEquals ( 678 , other .getInstant ().getNanoOfMillisecond ());
236
+ assertThat ( other .getLoggerName ()). isEqualTo ( loggerName );
237
+ assertThat ( other .getMarker ()). isEqualTo ( marker );
238
+ assertThat ( other .getLoggerFqcn ()). isEqualTo ( fqcn );
239
+ assertThat ( other .getLevel ()). isEqualTo ( level );
240
+ assertThat ( other .getMessage ()). isEqualTo ( data );
241
+ assertThat ( other .getThrown ()). isNull ( );
242
+ assertThat ( other . getThrownProxy ()). isEqualTo ( new ThrowableProxy (t ));
243
+ assertThat ( other .getContextData ()). isEqualTo ( evt .getContextData ());
244
+ assertThat ( other .getContextStack ()). isEqualTo ( contextStack );
245
+ assertThat ( other .getThreadName ()). isEqualTo ( threadName );
246
+ assertThat ( other .getSource ()). isEqualTo ( location );
247
+ assertThat ( other .getTimeMillis ()). isEqualTo ( 12345 );
248
+ assertThat ( other .getInstant ().getNanoOfMillisecond ()). isEqualTo ( 678 );
251
249
}
252
250
253
251
@ SuppressWarnings ("deprecation" )
254
252
@ Test
255
- public void testCreateMementoReturnsCopy () {
253
+ void testCreateMementoReturnsCopy () {
256
254
final RingBufferLogEvent evt = new RingBufferLogEvent ();
257
255
final String loggerName = "logger.name" ;
258
256
final Marker marker = MarkerManager .getMarker ("marked man" );
@@ -282,25 +280,25 @@ public void testCreateMementoReturnsCopy() {
282
280
((StringMap ) evt .getContextData ()).putValue ("key" , "value" );
283
281
284
282
final LogEvent actual = evt .createMemento ();
285
- assertEquals ( evt .getLoggerName (), actual .getLoggerName ());
286
- assertEquals ( evt .getMarker (), actual .getMarker ());
287
- assertEquals ( evt .getLoggerFqcn (), actual .getLoggerFqcn ());
288
- assertEquals ( evt .getLevel (), actual .getLevel ());
289
- assertEquals ( evt .getMessage (), actual .getMessage ());
290
- assertEquals ( evt .getThrown (), actual .getThrown ());
291
- assertEquals ( evt .getContextMap (), actual .getContextMap ());
292
- assertEquals ( evt .getContextData (), actual .getContextData ());
293
- assertEquals ( evt .getContextStack (), actual .getContextStack ());
294
- assertEquals ( evt .getThreadName (), actual .getThreadName ());
295
- assertEquals ( evt .getTimeMillis (), actual .getTimeMillis ());
296
- assertEquals (
297
- evt . getInstant (). getNanoOfMillisecond (), actual .getInstant ().getNanoOfMillisecond ());
298
- assertEquals ( evt .getSource (), actual .getSource ());
299
- assertEquals ( evt .getThrownProxy (), actual .getThrownProxy ());
283
+ assertThat ( actual .getLoggerName ()). isEqualTo ( evt .getLoggerName ());
284
+ assertThat ( actual .getMarker ()). isEqualTo ( evt .getMarker ());
285
+ assertThat ( actual .getLoggerFqcn ()). isEqualTo ( evt .getLoggerFqcn ());
286
+ assertThat ( actual .getLevel ()). isEqualTo ( evt .getLevel ());
287
+ assertThat ( actual .getMessage ()). isEqualTo ( evt .getMessage ());
288
+ assertThat ( actual .getThrown ()). isEqualTo ( evt .getThrown ());
289
+ assertThat ( actual .getContextMap ()). isEqualTo ( evt .getContextMap ());
290
+ assertThat ( actual .getContextData ()). isEqualTo ( evt .getContextData ());
291
+ assertThat ( actual .getContextStack ()). isEqualTo ( evt .getContextStack ());
292
+ assertThat ( actual .getThreadName ()). isEqualTo ( evt .getThreadName ());
293
+ assertThat ( actual .getTimeMillis ()). isEqualTo ( evt .getTimeMillis ());
294
+ assertThat ( actual . getInstant (). getNanoOfMillisecond ())
295
+ . isEqualTo ( evt .getInstant ().getNanoOfMillisecond ());
296
+ assertThat ( actual .getSource ()). isEqualTo ( evt .getSource ());
297
+ assertThat ( actual .getThrownProxy ()). isEqualTo ( evt .getThrownProxy ());
300
298
}
301
299
302
300
@ Test
303
- public void testCreateMementoRetainsParametersAndFormat () {
301
+ void testCreateMementoRetainsParametersAndFormat () {
304
302
final RingBufferLogEvent evt = new RingBufferLogEvent ();
305
303
// Initialize the event with parameters
306
304
evt .swapParameters (new Object [10 ]);
@@ -334,16 +332,16 @@ public void testCreateMementoRetainsParametersAndFormat() {
334
332
((StringMap ) evt .getContextData ()).putValue ("key" , "value" );
335
333
336
334
final Message actual = evt .createMemento ().getMessage ();
337
- assertEquals ( "Hello {}!" , actual . getFormat () );
338
- assertArrayEquals ( new String [] {"World" }, actual . getParameters () );
339
- assertEquals ( "Hello World!" , actual . getFormattedMessage () );
335
+ assertThat ( actual . getFormat ()). isEqualTo ( "Hello {}!" );
336
+ assertThat ( actual . getParameters ()). isEqualTo ( new String [] {"World" });
337
+ assertThat ( actual . getFormattedMessage ()). isEqualTo ( "Hello World!" );
340
338
} finally {
341
339
ReusableMessageFactory .release (message );
342
340
}
343
341
}
344
342
345
343
@ Test
346
- public void testMementoReuse () {
344
+ void testMementoReuse () {
347
345
final RingBufferLogEvent evt = new RingBufferLogEvent ();
348
346
// Initialize the event with parameters
349
347
evt .swapParameters (new Object [10 ]);
@@ -378,25 +376,99 @@ public void testMementoReuse() {
378
376
379
377
final Message memento1 = evt .memento ();
380
378
final Message memento2 = evt .memento ();
381
- assertThat (memento1 , sameInstance (memento2 ) );
379
+ assertThat (memento1 ). isSameAs (memento2 );
382
380
} finally {
383
381
ReusableMessageFactory .release (message );
384
382
}
385
383
}
386
384
387
385
@ Test
388
- public void testMessageTextNeverThrowsNpe () {
386
+ void testMessageTextNeverThrowsNpe () {
389
387
final RingBufferLogEvent evt = new RingBufferLogEvent ();
390
- try {
391
- evt .getFormattedMessage ();
392
- } catch (final NullPointerException e ) {
393
- fail ("the messageText field was not set" );
394
- }
388
+ assertThatCode (evt ::getFormattedMessage ).doesNotThrowAnyException ();
395
389
}
396
390
397
391
@ Test
398
- public void testForEachParameterNothingSet () {
392
+ void testForEachParameterNothingSet () {
399
393
final RingBufferLogEvent evt = new RingBufferLogEvent ();
400
- evt .forEachParameter ((parameter , parameterIndex , state ) -> fail ("Should not have been called" ), null );
394
+ assertThatCode (() -> evt .forEachParameter (
395
+ (parameter , parameterIndex , state ) -> fail ("Should not have been called" ), null ))
396
+ .doesNotThrowAnyException ();
397
+ }
398
+
399
+ /**
400
+ * Reproduces <a href="https://github.com/apache/logging-log4j2/issues/2234">#2234</a>.
401
+ */
402
+ @ Test
403
+ void testGettersAndClear () {
404
+
405
+ // Create mock fields
406
+ final long salt = (long ) (Math .random () * 1_000L );
407
+ final AsyncLogger asyncLogger = mock (AsyncLogger .class );
408
+ final String loggerName = "LoggerName-" + salt ;
409
+ final Marker marker = MarkerManager .getMarker ("marker-" + salt );
410
+ final String fqcn = "a.b.c_" + salt ;
411
+ final Level level = Level .TRACE ;
412
+ final Message message = mock (Message .class );
413
+ final Throwable throwable = mock (Throwable .class );
414
+ final StringMap contextData = mock (StringMap .class );
415
+ final ContextStack contextStack = mock (ContextStack .class );
416
+ final String threadName = "threadName-" + salt ;
417
+ final StackTraceElement location = new RuntimeException ().getStackTrace ()[0 ];
418
+
419
+ // Create the log event
420
+ final Clock clock = mock (Clock .class );
421
+ final NanoClock nanoClock = mock (NanoClock .class );
422
+ final RingBufferLogEvent event = new RingBufferLogEvent ();
423
+ event .setValues (
424
+ asyncLogger ,
425
+ loggerName ,
426
+ marker ,
427
+ fqcn ,
428
+ level ,
429
+ message ,
430
+ throwable ,
431
+ contextData ,
432
+ contextStack ,
433
+ -1 ,
434
+ threadName ,
435
+ -1 ,
436
+ location ,
437
+ clock ,
438
+ nanoClock );
439
+
440
+ // Verify getters
441
+ assertThat (event .getLoggerName ()).isSameAs (loggerName );
442
+ assertThat (event .getMarker ()).isSameAs (marker );
443
+ assertThat (event .getLoggerFqcn ()).isSameAs (fqcn );
444
+ assertThat (event .getLevel ()).isSameAs (level );
445
+ assertThat (event .getMessage ()).isSameAs (message );
446
+ assertThat (event .getThrowable ()).isSameAs (throwable );
447
+ assertThat (event .getContextData ()).isSameAs (contextData );
448
+ assertThat (event .getContextStack ()).isSameAs (contextStack );
449
+ assertThat (event .getThreadName ()).isSameAs (threadName );
450
+ assertThat (event .getSource ()).isSameAs (location );
451
+
452
+ // Verify clear
453
+ event .clear ();
454
+ assertThat (event .getLoggerName ()).isNull ();
455
+ assertThat (event .getMarker ()).isNull ();
456
+ assertThat (event .getLoggerFqcn ()).isNull ();
457
+ assertThat (event .getLevel ()).isEqualTo (Level .OFF );
458
+ verify (message ).getFormattedMessage ();
459
+ assertThat (event .getMessage ())
460
+ .isNotSameAs (message )
461
+ .extracting (Message ::getFormattedMessage , as (InstanceOfAssertFactories .STRING ))
462
+ .isEmpty ();
463
+ assertThat (event .getThrowable ()).isNull ();
464
+ verify (contextData ).isFrozen ();
465
+ verify (contextData ).clear ();
466
+ assertThat (event .getContextData ()).isSameAs (contextData );
467
+ assertThat (event .getContextStack ()).isNull ();
468
+ assertThat (event .getThreadName ()).isNull ();
469
+ assertThat (event .getSource ()).isNull ();
470
+
471
+ // Verify interaction exhaustion
472
+ verifyNoMoreInteractions (asyncLogger , message , throwable , contextData , contextStack );
401
473
}
402
474
}
0 commit comments