@@ -9,14 +9,13 @@ import (
99 "github.com/stretchr/testify/assert"
1010)
1111
12- var writeCalls int
13-
1412type mockedWriter struct {
15- wantErr bool
13+ wantErr bool
14+ writeCalls int
1615}
1716
18- func (c mockedWriter ) Write (p []byte ) (int , error ) {
19- writeCalls ++
17+ func (c * mockedWriter ) Write (p []byte ) (int , error ) {
18+ c . writeCalls ++
2019
2120 if c .wantErr {
2221 return - 1 , errors .New ("Expected error" )
@@ -26,65 +25,108 @@ func (c mockedWriter) Write(p []byte) (int, error) {
2625}
2726
2827// Tests that a new writer is only used if it actually works.
29- func TestResilientMultiWriter (t * testing.T ) {
28+ func TestResilientMultiWriter_Errors (t * testing.T ) {
3029 tests := []struct {
3130 name string
32- writers []io. Writer
31+ writers []* mockedWriter
3332 }{
3433 {
3534 name : "All valid writers" ,
36- writers : []io. Writer {
37- mockedWriter {
35+ writers : []* mockedWriter {
36+ {
3837 wantErr : false ,
3938 },
40- mockedWriter {
39+ {
4140 wantErr : false ,
4241 },
4342 },
4443 },
4544 {
4645 name : "All invalid writers" ,
47- writers : []io. Writer {
48- mockedWriter {
46+ writers : []* mockedWriter {
47+ {
4948 wantErr : true ,
5049 },
51- mockedWriter {
50+ {
5251 wantErr : true ,
5352 },
5453 },
5554 },
5655 {
5756 name : "First invalid writer" ,
58- writers : []io. Writer {
59- mockedWriter {
57+ writers : []* mockedWriter {
58+ {
6059 wantErr : true ,
6160 },
62- mockedWriter {
61+ {
6362 wantErr : false ,
6463 },
6564 },
6665 },
6766 {
6867 name : "First valid writer" ,
69- writers : []io. Writer {
70- mockedWriter {
68+ writers : []* mockedWriter {
69+ {
7170 wantErr : false ,
7271 },
73- mockedWriter {
72+ {
7473 wantErr : true ,
7574 },
7675 },
7776 },
7877 }
7978
80- for _ , tt := range tests {
81- writers := tt .writers
82- multiWriter := resilientMultiWriter {writers }
79+ for _ , test := range tests {
80+ t .Run (test .name , func (t * testing.T ) {
81+ writers := []io.Writer {}
82+ for _ , w := range test .writers {
83+ writers = append (writers , w )
84+ }
85+ multiWriter := resilientMultiWriter {zerolog .InfoLevel , writers , nil }
86+
87+ logger := zerolog .New (multiWriter ).With ().Timestamp ().Logger ()
88+ logger .Info ().Msg ("Test msg" )
89+
90+ for _ , w := range test .writers {
91+ // Expect each writer to be written to regardless of the previous writers returning an error
92+ assert .Equal (t , 1 , w .writeCalls )
93+ }
94+ })
95+ }
96+ }
97+
98+ type mockedManagementWriter struct {
99+ WriteCalls int
100+ }
101+
102+ func (c * mockedManagementWriter ) Write (p []byte ) (int , error ) {
103+ return len (p ), nil
104+ }
105+
106+ func (c * mockedManagementWriter ) WriteLevel (level zerolog.Level , p []byte ) (int , error ) {
107+ c .WriteCalls ++
108+ return len (p ), nil
109+ }
110+
111+ // Tests that management writer receives write calls of all levels except Disabled
112+ func TestResilientMultiWriter_Management (t * testing.T ) {
113+ for _ , level := range []zerolog.Level {
114+ zerolog .DebugLevel ,
115+ zerolog .InfoLevel ,
116+ zerolog .WarnLevel ,
117+ zerolog .ErrorLevel ,
118+ zerolog .FatalLevel ,
119+ zerolog .PanicLevel ,
120+ } {
121+ t .Run (level .String (), func (t * testing.T ) {
122+ managementWriter := mockedManagementWriter {}
123+ multiWriter := resilientMultiWriter {level , []io.Writer {& mockedWriter {}}, & managementWriter }
83124
84- logger := zerolog .New (multiWriter ).With ().Timestamp ().Logger (). Level ( zerolog . InfoLevel )
85- logger .Info ().Msg ("Test msg" )
125+ logger := zerolog .New (multiWriter ).With ().Timestamp ().Logger ()
126+ logger .Info ().Msg ("Test msg" )
86127
87- assert .Equal (t , len (writers ), writeCalls )
88- writeCalls = 0
128+ // Always write to management
129+ assert .Equal (t , 1 , managementWriter .WriteCalls )
130+ })
89131 }
90132}
0 commit comments