github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/log/log_internal_test.go (about) 1 package log 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/helmwave/helmwave/pkg/helper" 8 "github.com/helmwave/helmwave/pkg/kubedog" 9 "github.com/helmwave/helmwave/tests" 10 formatter "github.com/helmwave/logrus-emoji-formatter" 11 log "github.com/sirupsen/logrus" 12 logTest "github.com/sirupsen/logrus/hooks/test" 13 "github.com/stretchr/testify/suite" 14 "github.com/werf/logboek" 15 "k8s.io/klog/v2" 16 ) 17 18 type LogTestSuite struct { 19 suite.Suite 20 21 ctx context.Context 22 defaultHooks log.LevelHooks 23 logHook *logTest.Hook 24 } 25 26 //nolint:paralleltest // helmwave uses single logger for the whole program 27 func TestLogTestSuite(t *testing.T) { 28 // t.Parallel() 29 suite.Run(t, new(LogTestSuite)) 30 } 31 32 func (ts *LogTestSuite) SetupSuite() { 33 ts.defaultHooks = log.StandardLogger().Hooks 34 ts.logHook = logTest.NewLocal(log.StandardLogger()) 35 } 36 37 func (ts *LogTestSuite) SetupTest() { 38 ts.ctx = tests.GetContext(ts.T()) 39 } 40 41 func (ts *LogTestSuite) TearDownTestSuite() { 42 ts.logHook.Reset() 43 } 44 45 func (ts *LogTestSuite) TearDownSuite() { 46 log.StandardLogger().ReplaceHooks(ts.defaultHooks) 47 } 48 49 func (ts *LogTestSuite) getLoggerMessages() []string { 50 return helper.SlicesMap(ts.logHook.AllEntries(), func(entry *log.Entry) string { 51 return entry.Message 52 }) 53 } 54 55 func (ts *LogTestSuite) TestKLogHandler() { 56 settings := &Settings{ 57 format: "json", 58 level: "info", 59 } 60 ts.Require().NoError(settings.Init()) 61 62 message := "123" 63 klog.Info(message) 64 65 ts.Require().Empty(ts.getLoggerMessages()) 66 } 67 68 func (ts *LogTestSuite) TestLogLevel() { 69 settings := &Settings{ 70 format: "text", 71 level: "info", 72 } 73 ts.Require().NoError(settings.Init()) 74 75 log.Debug("test 123") 76 ts.Require().Empty(ts.getLoggerMessages(), "message below minimum level should not be logged") 77 } 78 79 func (ts *LogTestSuite) TestDebugLogLevel() { 80 settings := &Settings{ 81 format: "text", 82 level: "debug", 83 } 84 ts.Require().NoError(settings.Init()) 85 86 ts.Require().True(helper.Helm.Debug, "helm debug should be enabled") 87 } 88 89 func (ts *LogTestSuite) TestInvalidLogLevel() { 90 settings := []struct { 91 s *Settings 92 msg string 93 }{ 94 { 95 s: &Settings{ 96 format: "text", 97 }, 98 msg: "should error with no level", 99 }, 100 { 101 s: &Settings{ 102 format: "text", 103 level: "blabla123", 104 }, 105 msg: "should error with invalid level", 106 }, 107 } 108 109 for _, item := range settings { 110 ts.Error(item.s.Init(), item.msg) 111 } 112 } 113 114 func (ts *LogTestSuite) TestFormatter() { 115 settings := []struct { 116 s *Settings 117 formatter log.Formatter 118 msg string 119 }{ 120 { 121 s: &Settings{ 122 format: "json", 123 level: "info", 124 }, 125 formatter: &log.JSONFormatter{ 126 PrettyPrint: true, 127 }, 128 msg: "should use json formatter", 129 }, 130 { 131 s: &Settings{ 132 format: "pad", 133 level: "info", 134 }, 135 formatter: &log.TextFormatter{ 136 PadLevelText: true, 137 DisableTimestamp: true, 138 }, 139 msg: "should use pad formatter", 140 }, 141 { 142 s: &Settings{ 143 format: "emoji", 144 level: "info", 145 }, 146 formatter: &formatter.Config{ 147 LogFormat: "[%lvl%]: %msg%", 148 }, 149 msg: "should use emoji formatter", 150 }, 151 { 152 s: &Settings{ 153 format: "text", 154 level: "info", 155 }, 156 formatter: &log.TextFormatter{ 157 DisableTimestamp: true, 158 }, 159 msg: "should use text formatter", 160 }, 161 } 162 163 for i := range settings { 164 ts.NoError(settings[i].s.Init()) 165 ts.Equal(settings[i].formatter, log.StandardLogger().Formatter, settings[i].msg) 166 } 167 } 168 169 func (ts *LogTestSuite) TestDefaultFormatter() { 170 defaultFormatter := &log.TextFormatter{} 171 log.SetFormatter(defaultFormatter) 172 173 settings := []struct { 174 s *Settings 175 msg string 176 }{ 177 { 178 s: &Settings{ 179 level: "info", 180 }, 181 msg: "should use default formatter", 182 }, 183 { 184 s: &Settings{ 185 format: "blabla123", 186 level: "info", 187 }, 188 msg: "should use default formatter", 189 }, 190 } 191 192 for _, item := range settings { 193 ts.NoError(item.s.Init()) 194 ts.Same(defaultFormatter, log.StandardLogger().Formatter, item.msg) 195 } 196 } 197 198 func (ts *LogTestSuite) TestLogboekWidth() { 199 width := 1 200 201 kubedog.FixLog(ts.ctx, width) 202 ts.Require().Equal(width, logboek.DefaultLogger().Streams().Width(), "logboek width should be set") 203 }