package logging import ( "encoding/json" "os" "testing" "github.com/hashicorp/consul/sdk/testutil" "github.com/mitchellh/cli" "github.com/stretchr/testify/require" ) func TestLogger_SetupBasic(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{ LogLevel: "INFO", } ui := cli.NewMockUi() logger, gatedWriter, writer, ok := Setup(cfg, ui) require.True(ok) require.NotNil(gatedWriter) require.NotNil(writer) require.NotNil(logger) } func TestLogger_SetupInvalidLogLevel(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{} ui := cli.NewMockUi() _, _, _, ok := Setup(cfg, ui) require.False(ok) require.Contains(ui.ErrorWriter.String(), "Invalid log level") } func TestLogger_SetupLoggerErrorLevel(t *testing.T) { t.Parallel() cases := []struct { desc string before func(*Config) }{ { desc: "ERR log level", before: func(cfg *Config) { cfg.LogLevel = "ERR" }, }, { desc: "ERROR log level", before: func(cfg *Config) { cfg.LogLevel = "ERROR" }, }, } for _, c := range cases { t.Run(c.desc, func(t *testing.T) { var cfg Config c.before(&cfg) require := require.New(t) ui := cli.NewMockUi() logger, gatedWriter, _, ok := Setup(&cfg, ui) require.True(ok) require.NotNil(logger) require.NotNil(gatedWriter) gatedWriter.Flush() logger.Error("test error msg") logger.Info("test info msg") require.Contains(ui.OutputWriter.String(), "[ERROR] test error msg") require.NotContains(ui.OutputWriter.String(), "[INFO] test info msg") }) } } func TestLogger_SetupLoggerDebugLevel(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{ LogLevel: "DEBUG", } ui := cli.NewMockUi() logger, gatedWriter, _, ok := Setup(cfg, ui) require.True(ok) require.NotNil(logger) require.NotNil(gatedWriter) gatedWriter.Flush() logger.Info("test info msg") logger.Debug("test debug msg") require.Contains(ui.OutputWriter.String(), "[INFO] test info msg") require.Contains(ui.OutputWriter.String(), "[DEBUG] test debug msg") } func TestLogger_SetupLoggerWithName(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{ LogLevel: "DEBUG", Name: "test-system", } ui := cli.NewMockUi() logger, gatedWriter, _, ok := Setup(cfg, ui) require.True(ok) require.NotNil(logger) require.NotNil(gatedWriter) gatedWriter.Flush() logger.Warn("test warn msg") require.Contains(ui.OutputWriter.String(), "[WARN] test-system: test warn msg") } func TestLogger_SetupLoggerWithJSON(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{ LogLevel: "DEBUG", LogJSON: true, Name: "test-system", } ui := cli.NewMockUi() logger, gatedWriter, _, ok := Setup(cfg, ui) require.True(ok) require.NotNil(logger) require.NotNil(gatedWriter) gatedWriter.Flush() logger.Warn("test warn msg") var jsonOutput map[string]string err := json.Unmarshal(ui.OutputWriter.Bytes(), &jsonOutput) require.NoError(err) require.Contains(jsonOutput, "@level") require.Equal(jsonOutput["@level"], "warn") require.Contains(jsonOutput, "@message") require.Equal(jsonOutput["@message"], "test warn msg") } func TestLogger_SetupLoggerWithValidLogPath(t *testing.T) { t.Parallel() require := require.New(t) tmpDir := testutil.TempDir(t, t.Name()) defer os.RemoveAll(tmpDir) cfg := &Config{ LogLevel: "INFO", LogFilePath: tmpDir + "/", } ui := cli.NewMockUi() logger, gatedWriter, writer, ok := Setup(cfg, ui) require.True(ok) require.NotNil(logger) require.NotNil(gatedWriter) require.NotNil(writer) } func TestLogger_SetupLoggerWithInValidLogPath(t *testing.T) { t.Parallel() require := require.New(t) cfg := &Config{ LogLevel: "INFO", LogFilePath: "nonexistentdir/", } ui := cli.NewMockUi() logger, gatedWriter, writer, ok := Setup(cfg, ui) require.Contains(ui.ErrorWriter.String(), "no such file or directory") require.False(ok) require.Nil(logger) require.Nil(gatedWriter) require.Nil(writer) } func TestLogger_SetupLoggerWithInValidLogPathPermission(t *testing.T) { t.Parallel() require := require.New(t) tmpDir := "/tmp/" + t.Name() os.Mkdir(tmpDir, 0000) defer os.RemoveAll(tmpDir) cfg := &Config{ LogLevel: "INFO", LogFilePath: tmpDir + "/", } ui := cli.NewMockUi() logger, gatedWriter, writer, ok := Setup(cfg, ui) require.Contains(ui.ErrorWriter.String(), "permission denied") require.False(ok) require.Nil(logger) require.Nil(gatedWriter) require.Nil(writer) }