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