@@ -57,3 +57,94 @@ impl Log for OpenTelemetryLogger {
5757 self . otel_logger . flush ( ) ;
5858 }
5959}
60+
61+ #[ cfg( test) ]
62+ mod tests {
63+ use super :: * ;
64+ use log:: { Level , Metadata , Record } ;
65+ use std:: sync:: { Arc , Mutex } ;
66+
67+ struct MockLogger {
68+ logs : Arc < Mutex < Vec < String > > > ,
69+ enabled : bool ,
70+ }
71+
72+ impl MockLogger {
73+ fn new ( enabled : bool ) -> Self {
74+ MockLogger {
75+ logs : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
76+ enabled,
77+ }
78+ }
79+ }
80+
81+ impl Log for MockLogger {
82+ fn enabled < ' a > ( & self , _metadata : & Metadata < ' a > ) -> bool {
83+ self . enabled
84+ }
85+
86+ fn log < ' a > ( & self , record : & Record < ' a > ) {
87+ let message = format ! ( "{} - {}" , record. level( ) , record. args( ) ) ;
88+ self . logs . lock ( ) . unwrap ( ) . push ( message) ;
89+ }
90+
91+ fn flush ( & self ) { }
92+ }
93+
94+ #[ test]
95+ fn test_log_forwarding_enabled ( ) {
96+ let mock_inner_logger = Box :: new ( MockLogger :: new ( true ) ) ;
97+ let mock_otel_logger = Box :: new ( MockLogger :: new ( true ) ) ;
98+
99+ let inner_logs = Arc :: clone ( & mock_inner_logger. logs ) ;
100+ let otel_logs = Arc :: clone ( & mock_otel_logger. logs ) ;
101+
102+ let logger = OpenTelemetryLogger {
103+ inner_logger : mock_inner_logger,
104+ otel_logger : mock_otel_logger,
105+ } ;
106+
107+ let record = Record :: builder ( )
108+ . level ( Level :: Info )
109+ . args ( format_args ! ( "Test log message" ) )
110+ . build ( ) ;
111+
112+ logger. log ( & record) ;
113+
114+ let inner_log_messages = inner_logs. lock ( ) . unwrap ( ) ;
115+ let otel_log_messages = otel_logs. lock ( ) . unwrap ( ) ;
116+
117+ assert_eq ! (
118+ inner_log_messages. get( 0 ) . unwrap( ) ,
119+ "INFO - Test log message"
120+ ) ;
121+ assert_eq ! ( otel_log_messages. get( 0 ) . unwrap( ) , "INFO - Test log message" ) ;
122+ }
123+
124+ #[ test]
125+ fn test_log_forwarding_disabled ( ) {
126+ let mock_inner_logger = Box :: new ( MockLogger :: new ( false ) ) ;
127+ let mock_otel_logger = Box :: new ( MockLogger :: new ( false ) ) ;
128+
129+ let inner_logs = Arc :: clone ( & mock_inner_logger. logs ) ;
130+ let otel_logs = Arc :: clone ( & mock_otel_logger. logs ) ;
131+
132+ let logger = OpenTelemetryLogger {
133+ inner_logger : mock_inner_logger,
134+ otel_logger : mock_otel_logger,
135+ } ;
136+
137+ let record = Record :: builder ( )
138+ . level ( Level :: Info )
139+ . args ( format_args ! ( "Test log message" ) )
140+ . build ( ) ;
141+
142+ logger. log ( & record) ;
143+
144+ let inner_log_messages = inner_logs. lock ( ) . unwrap ( ) ;
145+ let otel_log_messages = otel_logs. lock ( ) . unwrap ( ) ;
146+
147+ assert_eq ! ( inner_log_messages. len( ) , 0 ) ;
148+ assert_eq ! ( otel_log_messages. len( ) , 0 ) ;
149+ }
150+ }
0 commit comments