package metrics
import (
"os"
"path/filepath"
"testing"
"time"
"github.com/go-kit/log"
"github.com/grafana/agent/pkg/metrics/instance"
"github.com/stretchr/testify/require"
)
func TestWALCleaner_getAllStorageNoRoot(t *testing.T) {
walRoot := filepath.Join(os.TempDir(), "getAllStorageNoRoot")
logger := log.NewLogfmtLogger(os.Stderr)
cleaner := NewWALCleaner(
logger,
&instance.MockManager{},
walRoot,
DefaultCleanupAge,
DefaultCleanupPeriod,
)
wals := cleaner.getAllStorage()
require.Empty(t, wals)
}
func TestWALCleaner_getAllStorageSuccess(t *testing.T) {
walRoot := t.TempDir()
walDir := filepath.Join(walRoot, "instance-1")
err := os.MkdirAll(walDir, 0755)
require.NoError(t, err)
logger := log.NewLogfmtLogger(os.Stderr)
cleaner := NewWALCleaner(
logger,
&instance.MockManager{},
walRoot,
DefaultCleanupAge,
DefaultCleanupPeriod,
)
wals := cleaner.getAllStorage()
require.Equal(t, []string{walDir}, wals)
}
func TestWALCleaner_getAbandonedStorageBeforeCutoff(t *testing.T) {
walRoot := t.TempDir()
walDir := filepath.Join(walRoot, "instance-1")
err := os.MkdirAll(walDir, 0755)
require.NoError(t, err)
all := []string{walDir}
managed := make(map[string]bool)
now := time.Now()
logger := log.NewLogfmtLogger(os.Stderr)
cleaner := NewWALCleaner(
logger,
&instance.MockManager{},
walRoot,
5*time.Minute,
DefaultCleanupPeriod,
)
cleaner.walLastModified = func(path string) (time.Time, error) {
return now, nil
}
abandoned := cleaner.getAbandonedStorage(all, managed, now)
require.Empty(t, abandoned)
}
func TestWALCleaner_getAbandonedStorageAfterCutoff(t *testing.T) {
walRoot := t.TempDir()
walDir := filepath.Join(walRoot, "instance-1")
err := os.MkdirAll(walDir, 0755)
require.NoError(t, err)
all := []string{walDir}
managed := make(map[string]bool)
now := time.Now()
logger := log.NewLogfmtLogger(os.Stderr)
cleaner := NewWALCleaner(
logger,
&instance.MockManager{},
walRoot,
5*time.Minute,
DefaultCleanupPeriod,
)
cleaner.walLastModified = func(path string) (time.Time, error) {
return now.Add(-30 * time.Minute), nil
}
abandoned := cleaner.getAbandonedStorage(all, managed, now)
require.Equal(t, []string{walDir}, abandoned)
}
func TestWALCleaner_cleanup(t *testing.T) {
walRoot := t.TempDir()
walDir := filepath.Join(walRoot, "instance-1")
err := os.MkdirAll(walDir, 0755)
require.NoError(t, err)
now := time.Now()
logger := log.NewLogfmtLogger(os.Stderr)
manager := &instance.MockManager{}
manager.ListInstancesFunc = func() map[string]instance.ManagedInstance {
return make(map[string]instance.ManagedInstance)
}
cleaner := NewWALCleaner(
logger,
manager,
walRoot,
5*time.Minute,
DefaultCleanupPeriod,
)
cleaner.walLastModified = func(path string) (time.Time, error) {
return now.Add(-30 * time.Minute), nil
}
cleaner.cleanup()
_, err = os.Stat(walDir)
require.Error(t, err)
require.True(t, os.IsNotExist(err))
}