1package log 2 3import ( 4 "bytes" 5 "regexp" 6 "testing" 7 8 logrus "github.com/sirupsen/logrus" 9 "github.com/stretchr/testify/require" 10) 11 12func TestInitialize(t *testing.T) { 13 tests := []struct { 14 name string 15 opts []LoggerOption 16 wantErr bool 17 regexps []*regexp.Regexp 18 infoMessage string 19 debugMessage string 20 }{ 21 { 22 name: "trivial", 23 regexps: []*regexp.Regexp{ 24 regexp.MustCompile(`^$`), 25 }, 26 }, 27 { 28 name: "simple", 29 infoMessage: "Hello", 30 regexps: []*regexp.Regexp{ 31 regexp.MustCompile(`^time=.*level=info.*msg=Hello`), 32 }, 33 }, 34 { 35 name: "simple-json", 36 opts: []LoggerOption{ 37 WithFormatter("json"), 38 }, 39 infoMessage: "Hello", 40 regexps: []*regexp.Regexp{ 41 regexp.MustCompile(`^{"level":"info","msg":"Hello"`), 42 }, 43 }, 44 { 45 name: "simple-text", 46 opts: []LoggerOption{ 47 WithFormatter("text"), 48 }, 49 infoMessage: "Hello", 50 regexps: []*regexp.Regexp{ 51 regexp.MustCompile(`^time=.*level=info.*msg=Hello`), 52 }, 53 }, 54 { 55 name: "invalid-formatter", 56 opts: []LoggerOption{ 57 WithFormatter("rubbish"), 58 }, 59 infoMessage: "Hello", 60 regexps: []*regexp.Regexp{ 61 regexp.MustCompile(`^time=.*level=warning.*msg="unknown logging format rubbish, ignoring option"`), 62 regexp.MustCompile(`(?m)^time=.*level=info.*msg=Hello`), 63 }, 64 }, 65 { 66 name: "loglevel-below-threshold", 67 opts: []LoggerOption{ 68 WithLogLevel("info"), 69 }, 70 debugMessage: "Hello", 71 regexps: []*regexp.Regexp{ 72 regexp.MustCompile(`^$`), 73 }, 74 }, 75 { 76 name: "loglevel-at-threshold", 77 opts: []LoggerOption{ 78 WithLogLevel("info"), 79 }, 80 infoMessage: "InfoHello", 81 debugMessage: "DebugHello", 82 regexps: []*regexp.Regexp{ 83 regexp.MustCompile(`^time=.*level=info.*msg=InfoHello\n$`), 84 }, 85 }, 86 { 87 name: "invalid-threshold", 88 opts: []LoggerOption{ 89 WithLogLevel("garbage"), 90 }, 91 infoMessage: "InfoHello", 92 debugMessage: "DebugHello", 93 94 regexps: []*regexp.Regexp{ 95 regexp.MustCompile(`level=warning msg="unknown log level, ignoring option`), 96 regexp.MustCompile(`(?m)^time=.*level=info.*msg=InfoHello\n$`), 97 }, 98 }, 99 { 100 name: "invalid-threshold-json-format", 101 opts: []LoggerOption{ 102 WithFormatter("json"), 103 WithLogLevel("garbage"), 104 }, 105 infoMessage: "InfoHello", 106 debugMessage: "DebugHello", 107 108 regexps: []*regexp.Regexp{ 109 regexp.MustCompile(`"msg":"unknown log level, ignoring option: not a valid logrus Level`), 110 regexp.MustCompile(`"msg":"InfoHello"`), 111 }, 112 }, 113 { 114 name: "emit-to-stderr", 115 opts: []LoggerOption{ 116 WithOutputName("stderr"), 117 }, 118 infoMessage: "InfoHello", 119 regexps: []*regexp.Regexp{ 120 regexp.MustCompile(`^time=.*level=info.*msg=InfoHello\n$`), 121 }, 122 }, 123 { 124 name: "emit-to-stdout", 125 opts: []LoggerOption{ 126 WithOutputName("stdout"), 127 }, 128 infoMessage: "InfoHello", 129 regexps: []*regexp.Regexp{ 130 regexp.MustCompile(`^time=.*level=info.*msg=InfoHello\n$`), 131 }, 132 }, 133 { 134 name: "emit-to-file", 135 opts: []LoggerOption{ 136 WithOutputName("/tmp/test.log"), 137 }, 138 infoMessage: "InfoHello", 139 regexps: []*regexp.Regexp{ 140 regexp.MustCompile(`^time=.*level=info.*msg=InfoHello\n$`), 141 }, 142 }, 143 { 144 name: "color", 145 opts: []LoggerOption{ 146 WithFormatter("color"), 147 }, 148 infoMessage: "It's starting to look like a triple rainbow.", 149 regexps: []*regexp.Regexp{ 150 regexp.MustCompile("^\x1b\\[36mINFO\x1b\\[0m\\[0000\\] It's starting to look like a triple rainbow."), 151 }, 152 }, 153 } 154 155 for _, tt := range tests { 156 t.Run(tt.name, func(t *testing.T) { 157 var buf bytes.Buffer 158 159 opts := append([]LoggerOption{}, tt.opts...) 160 opts = append(opts, WithWriter(&buf)) 161 162 closer, err := Initialize(opts...) 163 defer closer.Close() 164 165 if tt.infoMessage != "" { 166 logrus.Info(tt.infoMessage) 167 } 168 169 if tt.debugMessage != "" { 170 logrus.Debug(tt.debugMessage) 171 } 172 173 if tt.wantErr { 174 require.Error(t, err) 175 } else { 176 require.NoError(t, err) 177 } 178 179 bytes := buf.Bytes() 180 for _, re := range tt.regexps { 181 require.Regexp(t, re, string(bytes)) 182 } 183 }) 184 } 185} 186