@@ -786,4 +786,66 @@ impl Drop for Async {
786786
787787// }}}
788788
789+
790+ #[ cfg( test) ]
791+ mod test {
792+ use super :: * ;
793+ use std:: sync:: mpsc;
794+
795+ #[ test]
796+ fn integration_test ( ) {
797+ let ( mock_drain, mock_drain_rx) = MockDrain :: new ( ) ;
798+ let async_drain = AsyncBuilder :: new ( mock_drain)
799+ . build ( ) ;
800+ let slog = slog:: Logger :: root ( async_drain. fuse ( ) , o ! ( "field1" => "value1" ) ) ;
801+
802+ info ! ( slog, "Message 1" ; "field2" => "value2" ) ;
803+ warn ! ( slog, "Message 2" ; "field3" => "value3" ) ;
804+ assert_eq ! ( mock_drain_rx. recv( ) . unwrap( ) , r#"INFO Message 1: [("field1", "value1"), ("field2", "value2")]"# ) ;
805+ assert_eq ! ( mock_drain_rx. recv( ) . unwrap( ) , r#"WARN Message 2: [("field1", "value1"), ("field3", "value3")]"# ) ;
806+ }
807+
808+
809+ /// Test-helper drain
810+ #[ derive( Debug ) ]
811+ struct MockDrain {
812+ tx : mpsc:: Sender < String > ,
813+ }
814+
815+ impl MockDrain {
816+ fn new ( ) -> ( Self , mpsc:: Receiver < String > ) {
817+ let ( tx, rx) = mpsc:: channel ( ) ;
818+ ( Self { tx } , rx)
819+ }
820+ }
821+
822+ impl slog:: Drain for MockDrain {
823+ type Ok = ( ) ;
824+ type Err = slog:: Never ;
825+
826+ fn log ( & self , record : & Record , logger_kv : & OwnedKVList ) -> Result < Self :: Ok , Self :: Err > {
827+ let mut serializer = MockSerializer :: default ( ) ;
828+ logger_kv. serialize ( record, & mut serializer) . unwrap ( ) ;
829+ record. kv ( ) . serialize ( record, & mut serializer) . unwrap ( ) ;
830+ let level = record. level ( ) . as_short_str ( ) ;
831+ let msg = record. msg ( ) . to_string ( ) ;
832+ let entry = format ! ( "{} {}: {:?}" , level, msg, serializer. kvs) ;
833+ self . tx . send ( entry) . unwrap ( ) ;
834+ Ok ( ( ) )
835+ }
836+ }
837+
838+ #[ derive( Default ) ]
839+ struct MockSerializer {
840+ kvs : Vec < ( String , String ) > ,
841+ }
842+
843+ impl slog:: Serializer for MockSerializer {
844+ fn emit_arguments ( & mut self , key : Key , val : & fmt:: Arguments ) -> Result < ( ) , slog:: Error > {
845+ self . kvs . push ( ( key. to_string ( ) , val. to_string ( ) ) ) ;
846+ Ok ( ( ) )
847+ }
848+ }
849+ }
850+
789851// vim: foldmethod=marker foldmarker={{{,}}}
0 commit comments