12
12
import de .rub .nds .modifiablevariable .util .DataConverter ;
13
13
import java .nio .charset .Charset ;
14
14
import java .nio .charset .StandardCharsets ;
15
+ import java .util .List ;
16
+ import java .util .regex .Pattern ;
15
17
import org .apache .logging .log4j .Level ;
16
18
import org .apache .logging .log4j .core .LogEvent ;
17
19
import org .apache .logging .log4j .core .config .Configuration ;
18
20
import org .apache .logging .log4j .core .config .DefaultConfiguration ;
21
+ import org .apache .logging .log4j .core .impl .LocationAware ;
19
22
import org .apache .logging .log4j .core .impl .Log4jLogEvent ;
20
23
import org .apache .logging .log4j .core .layout .AbstractStringLayout ;
21
24
import org .apache .logging .log4j .core .layout .PatternSelector ;
22
25
import org .apache .logging .log4j .core .pattern .PatternFormatter ;
26
+ import org .apache .logging .log4j .core .pattern .PatternParser ;
23
27
import org .apache .logging .log4j .core .pattern .RegexReplacement ;
24
28
import org .apache .logging .log4j .message .ParameterizedMessage ;
25
29
import org .apache .logging .log4j .message .SimpleMessage ;
@@ -499,6 +503,156 @@ void testSerializerBuilderWithPatternSelector() {
499
503
assertNotNull (serializer );
500
504
}
501
505
506
+ @ Test
507
+ void testPatternSelectorSerializer () {
508
+ // Test PatternSelectorSerializer functionality
509
+ LocationAwarePatternSelector patternSelector = new LocationAwarePatternSelector (false );
510
+ RegexReplacement regexReplacement =
511
+ RegexReplacement .createRegexReplacement (Pattern .compile ("test" ), "TEST" );
512
+
513
+ ExtendedPatternLayout layout =
514
+ ExtendedPatternLayout .newBuilder ()
515
+ .withPattern ("%m%n" )
516
+ .withPatternSelector (patternSelector )
517
+ .withRegexReplacement (regexReplacement )
518
+ .build ();
519
+
520
+ String message = "This is a test message" ;
521
+ LogEvent event = createLogEvent (new SimpleMessage (message ));
522
+ String result = layout .toSerializable (event );
523
+
524
+ // Should replace "test" with "TEST"
525
+ assertTrue (result .contains ("This is a TEST message" ));
526
+ }
527
+
528
+ @ Test
529
+ void testPatternSelectorSerializerToString () {
530
+ // Test toString method of PatternSelectorSerializer
531
+ LocationAwarePatternSelector patternSelector = new LocationAwarePatternSelector (false );
532
+ RegexReplacement regexReplacement =
533
+ RegexReplacement .createRegexReplacement (Pattern .compile ("test" ), "TEST" );
534
+
535
+ ExtendedPatternLayout .SerializerBuilder builder =
536
+ ExtendedPatternLayout .newSerializerBuilder ();
537
+ builder .setPattern ("%m%n" );
538
+ builder .setPatternSelector (patternSelector );
539
+ builder .setReplace (regexReplacement );
540
+
541
+ AbstractStringLayout .Serializer serializer = builder .build ();
542
+ assertNotNull (serializer );
543
+
544
+ // The serializer should have a meaningful toString
545
+ String toStringResult = serializer .toString ();
546
+ assertNotNull (toStringResult );
547
+ assertTrue (toStringResult .contains ("patternSelector" ));
548
+ }
549
+
550
+ @ Test
551
+ void testLocationAwarePatternSelector () {
552
+ // Test with LocationAware pattern selector that requires location
553
+ LocationAwarePatternSelector patternSelector = new LocationAwarePatternSelector (true );
554
+
555
+ ExtendedPatternLayout layout =
556
+ ExtendedPatternLayout .newBuilder ()
557
+ .withPattern ("%m%n" )
558
+ .withPatternSelector (patternSelector )
559
+ .build ();
560
+
561
+ assertTrue (layout .requiresLocation ());
562
+
563
+ // Test with LocationAware pattern selector that doesn't require location
564
+ LocationAwarePatternSelector patternSelector2 = new LocationAwarePatternSelector (false );
565
+
566
+ ExtendedPatternLayout layout2 =
567
+ ExtendedPatternLayout .newBuilder ()
568
+ .withPattern ("%m%n" )
569
+ .withPatternSelector (patternSelector2 )
570
+ .build ();
571
+
572
+ assertFalse (layout2 .requiresLocation ());
573
+ }
574
+
575
+ @ Test
576
+ void testPatternSelectorSerializerWithoutReplace () {
577
+ // Test PatternSelectorSerializer without regex replacement
578
+ LocationAwarePatternSelector patternSelector = new LocationAwarePatternSelector (false );
579
+
580
+ ExtendedPatternLayout layout =
581
+ ExtendedPatternLayout .newBuilder ()
582
+ .withPattern ("%m%n" )
583
+ .withPatternSelector (patternSelector )
584
+ .build ();
585
+
586
+ String message = "This is a test message" ;
587
+ LogEvent event = createLogEvent (new SimpleMessage (message ));
588
+ String result = layout .toSerializable (event );
589
+
590
+ // Should contain the original message
591
+ assertTrue (result .contains ("This is a test message" ));
592
+ }
593
+
594
+ @ Test
595
+ void testSerializerBuilderWithOnlyPatternSelector () {
596
+ // Test creating serializer with pattern selector but no pattern
597
+ PatternSelector patternSelector = new LocationAwarePatternSelector (false );
598
+
599
+ ExtendedPatternLayout .SerializerBuilder builder =
600
+ ExtendedPatternLayout .newSerializerBuilder ();
601
+ builder .setPatternSelector (patternSelector );
602
+ builder .setDefaultPattern ("%m%n" );
603
+
604
+ AbstractStringLayout .Serializer serializer = builder .build ();
605
+ assertNotNull (serializer );
606
+ }
607
+
608
+ @ Test
609
+ void testBuilderConstants () {
610
+ // Test the pattern constants
611
+ assertEquals ("%m%n" , ExtendedPatternLayout .DEFAULT_CONVERSION_PATTERN );
612
+ assertEquals (
613
+ "%r [%t] %p %c %notEmpty{%x }- %m%n" ,
614
+ ExtendedPatternLayout .TTCC_CONVERSION_PATTERN );
615
+ assertEquals ("%d [%t] %p %c - %m%n" , ExtendedPatternLayout .SIMPLE_CONVERSION_PATTERN );
616
+ assertEquals ("Converter" , ExtendedPatternLayout .KEY );
617
+ }
618
+
619
+ @ Test
620
+ void testInvalidPatternInSerializerBuilder () {
621
+ // Test with an invalid pattern that causes exception
622
+ // Log4j will not throw an exception for invalid patterns, it will just log an error
623
+ // So let's remove this test as it's not valid
624
+ ExtendedPatternLayout .SerializerBuilder builder =
625
+ ExtendedPatternLayout .newSerializerBuilder ();
626
+ builder .setPattern ("%INVALID" );
627
+ builder .setConfiguration (new DefaultConfiguration ());
628
+
629
+ // The build should not throw - invalid patterns are logged as errors
630
+ AbstractStringLayout .Serializer serializer = builder .build ();
631
+ assertNotNull (serializer );
632
+ }
633
+
634
+ @ Test
635
+ void testPatternSelectorSerializerDirectly () {
636
+ // Test PatternSelectorSerializer's toSerializable(LogEvent) method directly
637
+ LocationAwarePatternSelector patternSelector = new LocationAwarePatternSelector (false );
638
+
639
+ ExtendedPatternLayout .SerializerBuilder builder =
640
+ ExtendedPatternLayout .newSerializerBuilder ();
641
+ builder .setPatternSelector (patternSelector );
642
+ builder .setDefaultPattern ("%m%n" );
643
+
644
+ AbstractStringLayout .Serializer serializer = builder .build ();
645
+ assertNotNull (serializer );
646
+
647
+ // Test the toSerializable(LogEvent) method
648
+ String message = "Test message" ;
649
+ LogEvent event = createLogEvent (new SimpleMessage (message ));
650
+ String result = serializer .toSerializable (event );
651
+
652
+ assertNotNull (result );
653
+ assertTrue (result .contains ("Test message" ));
654
+ }
655
+
502
656
private LogEvent createLogEvent (org .apache .logging .log4j .message .Message message ) {
503
657
return Log4jLogEvent .newBuilder ()
504
658
.setLoggerName ("TestLogger" )
@@ -525,4 +679,32 @@ public String toString() {
525
679
return name ;
526
680
}
527
681
}
682
+
683
+ // LocationAware PatternSelector implementation for testing
684
+ private static class LocationAwarePatternSelector implements PatternSelector , LocationAware {
685
+ private final boolean requiresLocation ;
686
+ private final PatternFormatter [] formatters ;
687
+
688
+ public LocationAwarePatternSelector (boolean requiresLocation ) {
689
+ this .requiresLocation = requiresLocation ;
690
+ PatternParser parser = ExtendedPatternLayout .createPatternParser (null );
691
+ List <PatternFormatter > formatterList = parser .parse ("%m%n" );
692
+ this .formatters = formatterList .toArray (new PatternFormatter [0 ]);
693
+ }
694
+
695
+ @ Override
696
+ public PatternFormatter [] getFormatters (LogEvent event ) {
697
+ return formatters ;
698
+ }
699
+
700
+ @ Override
701
+ public boolean requiresLocation () {
702
+ return requiresLocation ;
703
+ }
704
+
705
+ @ Override
706
+ public String toString () {
707
+ return "LocationAwarePatternSelector" ;
708
+ }
709
+ }
528
710
}
0 commit comments