Skip to content

Commit c4fd1bd

Browse files
committed
explicitly cleanup files to avoid windows issue
1 parent 09016dd commit c4fd1bd

2 files changed

Lines changed: 63 additions & 64 deletions

File tree

logp/defaults_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ import (
3232
"time"
3333

3434
"github.com/stretchr/testify/assert"
35+
"github.com/stretchr/testify/require"
3536
"go.uber.org/zap/zapcore"
3637

38+
"github.com/elastic/elastic-agent-libs/file"
3739
"github.com/elastic/elastic-agent-libs/logp"
3840
)
3941

@@ -437,3 +439,64 @@ func takeAllLogsFromPath(t *testing.T, path string) []map[string]any {
437439

438440
return entries
439441
}
442+
443+
func TestLoggerRotateSymlink(t *testing.T) {
444+
dir := t.TempDir()
445+
446+
cfg := logp.DefaultConfig(logp.DefaultEnvironment)
447+
cfg.Beat = "logger"
448+
cfg.ToFiles = true
449+
cfg.Files.Path = dir
450+
cfg.Files.MaxBackups = 1
451+
cfg.Files.RotateOnStartup = false
452+
453+
logname := cfg.Beat
454+
455+
privateFileContents := []byte("original contents")
456+
privateFile := filepath.Join(dir, "private")
457+
err := os.WriteFile(privateFile, privateFileContents, 0644)
458+
require.NoError(t, err)
459+
460+
// Plant a symlink to the private file by guessing the log filename.
461+
guessedFilename := filepath.Join(dir, fmt.Sprintf("%s-%s.ndjson", logname, time.Now().Format(file.DateFormat)))
462+
err = os.Symlink(privateFile, guessedFilename)
463+
require.NoError(t, err)
464+
465+
err = logp.Configure(cfg)
466+
require.NoError(t, err)
467+
468+
logLine := "a info message"
469+
logp.L().Info(logLine)
470+
471+
// The file rotation should have detected the destination is a symlink and rotated before writing.
472+
rotatedFilename := filepath.Join(dir, fmt.Sprintf("%s-%s-1.ndjson", logname, time.Now().Format(file.DateFormat)))
473+
assertDirContents(t, dir, filepath.Base(privateFile), filepath.Base(guessedFilename), filepath.Base(rotatedFilename))
474+
475+
got, err := os.ReadFile(privateFile)
476+
require.NoError(t, err)
477+
assert.Equal(t, privateFileContents, got, "The symlink target should not have been modified")
478+
479+
got, err = os.ReadFile(rotatedFilename)
480+
require.NoError(t, err)
481+
assert.Contains(t, string(got), logLine, "The rotated file should contain the log message")
482+
483+
// Prevents a windows issue with cleaning up files still in use:
484+
// Error: TempDir RemoveAll cleanup: remove t.TempDir() The process cannot access the file because it is being used by another process.
485+
assert.NoError(t, logp.L().Close())
486+
}
487+
488+
func assertDirContents(t *testing.T, dir string, files ...string) {
489+
t.Helper()
490+
491+
f, err := os.Open(dir)
492+
if err != nil {
493+
t.Fatal(err)
494+
}
495+
496+
names, err := f.Readdirnames(-1)
497+
if err != nil {
498+
t.Fatal(err)
499+
}
500+
501+
assert.ElementsMatch(t, files, names)
502+
}

logp/logger_test.go

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,9 @@
1818
package logp
1919

2020
import (
21-
"fmt"
22-
"os"
23-
"path/filepath"
2421
"strings"
2522
"testing"
26-
"time"
2723

28-
"github.com/elastic/elastic-agent-libs/file"
2924
"github.com/stretchr/testify/assert"
3025
"github.com/stretchr/testify/require"
3126
"go.uber.org/zap"
@@ -84,62 +79,3 @@ func TestNewInMemory(t *testing.T) {
8479
assert.Contains(t, logs[3], "error_key")
8580
assert.Contains(t, logs[3], "error_val")
8681
}
87-
88-
func TestLoggerRotateSymlink(t *testing.T) {
89-
dir := t.TempDir()
90-
91-
cfg := DefaultConfig(DefaultEnvironment)
92-
cfg.Beat = "logger"
93-
cfg.ToFiles = true
94-
cfg.Files.Path = dir
95-
cfg.Files.RotateOnStartup = false
96-
97-
logname := cfg.Beat
98-
99-
privateFileContents := []byte("original contents")
100-
privateFile := filepath.Join(dir, "private")
101-
err := os.WriteFile(privateFile, privateFileContents, 0644)
102-
require.NoError(t, err)
103-
104-
// Plant a symlink to the private file by guessing the log filename.
105-
guessedFilename := filepath.Join(dir, fmt.Sprintf("%s-%s.ndjson", logname, time.Now().Format(file.DateFormat)))
106-
err = os.Symlink(privateFile, guessedFilename)
107-
require.NoError(t, err)
108-
109-
err = Configure(cfg)
110-
require.NoError(t, err)
111-
112-
logLine := "a info message"
113-
L().Info(logLine)
114-
115-
// The file rotation should have detected the destination is a symlink and rotated before writing.
116-
rotatedFilename := filepath.Join(dir, fmt.Sprintf("%s-%s-1.ndjson", logname, time.Now().Format(file.DateFormat)))
117-
assertDirContents(t, dir, filepath.Base(privateFile), filepath.Base(guessedFilename), filepath.Base(rotatedFilename))
118-
119-
got, err := os.ReadFile(privateFile)
120-
require.NoError(t, err)
121-
assert.Equal(t, privateFileContents, got, "The symlink target should not have been modified")
122-
123-
got, err = os.ReadFile(rotatedFilename)
124-
require.NoError(t, err)
125-
assert.Contains(t, string(got), logLine, "The rotated file should contain the log message")
126-
127-
// Prevent windows issues with cleaning up files still in use.
128-
assert.NoError(t, L().Close())
129-
}
130-
131-
func assertDirContents(t *testing.T, dir string, files ...string) {
132-
t.Helper()
133-
134-
f, err := os.Open(dir)
135-
if err != nil {
136-
t.Fatal(err)
137-
}
138-
139-
names, err := f.Readdirnames(-1)
140-
if err != nil {
141-
t.Fatal(err)
142-
}
143-
144-
assert.ElementsMatch(t, files, names)
145-
}

0 commit comments

Comments
 (0)