1+ using  System ; 
2+ using  System . Collections . Generic ; 
3+ using  System . IO ; 
4+ using  System . Text ; 
5+ using  System . Xml ; 
6+ using  AwesomeAssertions ; 
7+ using  Microsoft . Extensions . Configuration ; 
8+ using  ReflectionMagic ; 
9+ using  Serilog . Core ; 
10+ using  Serilog . Settings . Configuration ; 
11+ using  Serilog . Sinks . File ; 
12+ using  Xunit ; 
13+ 
14+ namespace  Serilog . Formatting . Log4Net . Tests ; 
15+ 
16+ public  class  SerilogSettingsConfigurationTest 
17+ { 
18+     [ Fact ] 
19+     public  void  ConfigureDefault ( ) 
20+     { 
21+         // lang=json 
22+         var  config  = 
23+             """ 
24+             { 
25+               "Serilog": { 
26+                 "WriteTo:File": { 
27+                   "Name": "File", 
28+                   "Args": { 
29+                     "path": "logs.xml", 
30+                     "formatter": { 
31+                       "type": "Serilog.Formatting.Log4Net.Log4NetTextFormatter, Serilog.Formatting.Log4Net" 
32+                     } 
33+                   } 
34+                 } 
35+               } 
36+             } 
37+             """ ; 
38+ 
39+         var  options  =  GetLog4NetTextFormatterOptions ( config ) ; 
40+         IFormatProvider ?  formatProvider  =  GetFormatProvider ( options ) ; 
41+         CDataMode  cDataMode  =  GetCDataMode ( options ) ; 
42+         string  nullText  =  GetNullText ( options ) ; 
43+         XmlQualifiedName ?  xmlNamespace  =  GetXmlNamespace ( options ) ; 
44+         XmlWriterSettings  xmlWriterSettings  =  GetXmlWriterSettings ( options ) ; 
45+         PropertyFilter  filterProperty  =  GetFilterProperty ( options ) ; 
46+         MessageFormatter  formatMessage  =  GetFormatMessage ( options ) ; 
47+         ExceptionFormatter  formatException  =  GetFormatException ( options ) ; 
48+ 
49+         formatProvider . Should ( ) . BeNull ( ) ; 
50+         cDataMode . Should ( ) . Be ( CDataMode . Always ) ; 
51+         nullText . Should ( ) . Be ( "(null)" ) ; 
52+         xmlNamespace . Should ( ) . BeEquivalentTo ( new  XmlQualifiedName ( "log4net" ,  "http://logging.apache.org/log4net/schemas/log4net-events-1.2/" ) ) ; 
53+     } 
54+ 
55+     [ Theory ] 
56+     [ InlineData ( CDataMode . Always ) ] 
57+     [ InlineData ( CDataMode . Never ) ] 
58+     [ InlineData ( CDataMode . IfNeeded ) ] 
59+     public  void  ConfigureCDataMode ( CDataMode  inputCDataMode ) 
60+     { 
61+         // lang=json 
62+         var  config  = 
63+             $$ """ 
64+             { 
65+               "Serilog": { 
66+                 "WriteTo:File": { 
67+                   "Name": "File", 
68+                   "Args": { 
69+                     "path": "logs.xml", 
70+                     "formatter": { 
71+                       "type": "Serilog.Formatting.Log4Net.Log4NetTextFormatter, Serilog.Formatting.Log4Net", 
72+                       "cDataMode": "{{ inputCDataMode }} " 
73+                     } 
74+                   } 
75+                 } 
76+               } 
77+             } 
78+             """  ; 
79+ 
80+         CDataMode  cDataMode  =  GetCDataMode ( GetLog4NetTextFormatterOptions ( config ) ) ; 
81+ 
82+         cDataMode . Should ( ) . Be ( inputCDataMode ) ; 
83+     } 
84+ 
85+     [ Theory ] 
86+     [ InlineData ( "" ) ] 
87+     [ InlineData ( "<null>" ) ] 
88+     [ InlineData ( "🌀" ) ] 
89+     public  void  ConfigureNullText ( string  inputNullText ) 
90+     { 
91+         // lang=json 
92+         var  config  = 
93+             $$ """ 
94+             { 
95+               "Serilog": { 
96+                 "WriteTo:File": { 
97+                   "Name": "File", 
98+                   "Args": { 
99+                     "path": "logs.xml", 
100+                     "formatter": { 
101+                       "type": "Serilog.Formatting.Log4Net.Log4NetTextFormatter, Serilog.Formatting.Log4Net", 
102+                       "nullText": "{{ inputNullText }} " 
103+                     } 
104+                   } 
105+                 } 
106+               } 
107+             } 
108+             """  ; 
109+ 
110+         string  nullText  =  GetNullText ( GetLog4NetTextFormatterOptions ( config ) ) ; 
111+ 
112+         nullText . Should ( ) . Be ( inputNullText ) ; 
113+     } 
114+ 
115+     private  static IFormatProvider ?  GetFormatProvider ( dynamic  options )  =>  options . FormatProvider ; 
116+     private  static CDataMode  GetCDataMode ( dynamic  options )  =>  options . CDataMode ; 
117+     private  static string  GetNullText ( dynamic  options )  =>  options . NullText ; 
118+     private  static XmlQualifiedName ?  GetXmlNamespace ( dynamic  options )  =>  options . XmlNamespace ; 
119+     private  static XmlWriterSettings  GetXmlWriterSettings ( dynamic  options )  =>  options . XmlWriterSettings ; 
120+     private  static PropertyFilter  GetFilterProperty ( dynamic  options )  =>  options . FilterProperty ; 
121+     private  static MessageFormatter  GetFormatMessage ( dynamic  options )  =>  options . FormatMessage ; 
122+     private  static ExceptionFormatter  GetFormatException ( dynamic  options )  =>  options . FormatException ; 
123+ 
124+     private  static dynamic  GetLog4NetTextFormatterOptions ( string  config ) 
125+     { 
126+         using  var  configStream  =  new  MemoryStream ( Encoding . UTF8 . GetBytes ( config ) ) ; 
127+         var  configuration  =  new  ConfigurationBuilder ( ) . AddJsonStream ( configStream ) . Build ( ) ; 
128+         var  options  =  new  ConfigurationReaderOptions ( typeof ( ILogger ) . Assembly ,  typeof ( FileSink ) . Assembly ,  typeof ( Log4NetTextFormatter ) . Assembly ) ; 
129+         using  var  logger  =  new  LoggerConfiguration ( ) . ReadFrom . Configuration ( configuration ,  options ) . CreateLogger ( ) ; 
130+         IEnumerable < ILogEventSink >  sinks  =  logger . AsDynamic ( ) . _sink . _sinks ; 
131+         var  fileSink  =  sinks . Should ( ) . ContainSingle ( ) . Which . Should ( ) . BeOfType < FileSink > ( ) . Subject ; 
132+         return  fileSink . AsDynamic ( ) . _textFormatter . _options ; 
133+     } 
134+ } 
0 commit comments