1package logging
2
3import (
4	"io/ioutil"
5	"os"
6	"path/filepath"
7	"sort"
8	"testing"
9	"time"
10
11	"github.com/stretchr/testify/require"
12
13	"github.com/hashicorp/consul/sdk/testutil"
14)
15
16func TestLogFile_Rotation_MaxDuration(t *testing.T) {
17	if testing.Short() {
18		t.Skip("too slow for testing.Short")
19	}
20
21	tempDir := testutil.TempDir(t, "")
22	logFile := LogFile{
23		fileName: "consul.log",
24		logPath:  tempDir,
25		duration: 50 * time.Millisecond,
26	}
27
28	logFile.Write([]byte("Hello World"))
29	time.Sleep(3 * logFile.duration)
30	logFile.Write([]byte("Second File"))
31	require.Len(t, listDir(t, tempDir), 2)
32}
33
34func TestLogFile_openNew(t *testing.T) {
35	logFile := LogFile{
36		fileName: "consul.log",
37		logPath:  testutil.TempDir(t, ""),
38		duration: defaultRotateDuration,
39	}
40	err := logFile.openNew()
41	require.NoError(t, err)
42
43	msg := "[INFO] Something"
44	_, err = logFile.Write([]byte(msg))
45	require.NoError(t, err)
46
47	content, err := ioutil.ReadFile(logFile.FileInfo.Name())
48	require.NoError(t, err)
49	require.Contains(t, string(content), msg)
50}
51
52func TestLogFile_Rotation_MaxBytes(t *testing.T) {
53	tempDir := testutil.TempDir(t, "LogWriterBytes")
54	logFile := LogFile{
55		fileName: "somefile.log",
56		logPath:  tempDir,
57		MaxBytes: 10,
58		duration: defaultRotateDuration,
59	}
60	logFile.Write([]byte("Hello World"))
61	logFile.Write([]byte("Second File"))
62	require.Len(t, listDir(t, tempDir), 2)
63}
64
65func TestLogFile_PruneFiles(t *testing.T) {
66	tempDir := testutil.TempDir(t, t.Name())
67	logFile := LogFile{
68		fileName: "consul.log",
69		logPath:  tempDir,
70		MaxBytes: 10,
71		duration: defaultRotateDuration,
72		MaxFiles: 1,
73	}
74	logFile.Write([]byte("[INFO] Hello World"))
75	logFile.Write([]byte("[INFO] Second File"))
76	logFile.Write([]byte("[INFO] Third File"))
77
78	logFiles := listDir(t, tempDir)
79	sort.Strings(logFiles)
80	require.Len(t, logFiles, 2)
81
82	content, err := ioutil.ReadFile(filepath.Join(tempDir, logFiles[0]))
83	require.NoError(t, err)
84	require.Contains(t, string(content), "Second File")
85
86	content, err = ioutil.ReadFile(filepath.Join(tempDir, logFiles[1]))
87	require.NoError(t, err)
88	require.Contains(t, string(content), "Third File")
89}
90
91func TestLogFile_PruneFiles_Disabled(t *testing.T) {
92	tempDir := testutil.TempDir(t, t.Name())
93	logFile := LogFile{
94		fileName: "somename.log",
95		logPath:  tempDir,
96		MaxBytes: 10,
97		duration: defaultRotateDuration,
98		MaxFiles: 0,
99	}
100	logFile.Write([]byte("[INFO] Hello World"))
101	logFile.Write([]byte("[INFO] Second File"))
102	logFile.Write([]byte("[INFO] Third File"))
103	require.Len(t, listDir(t, tempDir), 3)
104}
105
106func TestLogFile_FileRotation_Disabled(t *testing.T) {
107	tempDir := testutil.TempDir(t, t.Name())
108	logFile := LogFile{
109		fileName: "consul.log",
110		logPath:  tempDir,
111		MaxBytes: 10,
112		MaxFiles: -1,
113	}
114	logFile.Write([]byte("[INFO] Hello World"))
115	logFile.Write([]byte("[INFO] Second File"))
116	logFile.Write([]byte("[INFO] Third File"))
117	require.Len(t, listDir(t, tempDir), 1)
118}
119
120func listDir(t *testing.T, name string) []string {
121	t.Helper()
122	fh, err := os.Open(name)
123	require.NoError(t, err)
124	files, err := fh.Readdirnames(100)
125	require.NoError(t, err)
126	return files
127}
128