Files

78 lines
1.6 KiB
Go

package main
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestCleanCacheOldestAndSymlink(t *testing.T) {
root := t.TempDir()
outside := t.TempDir()
now := time.Now()
create := func(path string, size int64, age time.Duration) {
t.Helper()
f, e := os.Create(path)
if e != nil {
t.Fatal(e)
}
if e = f.Truncate(size); e != nil {
t.Fatal(e)
}
f.Close()
m := now.Add(-age)
if e = os.Chtimes(path, m, m); e != nil {
t.Fatal(e)
}
}
old := filepath.Join(root, "old")
newer := filepath.Join(root, "newer")
active := filepath.Join(root, "active")
target := filepath.Join(outside, "keep")
create(old, 10<<20, time.Hour)
create(newer, 8<<20, time.Minute)
create(active, 1<<20, 0)
create(target, 1, time.Hour)
if e := os.Symlink(target, filepath.Join(root, "link")); e != nil {
t.Fatal(e)
}
if e := cleanCache(root, now); e != nil {
t.Fatal(e)
}
if _, e := os.Stat(old); !os.IsNotExist(e) {
t.Fatalf("old file still exists: %v", e)
}
for _, p := range []string{newer, active, target} {
if _, e := os.Stat(p); e != nil {
t.Fatal(e)
}
}
}
func TestCleanCacheProtectsRecentAndRejectsSymlinkRoot(t *testing.T) {
root := t.TempDir()
path := filepath.Join(root, "active")
f, e := os.Create(path)
if e != nil {
t.Fatal(e)
}
if e = f.Truncate(20 << 20); e != nil {
t.Fatal(e)
}
f.Close()
if e = cleanCache(root, time.Now()); e != nil {
t.Fatal(e)
}
if _, e = os.Stat(path); e != nil {
t.Fatal(e)
}
link := filepath.Join(t.TempDir(), "link")
if e = os.Symlink(root, link); e != nil {
t.Fatal(e)
}
if e = cleanCache(link, time.Now()); e == nil {
t.Fatal("symlink root accepted")
}
}