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  }