78 lines
1.6 KiB
Go
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")
|
|
}
|
|
}
|