diff --git a/.circleci/config.yml b/.circleci/config.yml index 7ce248d728758..242a190eec08e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,7 +53,7 @@ commands: steps: - run: echo 'export RACE="$RACE -ldflags=-extldflags=-Wl,-ld_classic"' >> $BASH_ENV - run: | - GOARCH=<< parameters.arch >> ./<< parameters.gotestsum >> -- ${RACE} -short ./... + GOARCH=<< parameters.arch >> ./<< parameters.gotestsum >> --format standard-verbose -- ${RACE} -short ./... package-build: parameters: type: diff --git a/.golangci.yml b/.golangci.yml index 4715c5109f0bc..c3c26dc6180a7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -38,6 +38,7 @@ linters: - unconvert - unparam - unused + - usetesting linters-settings: depguard: diff --git a/config/config_test.go b/config/config_test.go index 893c312201561..99ceb8853158f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1103,11 +1103,10 @@ func TestConfigPluginIDsSame(t *testing.T) { func TestPersisterInputStoreLoad(t *testing.T) { // Reserve a temporary state file - file, err := os.CreateTemp("", "telegraf_state-*.json") + file, err := os.CreateTemp(t.TempDir(), "telegraf_state-*.json") require.NoError(t, err) filename := file.Name() require.NoError(t, file.Close()) - defer os.Remove(filename) // Load the plugins cstore := config.NewConfig() diff --git a/logger/structured_logger_test.go b/logger/structured_logger_test.go index 1721bc48f5bcf..9f67e168d874e 100644 --- a/logger/structured_logger_test.go +++ b/logger/structured_logger_test.go @@ -2,6 +2,7 @@ package logger import ( "encoding/json" + "errors" "io" "log" "log/slog" @@ -14,335 +15,335 @@ import ( "github.com/stretchr/testify/require" ) -func TestStructuredStderr(t *testing.T) { +// Deleting open files on Windows returns an error. +// Therefore, each time a new defaultHandler is created, we ensure that the file previously used for logging is closed. +// This is because subsequent tests/subtests do not run in a "clean" environment +// but instead operate on globals set by several init functions within this package. +func createDefaultHandler(t *testing.T) { + closeLogger(t) instance = defaultHandler() - cfg := &Config{ - LogFormat: "structured", - Quiet: true, - } - require.NoError(t, SetupLogging(cfg)) - logger, ok := instance.impl.(*structuredLogger) - require.Truef(t, ok, "logging instance is not a structured-logger but %T", instance.impl) - require.Equal(t, logger.output, os.Stderr) -} - -func TestStructuredFile(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("I! TEST") - log.Printf("D! TEST") // <- should be ignored - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "msg": "TEST", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) -} - -func TestStructuredFileDebug(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("D! TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "DEBUG", - "msg": "TEST", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) -} - -func TestStructuredFileError(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Quiet: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("E! TEST") - log.Printf("I! TEST") // <- should be ignored - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - - expected := map[string]interface{}{ - "level": "ERROR", - "msg": "TEST", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) -} - -func TestStructuredAddDefaultLogLevel(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "msg": "TEST", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) -} - -func TestStructuredDerivedLogger(t *testing.T) { - instance = defaultHandler() - - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - l := New("testing", "test", "") - l.Info("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "msg": "TEST", - "category": "testing", - "plugin": "test", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) -} - -func TestStructuredDerivedLoggerWithAttributes(t *testing.T) { - instance = defaultHandler() - - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - l := New("testing", "test", "myalias") - l.AddAttribute("alias", "foo") // Should be ignored - l.AddAttribute("device_id", 123) - - l.Info("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "msg": "TEST", - "category": "testing", - "plugin": "test", - "alias": "myalias", - "device_id": float64(123), - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) } -func TestStructuredWriteToTruncatedFile(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "msg": "TEST", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) - - require.NoError(t, os.Truncate(tmpfile.Name(), 0)) - - log.Printf("SHOULD BE FIRST") - - buf, err = os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected = map[string]interface{}{ - "level": "INFO", - "msg": "SHOULD BE FIRST", +func closeLogger(t *testing.T) { + err := CloseLogging() + if err != nil && !errors.Is(err, os.ErrClosed) { + require.NoError(t, err) } - - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) } -func TestStructuredWriteToFileInRotation(t *testing.T) { +func TestStructuredLogger(t *testing.T) { tempDir := t.TempDir() - cfg := &Config{ - Logfile: filepath.Join(tempDir, "test.log"), - LogFormat: "structured", - RotationMaxArchives: -1, - RotationMaxSize: 30, - } - require.NoError(t, SetupLogging(cfg)) - - // Close the writer here, otherwise the temp folder cannot be deleted because the current log file is in use. - defer CloseLogging() //nolint:errcheck // We cannot do anything if this fails - - log.Printf("I! TEST 1") // Writes 31 bytes, will rotate - log.Printf("I! TEST") // Writes 29 byes, no rotation expected - - files, err := os.ReadDir(tempDir) - require.NoError(t, err) - require.Len(t, files, 2) -} - -func TestStructuredLogMessageKey(t *testing.T) { - instance = defaultHandler() - - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "structured", - RotationMaxArchives: -1, - Debug: true, - StructuredLogMessageKey: "message", - } - require.NoError(t, SetupLogging(cfg)) - - l := New("testing", "test", "") - l.Info("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - - expected := map[string]interface{}{ - "level": "INFO", - "message": "TEST", - "category": "testing", - "plugin": "test", - } - - var actual map[string]interface{} - require.NoError(t, json.Unmarshal(buf, &actual)) - - require.Contains(t, actual, "time") - require.NotEmpty(t, actual["time"]) - delete(actual, "time") - require.Equal(t, expected, actual) + anotherTempDir := t.TempDir() + + defer closeLogger(t) + + t.Run("TestStructuredStderr", func(t *testing.T) { + createDefaultHandler(t) + cfg := &Config{ + LogFormat: "structured", + Quiet: true, + } + require.NoError(t, SetupLogging(cfg)) + logger, ok := instance.impl.(*structuredLogger) + require.Truef(t, ok, "logging instance is not a structured-logger but %T", instance.impl) + require.Equal(t, logger.output, os.Stderr) + }) + + t.Run("TestStructuredFile", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestStructuredFile.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("I! TEST") + log.Printf("D! TEST") // <- should be ignored + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "msg": "TEST", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredFileDebug", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestStructuredFileDebug.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("D! TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "DEBUG", + "msg": "TEST", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredFileError", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestStructuredFileError.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Quiet: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("E! TEST") + log.Printf("I! TEST") // <- should be ignored + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + + expected := map[string]interface{}{ + "level": "ERROR", + "msg": "TEST", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredAddDefaultLogLevel", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestStructuredAddDefaultLogLevel.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "msg": "TEST", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredDerivedLogger", func(t *testing.T) { + createDefaultHandler(t) + tmpFile := filepath.Join(tempDir, "TestStructuredDerivedLogger.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + l := New("testing", "test", "") + l.Info("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "msg": "TEST", + "category": "testing", + "plugin": "test", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredDerivedLoggerWithAttributes", func(t *testing.T) { + createDefaultHandler(t) + tmpFile := filepath.Join(tempDir, "TestStructuredDerivedLoggerWithAttributes.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + l := New("testing", "test", "myalias") + l.AddAttribute("alias", "foo") // Should be ignored + l.AddAttribute("device_id", 123) + + l.Info("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "msg": "TEST", + "category": "testing", + "plugin": "test", + "alias": "myalias", + "device_id": float64(123), + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredWriteToTruncatedFile", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestStructuredWriteToTruncatedFile.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "msg": "TEST", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + + require.NoError(t, os.Truncate(tmpFile, 0)) + + log.Printf("SHOULD BE FIRST") + + buf, err = os.ReadFile(tmpFile) + require.NoError(t, err) + + expected = map[string]interface{}{ + "level": "INFO", + "msg": "SHOULD BE FIRST", + } + + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) + + t.Run("TestStructuredWriteToFileInRotation", func(t *testing.T) { + cfg := &Config{ + Logfile: filepath.Join(anotherTempDir, "TestStructuredWriteToFileInRotation.log"), + LogFormat: "structured", + RotationMaxArchives: -1, + RotationMaxSize: 30, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("I! TEST 1") // Writes 31 bytes, will rotate + log.Printf("I! TEST") // Writes 29 byes, no rotation expected + + files, err := os.ReadDir(anotherTempDir) + require.NoError(t, err) + require.Len(t, files, 2) + }) + + t.Run("TestStructuredLogMessageKey", func(t *testing.T) { + createDefaultHandler(t) + tmpFile := filepath.Join(tempDir, "TestStructuredLogMessageKey.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "structured", + RotationMaxArchives: -1, + Debug: true, + StructuredLogMessageKey: "message", + } + require.NoError(t, SetupLogging(cfg)) + + l := New("testing", "test", "") + l.Info("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + + expected := map[string]interface{}{ + "level": "INFO", + "message": "TEST", + "category": "testing", + "plugin": "test", + } + + var actual map[string]interface{} + require.NoError(t, json.Unmarshal(buf, &actual)) + + require.Contains(t, actual, "time") + require.NotEmpty(t, actual["time"]) + delete(actual, "time") + require.Equal(t, expected, actual) + }) } func BenchmarkTelegrafStructuredLogWrite(b *testing.B) { diff --git a/logger/text_logger_test.go b/logger/text_logger_test.go index 3a3535649cef7..9cab68500285a 100644 --- a/logger/text_logger_test.go +++ b/logger/text_logger_test.go @@ -12,204 +12,191 @@ import ( "github.com/stretchr/testify/require" ) -func TestTextStderr(t *testing.T) { - instance = defaultHandler() - cfg := &Config{ - LogFormat: "text", - Quiet: true, - } - require.NoError(t, SetupLogging(cfg)) - logger, ok := instance.impl.(*textLogger) - require.Truef(t, ok, "logging instance is not a text-logger but %T", instance.impl) - require.Equal(t, logger.logger.Writer(), os.Stderr) -} - -func TestTextFile(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("I! TEST") - log.Printf("D! TEST") // <- should be ignored - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z I! TEST\n", string(buf[19:])) -} - -func TestTextFileDebug(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("D! TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z D! TEST\n", string(buf[19:])) -} - -func TestTextFileError(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Quiet: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("E! TEST") - log.Printf("I! TEST") // <- should be ignored - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z E! TEST\n", string(buf[19:])) -} - -func TestTextAddDefaultLogLevel(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z I! TEST\n", string(buf[19:])) -} - -func TestTextWriteToTruncatedFile(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - log.Printf("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z I! TEST\n", string(buf[19:])) - - require.NoError(t, os.Truncate(tmpfile.Name(), 0)) - - log.Printf("SHOULD BE FIRST") - - buf, err = os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Equal(t, "Z I! SHOULD BE FIRST\n", string(buf[19:])) -} - -func TestTextWriteToFileInRotation(t *testing.T) { +func TestTextLogger(t *testing.T) { tempDir := t.TempDir() - cfg := &Config{ - Logfile: filepath.Join(tempDir, "test.log"), - LogFormat: "text", - RotationMaxArchives: -1, - RotationMaxSize: 30, - } - require.NoError(t, SetupLogging(cfg)) - - // Close the writer here, otherwise the temp folder cannot be deleted because the current log file is in use. - defer CloseLogging() //nolint:errcheck // We cannot do anything if this fails - - log.Printf("I! TEST 1") // Writes 31 bytes, will rotate - log.Printf("I! TEST") // Writes 29 byes, no rotation expected - - files, err := os.ReadDir(tempDir) - require.NoError(t, err) - require.Len(t, files, 2) -} - -func TestTextWriteDerivedLogger(t *testing.T) { - instance = defaultHandler() - - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - l := New("testing", "test", "") - l.Info("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z I! [testing.test] TEST\n", string(buf[19:])) -} - -func TestTextWriteDerivedLoggerWithAttributes(t *testing.T) { - instance = defaultHandler() - - tmpfile, err := os.CreateTemp("", "") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - cfg := &Config{ - Logfile: tmpfile.Name(), - LogFormat: "text", - RotationMaxArchives: -1, - Debug: true, - } - require.NoError(t, SetupLogging(cfg)) - - l := New("testing", "test", "myalias") - - // All attributes should be ignored - l.AddAttribute("alias", "foo") - l.AddAttribute("device_id", 123) - - l.Info("TEST") - - buf, err := os.ReadFile(tmpfile.Name()) - require.NoError(t, err) - require.Greater(t, len(buf), 19) - require.Equal(t, "Z I! [testing.test::myalias] TEST\n", string(buf[19:])) + anotherTempDir := t.TempDir() + + defer closeLogger(t) + + t.Run("TestTextStderr", func(t *testing.T) { + createDefaultHandler(t) + cfg := &Config{ + LogFormat: "text", + Quiet: true, + } + require.NoError(t, SetupLogging(cfg)) + logger, ok := instance.impl.(*textLogger) + require.Truef(t, ok, "logging instance is not a text-logger but %T", instance.impl) + require.Equal(t, logger.logger.Writer(), os.Stderr) + }) + + t.Run("TestTextFile", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestTextFile.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("I! TEST") + log.Printf("D! TEST") // <- should be ignored + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z I! TEST\n", string(buf[19:])) + }) + + t.Run("TestTextFileDebug", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestTextFileDebug.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("D! TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z D! TEST\n", string(buf[19:])) + }) + + t.Run("TestTextFileError", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestTextFileError.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Quiet: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("E! TEST") + log.Printf("I! TEST") // <- should be ignored + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z E! TEST\n", string(buf[19:])) + }) + + t.Run("TestTextAddDefaultLogLevel", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestTextAddDefaultLogLevel.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z I! TEST\n", string(buf[19:])) + }) + + t.Run("TestTextWriteToTruncatedFile", func(t *testing.T) { + tmpFile := filepath.Join(tempDir, "TestTextWriteToTruncatedFile.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z I! TEST\n", string(buf[19:])) + + require.NoError(t, os.Truncate(tmpFile, 0)) + + log.Printf("SHOULD BE FIRST") + + buf, err = os.ReadFile(tmpFile) + require.NoError(t, err) + require.Equal(t, "Z I! SHOULD BE FIRST\n", string(buf[19:])) + }) + + t.Run("TestTextWriteToFileInRotation", func(t *testing.T) { + cfg := &Config{ + Logfile: filepath.Join(anotherTempDir, "TestTextWriteToFileInRotation.log"), + LogFormat: "text", + RotationMaxArchives: -1, + RotationMaxSize: 30, + } + require.NoError(t, SetupLogging(cfg)) + + log.Printf("I! TEST 1") // Writes 31 bytes, will rotate + log.Printf("I! TEST") // Writes 29 byes, no rotation expected + + files, err := os.ReadDir(anotherTempDir) + require.NoError(t, err) + require.Len(t, files, 2) + }) + + t.Run("TestTextWriteDerivedLogger", func(t *testing.T) { + createDefaultHandler(t) + tmpFile := filepath.Join(tempDir, "TestTextWriteDerivedLogger.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + l := New("testing", "test", "") + l.Info("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z I! [testing.test] TEST\n", string(buf[19:])) + }) + + t.Run("TestTextWriteDerivedLoggerWithAttributes", func(t *testing.T) { + createDefaultHandler(t) + tmpFile := filepath.Join(tempDir, "TestTextWriteDerivedLoggerWithAttributes.log") + + cfg := &Config{ + Logfile: tmpFile, + LogFormat: "text", + RotationMaxArchives: -1, + Debug: true, + } + require.NoError(t, SetupLogging(cfg)) + + l := New("testing", "test", "myalias") + + // All attributes should be ignored + l.AddAttribute("alias", "foo") + l.AddAttribute("device_id", 123) + + l.Info("TEST") + + buf, err := os.ReadFile(tmpFile) + require.NoError(t, err) + require.Greater(t, len(buf), 19) + require.Equal(t, "Z I! [testing.test::myalias] TEST\n", string(buf[19:])) + }) } func BenchmarkTelegrafTextLogWrite(b *testing.B) { diff --git a/plugins/inputs/bcache/bcache_test.go b/plugins/inputs/bcache/bcache_test.go index 4ac6ffce4c23d..caa643a264e80 100644 --- a/plugins/inputs/bcache/bcache_test.go +++ b/plugins/inputs/bcache/bcache_test.go @@ -24,16 +24,14 @@ const ( ) func TestBcacheGeneratesMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-bcache") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() testBcachePath := tmpDir + "/telegraf-bcache/sys/fs/bcache" testBcacheUUIDPath := testBcachePath + "/663955a3-765a-4737-a9fd-8250a7a78411" testBcacheDevPath := tmpDir + "/telegraf/sys/devices/virtual/block/bcache0" testBcacheBackingDevPath := tmpDir + "/telegraf/sys/devices/virtual/block/md10" - err = os.MkdirAll(testBcacheUUIDPath, 0750) + err := os.MkdirAll(testBcacheUUIDPath, 0750) require.NoError(t, err) err = os.MkdirAll(testBcacheDevPath, 0750) diff --git a/plugins/inputs/conntrack/conntrack_test.go b/plugins/inputs/conntrack/conntrack_test.go index a9a853457c1ae..aa87def9c2b91 100644 --- a/plugins/inputs/conntrack/conntrack_test.go +++ b/plugins/inputs/conntrack/conntrack_test.go @@ -36,9 +36,7 @@ func TestNoFilesFound(t *testing.T) { func TestDefaultsUsed(t *testing.T) { defer restoreDflts(dfltFiles, dfltDirs) - tmpdir, err := os.MkdirTemp("", "tmp1") - require.NoError(t, err) - defer os.Remove(tmpdir) + tmpdir := t.TempDir() tmpFile, err := os.CreateTemp(tmpdir, "ip_conntrack_count") require.NoError(t, err) @@ -61,9 +59,7 @@ func TestDefaultsUsed(t *testing.T) { func TestConfigsUsed(t *testing.T) { defer restoreDflts(dfltFiles, dfltDirs) - tmpdir, err := os.MkdirTemp("", "tmp1") - require.NoError(t, err) - defer os.Remove(tmpdir) + tmpdir := t.TempDir() cntFile, err := os.CreateTemp(tmpdir, "nf_conntrack_count") require.NoError(t, err) diff --git a/plugins/inputs/dpdk/dpdk_test.go b/plugins/inputs/dpdk/dpdk_test.go index db001c7691bcc..0c49a7faf27e7 100644 --- a/plugins/inputs/dpdk/dpdk_test.go +++ b/plugins/inputs/dpdk/dpdk_test.go @@ -852,6 +852,9 @@ func createSocketForTest(t *testing.T, dirPath string) (string, net.Listener) { var pathToSocket string if len(dirPath) == 0 { + // The Maximum length of the socket path is 104/108 characters, path created with t.TempDir() is too long for some cases + // (it combines test name with subtest name and some random numbers in the path) + //nolint:usetesting // "os.MkdirTemp() could be replaced by t.TempDir() in createSocketForTest" dirPath, err = os.MkdirTemp("", "dpdk-test-socket") require.NoError(t, err) pathToSocket = filepath.Join(dirPath, dpdkSocketTemplateName) diff --git a/plugins/inputs/http_listener_v2/http_listener_v2_test.go b/plugins/inputs/http_listener_v2/http_listener_v2_test.go index b85a00c53895a..c15cd0208caa7 100644 --- a/plugins/inputs/http_listener_v2/http_listener_v2_test.go +++ b/plugins/inputs/http_listener_v2/http_listener_v2_test.go @@ -736,10 +736,10 @@ func TestServerHeaders(t *testing.T) { func TestUnixSocket(t *testing.T) { listener, err := newTestHTTPListenerV2() require.NoError(t, err) - file, err := os.CreateTemp("", "*.socket") + file, err := os.CreateTemp(t.TempDir(), "*.socket") require.NoError(t, err) require.NoError(t, file.Close()) - defer os.Remove(file.Name()) + socketName := file.Name() if runtime.GOOS == "windows" { listener.ServiceAddress = "unix:///" + socketName diff --git a/plugins/inputs/intel_baseband/intel_baseband_test.go b/plugins/inputs/intel_baseband/intel_baseband_test.go index b810b11e5a8ba..1c6a972915689 100644 --- a/plugins/inputs/intel_baseband/intel_baseband_test.go +++ b/plugins/inputs/intel_baseband/intel_baseband_test.go @@ -129,6 +129,9 @@ func (ts *tempSocket) Close() { } func newTempSocket(t *testing.T) *tempSocket { + // The Maximum length of the socket path is 104/108 characters, path created with t.TempDir() is too long for some cases + // (it combines test name with subtest name and some random numbers in the path) + //nolint:usetesting // "os.MkdirTemp() could be replaced by t.TempDir() in newTempSocket" dirPath, err := os.MkdirTemp("", "test-socket") require.NoError(t, err) @@ -160,7 +163,7 @@ func (tlf *tempLogFile) close() { } func newTempLogFile(t *testing.T) *tempLogFile { - file, err := os.CreateTemp("", "*.log") + file, err := os.CreateTemp(t.TempDir(), "*.log") require.NoError(t, err) return &tempLogFile{ diff --git a/plugins/inputs/intel_dlb/intel_dlb_test.go b/plugins/inputs/intel_dlb/intel_dlb_test.go index 051ea44cb785b..6aab3608d5f5d 100644 --- a/plugins/inputs/intel_dlb/intel_dlb_test.go +++ b/plugins/inputs/intel_dlb/intel_dlb_test.go @@ -879,7 +879,7 @@ func Test_gatherRasMetrics(t *testing.T) { func Test_rasReader(t *testing.T) { file := rasReaderImpl{} // Create unique temporary file - fileobj, err := os.CreateTemp("", "qat") + fileobj, err := os.CreateTemp(t.TempDir(), "qat") require.NoError(t, err) t.Run("tests with existing file", func(t *testing.T) { diff --git a/plugins/inputs/kernel_vmstat/kernel_vmstat_test.go b/plugins/inputs/kernel_vmstat/kernel_vmstat_test.go index 6691b9f2b85e6..8f21e84385d49 100644 --- a/plugins/inputs/kernel_vmstat/kernel_vmstat_test.go +++ b/plugins/inputs/kernel_vmstat/kernel_vmstat_test.go @@ -298,7 +298,7 @@ thp_collapse_alloc_failed 102214 thp_split abcd` func makeFakeVMStatFile(t *testing.T, content []byte) string { - tmpfile, err := os.CreateTemp("", "kernel_vmstat_test") + tmpfile, err := os.CreateTemp(t.TempDir(), "kernel_vmstat_test") require.NoError(t, err) _, err = tmpfile.Write(content) diff --git a/plugins/inputs/logparser/logparser_test.go b/plugins/inputs/logparser/logparser_test.go index 7ff9589b5d268..e0efb95317f30 100644 --- a/plugins/inputs/logparser/logparser_test.go +++ b/plugins/inputs/logparser/logparser_test.go @@ -109,18 +109,7 @@ func TestGrokParseLogFiles(t *testing.T) { } func TestGrokParseLogFilesAppearLater(t *testing.T) { - // TODO: t.TempDir will fail on Windows because it could not remove - // test.a.log file. This seems like an issue with the tail package, it - // is not closing the os.File properly on Stop. - // === RUN TestGrokParseLogFilesAppearLater - // 2022/04/16 11:05:13 D! [] Tail added for file: C:\Users\circleci\AppData\Local\Temp\TestGrokParseLogFilesAppearLater3687440534\001\test_a.log - // 2022/04/16 11:05:13 D! [] Tail dropped for file: C:\Users\circleci\AppData\Local\Temp\TestGrokParseLogFilesAppearLater3687440534\001\test_a.log - // testing.go:1090: TempDir RemoveAll cleanup: - // CreateFile C:\Users\circleci\AppData\Local\Temp\TestGrokParseLogFilesAppearLater3687440534\001: Access is denied. - // --- FAIL: TestGrokParseLogFilesAppearLater (1.68s) - emptydir, err := os.MkdirTemp("", "TestGrokParseLogFilesAppearLater") - require.NoError(t, err) - defer os.RemoveAll(emptydir) + emptydir := t.TempDir() logparser := &LogParser{ Log: testutil.Logger{}, diff --git a/plugins/inputs/lustre2/lustre2_test.go b/plugins/inputs/lustre2/lustre2_test.go index 2d7df8bec5b0f..0eeb6ad3d9743 100644 --- a/plugins/inputs/lustre2/lustre2_test.go +++ b/plugins/inputs/lustre2/lustre2_test.go @@ -172,13 +172,11 @@ disk I/O size ios % cum % | ios % cum % ` func TestLustre2GeneratesHealth(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-lustre") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() rootdir := tmpDir + "/telegraf" sysdir := rootdir + "/sys/fs/lustre/" - err = os.MkdirAll(sysdir, 0750) + err := os.MkdirAll(sysdir, 0750) require.NoError(t, err) err = os.WriteFile(sysdir+"health_check", []byte("healthy\n"), 0640) @@ -202,16 +200,14 @@ func TestLustre2GeneratesHealth(t *testing.T) { } func TestLustre2GeneratesMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-lustre") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() rootdir := tmpDir + "/telegraf" tempdir := rootdir + "/proc/fs/lustre/" ostName := "OST0001" mdtdir := tempdir + "/mdt/" - err = os.MkdirAll(mdtdir+"/"+ostName, 0750) + err := os.MkdirAll(mdtdir+"/"+ostName, 0750) require.NoError(t, err) osddir := tempdir + "/osd-ldiskfs/" @@ -273,16 +269,14 @@ func TestLustre2GeneratesMetrics(t *testing.T) { } func TestLustre2GeneratesClientMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-lustre-client") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() rootdir := tmpDir + "/telegraf" tempdir := rootdir + "/proc/fs/lustre/" ostName := "OST0001" clientName := "10.2.4.27@o2ib1" mdtdir := tempdir + "/mdt/" - err = os.MkdirAll(mdtdir+"/"+ostName+"/exports/"+clientName, 0750) + err := os.MkdirAll(mdtdir+"/"+ostName+"/exports/"+clientName, 0750) require.NoError(t, err) obddir := tempdir + "/obdfilter/" @@ -338,9 +332,7 @@ func TestLustre2GeneratesClientMetrics(t *testing.T) { } func TestLustre2GeneratesJobstatsMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-lustre-jobstats") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() rootdir := tmpDir + "/telegraf" tempdir := rootdir + "/proc/fs/lustre/" @@ -348,7 +340,7 @@ func TestLustre2GeneratesJobstatsMetrics(t *testing.T) { jobNames := []string{"cluster-testjob1", "testjob2"} mdtdir := tempdir + "/mdt/" - err = os.MkdirAll(mdtdir+"/"+ostName, 0750) + err := os.MkdirAll(mdtdir+"/"+ostName, 0750) require.NoError(t, err) obddir := tempdir + "/obdfilter/" @@ -499,16 +491,14 @@ func TestLustre2CanParseConfiguration(t *testing.T) { } func TestLustre2GeneratesBrwstatsMetrics(t *testing.T) { - tmpdir, err := os.MkdirTemp("", "telegraf-lustre-brwstats") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() rootdir := tmpdir + "/telegraf" tempdir := rootdir + "/proc/fs/lustre" ostname := "OST0001" osddir := tempdir + "/osd-ldiskfs/" - err = os.MkdirAll(osddir+"/"+ostname, 0750) + err := os.MkdirAll(osddir+"/"+ostname, 0750) require.NoError(t, err) err = os.WriteFile(osddir+"/"+ostname+"/brw_stats", []byte(brwstatsProcContents), 0640) @@ -574,9 +564,7 @@ func TestLustre2GeneratesBrwstatsMetrics(t *testing.T) { } func TestLustre2GeneratesEvictionMetrics(t *testing.T) { - rootdir, err := os.MkdirTemp("", "telegraf-lustre-evictions") - require.NoError(t, err) - defer os.RemoveAll(rootdir) + rootdir := t.TempDir() // setup files in mock sysfs type fileEntry struct { @@ -600,7 +588,7 @@ func TestLustre2GeneratesEvictionMetrics(t *testing.T) { // gather metrics m := &Lustre2{rootdir: rootdir} var acc testutil.Accumulator - err = m.Gather(&acc) + err := m.Gather(&acc) require.NoError(t, err) // compare with expectations diff --git a/plugins/inputs/socket_listener/socket_listener_test.go b/plugins/inputs/socket_listener/socket_listener_test.go index d1b191c0d6f25..18a395e44def4 100644 --- a/plugins/inputs/socket_listener/socket_listener_test.go +++ b/plugins/inputs/socket_listener/socket_listener_test.go @@ -130,10 +130,13 @@ func TestSocketListener(t *testing.T) { } // Create a socket + // The Maximum length of the socket path is 104/108 characters, path created with t.TempDir() is too long for some cases + // (it combines test name with subtest name and some random numbers in the path) + //nolint:usetesting // "os.CreateTemp("", ...) could be replaced by os.CreateTemp(t.TempDir(), ...) in TestSocketListener" sock, err := os.CreateTemp("", "sock-") require.NoError(t, err) - defer sock.Close() defer os.Remove(sock.Name()) + defer sock.Close() serverAddr = sock.Name() } @@ -277,10 +280,10 @@ func TestLargeReadBufferUnixgram(t *testing.T) { require.NoError(t, bufsize.UnmarshalText([]byte("100KiB"))) // Create a socket - sock, err := os.CreateTemp("", "sock-") + sock, err := os.CreateTemp(t.TempDir(), "sock-") require.NoError(t, err) defer sock.Close() - defer os.Remove(sock.Name()) + var serverAddr = sock.Name() // Setup plugin with a sufficient read buffer diff --git a/plugins/inputs/tail/tail_test.go b/plugins/inputs/tail/tail_test.go index a99efd5563676..2698f23375ce4 100644 --- a/plugins/inputs/tail/tail_test.go +++ b/plugins/inputs/tail/tail_test.go @@ -194,10 +194,9 @@ func TestGrokParseLogFilesWithMultiline(t *testing.T) { } func TestGrokParseLogFilesWithMultilineTimeout(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") + tmpfile, err := os.CreateTemp(t.TempDir(), "") require.NoError(t, err) defer tmpfile.Close() - defer os.Remove(tmpfile.Name()) // This seems necessary in order to get the test to read the following lines. _, err = tmpfile.WriteString("[04/Jun/2016:12:41:48 +0100] INFO HelloExample: This is fluff\r\n") @@ -605,10 +604,9 @@ func TestCharacterEncoding(t *testing.T) { } func TestTailEOF(t *testing.T) { - tmpfile, err := os.CreateTemp("", "") + tmpfile, err := os.CreateTemp(t.TempDir(), "") require.NoError(t, err) defer tmpfile.Close() - defer os.Remove(tmpfile.Name()) _, err = tmpfile.WriteString("cpu usage_idle=100\r\n") require.NoError(t, err) require.NoError(t, tmpfile.Sync()) @@ -645,10 +643,9 @@ func TestTailEOF(t *testing.T) { func TestCSVBehavior(t *testing.T) { // Prepare the input file - input, err := os.CreateTemp("", "") + input, err := os.CreateTemp(t.TempDir(), "") require.NoError(t, err) defer input.Close() - defer os.Remove(input.Name()) // Write header _, err = input.WriteString("a,b\n") require.NoError(t, err) diff --git a/plugins/inputs/x509_cert/x509_cert_test.go b/plugins/inputs/x509_cert/x509_cert_test.go index bb4f72cc14d07..b310505e7add3 100644 --- a/plugins/inputs/x509_cert/x509_cert_test.go +++ b/plugins/inputs/x509_cert/x509_cert_test.go @@ -39,11 +39,9 @@ var _ telegraf.Input = &X509Cert{} func TestGatherRemoteIntegration(t *testing.T) { t.Skip("Skipping network-dependent test due to race condition when test-all") - tmpfile, err := os.CreateTemp("", "example") + tmpfile, err := os.CreateTemp(t.TempDir(), "example") require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - _, err = tmpfile.WriteString(pki.ReadServerCert()) require.NoError(t, err) @@ -164,7 +162,7 @@ func TestGatherLocal(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - f, err := os.CreateTemp("", "x509_cert") + f, err := os.CreateTemp(t.TempDir(), "x509_cert") require.NoError(t, err) _, err = f.WriteString(test.content) @@ -176,8 +174,6 @@ func TestGatherLocal(t *testing.T) { require.NoError(t, f.Close()) - defer os.Remove(f.Name()) - sc := X509Cert{ Sources: []string{f.Name()}, Log: testutil.Logger{}, @@ -197,7 +193,7 @@ func TestGatherLocal(t *testing.T) { func TestTags(t *testing.T) { cert := fmt.Sprintf("%s\n%s", pki.ReadServerCert(), pki.ReadCACert()) - f, err := os.CreateTemp("", "x509_cert") + f, err := os.CreateTemp(t.TempDir(), "x509_cert") require.NoError(t, err) _, err = f.WriteString(cert) @@ -246,16 +242,13 @@ func TestTags(t *testing.T) { func TestGatherExcludeRootCerts(t *testing.T) { cert := fmt.Sprintf("%s\n%s", pki.ReadServerCert(), pki.ReadCACert()) - f, err := os.CreateTemp("", "x509_cert") + f, err := os.CreateTemp(t.TempDir(), "x509_cert") require.NoError(t, err) _, err = f.WriteString(cert) require.NoError(t, err) - require.NoError(t, f.Close()) - defer os.Remove(f.Name()) - sc := X509Cert{ Sources: []string{f.Name()}, ExcludeRootCerts: true, @@ -283,16 +276,13 @@ func TestGatherChain(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - f, err := os.CreateTemp("", "x509_cert") + f, err := os.CreateTemp(t.TempDir(), "x509_cert") require.NoError(t, err) _, err = f.WriteString(test.content) require.NoError(t, err) - require.NoError(t, f.Close()) - defer os.Remove(f.Name()) - sc := X509Cert{ Sources: []string{f.Name()}, Log: testutil.Logger{}, @@ -487,9 +477,7 @@ func TestServerName(t *testing.T) { func TestClassification(t *testing.T) { start := time.Now() end := time.Now().AddDate(0, 0, 1) - tmpDir, err := os.MkdirTemp("", "telegraf-x509-*") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() // Create the CA certificate caPriv, err := rsa.GenerateKey(rand.Reader, 4096) diff --git a/plugins/inputs/zfs/zfs_linux_test.go b/plugins/inputs/zfs/zfs_linux_test.go index b1e289c082e8c..7c590d6280db7 100644 --- a/plugins/inputs/zfs/zfs_linux_test.go +++ b/plugins/inputs/zfs/zfs_linux_test.go @@ -220,12 +220,9 @@ scatter_sg_table_retry 4 99221 ` func TestZfsPoolMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-zfs-pool") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) - + tmpDir := t.TempDir() testKstatPath := tmpDir + "/telegraf/proc/spl/kstat/zfs" - err = os.MkdirAll(testKstatPath, 0750) + err := os.MkdirAll(testKstatPath, 0750) require.NoError(t, err) err = os.MkdirAll(testKstatPath+"/HOME", 0750) @@ -279,12 +276,10 @@ func TestZfsPoolMetrics(t *testing.T) { } func TestZfsGeneratesMetrics(t *testing.T) { - tmpDir, err := os.MkdirTemp("", "telegraf-zfs-generates") - require.NoError(t, err) - defer os.RemoveAll(tmpDir) + tmpDir := t.TempDir() testKstatPath := tmpDir + "/telegraf/proc/spl/kstat/zfs" - err = os.MkdirAll(testKstatPath, 0750) + err := os.MkdirAll(testKstatPath, 0750) require.NoError(t, err) err = os.MkdirAll(testKstatPath, 0750) diff --git a/plugins/outputs/remotefile/remotefile_test.go b/plugins/outputs/remotefile/remotefile_test.go index cdd5b51617967..681c5e3a66e17 100644 --- a/plugins/outputs/remotefile/remotefile_test.go +++ b/plugins/outputs/remotefile/remotefile_test.go @@ -30,9 +30,7 @@ func TestStaticFileCreation(t *testing.T) { } expected := "test,source=localhost value=42i 1719410485000000000\n" - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ @@ -77,9 +75,7 @@ func TestStaticFileAppend(t *testing.T) { expected := "test,source=remotehost value=23i 1719410465000000000\n" expected += "test,source=localhost value=42i 1719410485000000000\n" - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Create a file where we want to append to f, err := os.OpenFile(filepath.Join(tmpdir, "test"), os.O_CREATE|os.O_WRONLY, 0600) @@ -174,9 +170,7 @@ func TestDynamicFiles(t *testing.T) { }, } - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ @@ -242,9 +236,7 @@ func TestCustomTemplateFunctions(t *testing.T) { expectedFilename := fmt.Sprintf("test-%d", time.Now().Year()) - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ @@ -297,9 +289,7 @@ func TestCSVSerialization(t *testing.T) { "test-b.csv": "timestamp,measurement,source,value\n1587686400,test,b,23\n", } - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ @@ -357,9 +347,7 @@ func TestForgettingFiles(t *testing.T) { ), } - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ @@ -467,9 +455,7 @@ func TestTrackingMetrics(t *testing.T) { } // Prepare the output filesystem - tmpdir, err := os.MkdirTemp("", "telegraf-remotefile-*") - require.NoError(t, err) - defer os.RemoveAll(tmpdir) + tmpdir := t.TempDir() // Setup the plugin including the serializer plugin := &File{ diff --git a/plugins/secretstores/jose/jose_test.go b/plugins/secretstores/jose/jose_test.go index 290b4028dc4f3..d18f21042a69b 100644 --- a/plugins/secretstores/jose/jose_test.go +++ b/plugins/secretstores/jose/jose_test.go @@ -57,9 +57,7 @@ func TestSetListGet(t *testing.T) { } // Create a temporary directory we can use to store the secrets - testdir, err := os.MkdirTemp("", "jose-*") - require.NoError(t, err) - defer os.RemoveAll(testdir) + testdir := t.TempDir() // Initialize the plugin plugin := &Jose{ @@ -109,9 +107,7 @@ func TestResolver(t *testing.T) { secretVal := "I won't tell" // Create a temporary directory we can use to store the secrets - testdir, err := os.MkdirTemp("", "jose-*") - require.NoError(t, err) - defer os.RemoveAll(testdir) + testdir := t.TempDir() // Initialize the plugin plugin := &Jose{ @@ -137,9 +133,7 @@ func TestResolverInvalid(t *testing.T) { secretVal := "I won't tell" // Create a temporary directory we can use to store the secrets - testdir, err := os.MkdirTemp("", "jose-*") - require.NoError(t, err) - defer os.RemoveAll(testdir) + testdir := t.TempDir() // Initialize the plugin plugin := &Jose{ @@ -163,9 +157,7 @@ func TestGetNonExistent(t *testing.T) { secretVal := "I won't tell" // Create a temporary directory we can use to store the secrets - testdir, err := os.MkdirTemp("", "jose-*") - require.NoError(t, err) - defer os.RemoveAll(testdir) + testdir := t.TempDir() // Initialize the plugin plugin := &Jose{ @@ -177,7 +169,7 @@ func TestGetNonExistent(t *testing.T) { require.NoError(t, plugin.Set(secretKey, secretVal)) // Get the resolver - _, err = plugin.Get("foo") + _, err := plugin.Get("foo") require.EqualError(t, err, "The specified item could not be found in the keyring") } @@ -186,9 +178,7 @@ func TestGetInvalidPassword(t *testing.T) { secretVal := "I won't tell" // Create a temporary directory we can use to store the secrets - testdir, err := os.MkdirTemp("", "jose-*") - require.NoError(t, err) - defer os.RemoveAll(testdir) + testdir := t.TempDir() // Initialize the stored secrets creator := &Jose{ @@ -207,6 +197,6 @@ func TestGetInvalidPassword(t *testing.T) { Path: testdir, } require.NoError(t, plugin.Init()) - _, err = plugin.Get(secretKey) + _, err := plugin.Get(secretKey) require.ErrorContains(t, err, "integrity check failed") }