Files
kopia/cli/command_logs_test.go
Julio López 0e91261c3e fix(cli): allow running quick maintenance with epoch manager (#4198)
* allow running quick maintenance with epoch manager
* run full maintenance to cleanup logs
* separate logs maintenance set params test
2024-10-28 16:04:29 -07:00

123 lines
4.3 KiB
Go

package cli_test
import (
"strings"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/kopia/kopia/internal/testutil"
"github.com/kopia/kopia/tests/testenv"
)
func TestLogsCommands(t *testing.T) {
t.Parallel()
runner := testenv.NewInProcRunner(t)
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner)
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir)
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
// one log from repository creation
e.RunAndVerifyOutputLineCount(t, 1, "logs", "list")
// verify we did not add a log
e.RunAndVerifyOutputLineCount(t, 1, "logs", "list")
e.RunAndExpectSuccess(t, "snapshot", "create", testutil.TempDirectory(t))
e.RunAndVerifyOutputLineCount(t, 2, "logs", "list")
// sleep a bit so that 3rd log is reliably last in time order even if the clock is completely
// messed up.
time.Sleep(2 * time.Second)
e.RunAndExpectSuccess(t, "snapshot", "create", testutil.TempDirectory(t))
lines := e.RunAndVerifyOutputLineCount(t, 3, "logs", "list")
firstLogID := strings.Split(lines[0], " ")[0]
secondLogID := strings.Split(lines[1], " ")[0]
thirdLogID := strings.Split(lines[2], " ")[0]
firstLogLines := e.RunAndExpectSuccess(t, "logs", "show", firstLogID)
secondLogLines := e.RunAndExpectSuccess(t, "logs", "show", secondLogID)
thirdLogLines := e.RunAndExpectSuccess(t, "logs", "show", thirdLogID)
e.RunAndExpectFailure(t, "logs", "show", "no-such-log")
lines2 := e.RunAndVerifyOutputLineCount(t, 1, "logs", "list", "-n1")
require.Equal(t, thirdLogID, strings.Split(lines2[0], " ")[0])
e.RunAndVerifyOutputLineCount(t, 0, "logs", "list", "--younger-than=1ms")
e.RunAndVerifyOutputLineCount(t, 3, "logs", "list", "--younger-than=1h")
e.RunAndVerifyOutputLineCount(t, 3, "logs", "list", "--older-than=1ms")
e.RunAndVerifyOutputLineCount(t, 0, "logs", "list", "--older-than=1h")
require.NotEqual(t, firstLogLines, secondLogLines)
require.NotEqual(t, secondLogLines, thirdLogLines)
// by default cleanup retains a lot of logs.
e.RunAndExpectSuccess(t, "logs", "cleanup")
e.RunAndVerifyOutputLineCount(t, 3, "logs", "list")
e.RunAndExpectSuccess(t, "logs", "cleanup", "--max-count=2", "--dry-run")
e.RunAndVerifyOutputLineCount(t, 3, "logs", "list")
e.RunAndExpectSuccess(t, "logs", "cleanup", "--max-count=2")
e.RunAndVerifyOutputLineCount(t, 2, "logs", "list")
e.RunAndExpectSuccess(t, "logs", "cleanup", "--max-count=1")
e.RunAndVerifyOutputLineCount(t, 1, "logs", "list")
// make sure latest log survived
e.RunAndExpectSuccess(t, "logs", "show", thirdLogID)
}
func TestLogsMaintenance(t *testing.T) {
t.Parallel()
runner := testenv.NewInProcRunner(t)
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner)
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir)
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
time.Sleep(time.Second)
e.RunAndExpectSuccess(t, "snapshot", "create", testutil.TempDirectory(t))
time.Sleep(time.Second)
e.RunAndExpectSuccess(t, "snapshot", "create", testutil.TempDirectory(t))
time.Sleep(time.Second)
e.RunAndExpectSuccess(t, "snapshot", "create", testutil.TempDirectory(t))
e.RunAndVerifyOutputLineCount(t, 4, "logs", "list")
e.RunAndExpectSuccess(t, "maintenance", "set", "--max-retained-log-count=2")
e.RunAndVerifyOutputLineCount(t, 5, "logs", "list")
e.RunAndExpectSuccess(t, "maintenance", "run", "--full")
e.RunAndVerifyOutputLineCount(t, 3, "logs", "list")
e.RunAndExpectSuccess(t, "maintenance", "set", "--max-retained-log-age=1ms")
e.RunAndVerifyOutputLineCount(t, 4, "logs", "list")
e.RunAndExpectSuccess(t, "maintenance", "run", "--full")
e.RunAndVerifyOutputLineCount(t, 1, "logs", "list")
}
func TestLogsMaintenanceSet(t *testing.T) {
t.Parallel()
runner := testenv.NewInProcRunner(t)
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, runner)
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir)
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
e.RunAndExpectSuccess(t, "maintenance", "set",
"--max-retained-log-age=22h",
"--max-retained-log-size-mb=33",
"--max-retained-log-count=44",
)
infoLines := e.RunAndExpectSuccess(t, "maintenance", "info")
require.Contains(t, infoLines, " max age of logs: 22h0m0s")
require.Contains(t, infoLines, " max total size: 34.6 MB")
require.Contains(t, infoLines, " max count: 44")
}