package gc import ( "fmt" "s1d3sw1ped/SteamCache2/vfs" "s1d3sw1ped/SteamCache2/vfs/memory" "sort" "testing" "golang.org/x/exp/rand" ) func TestGCSmallRandom(t *testing.T) { t.Parallel() m := memory.New(1024 * 1024 * 16) gc := New(m, 10, func(vfs vfs.VFS, size uint) (uint, uint) { deletions := 0 var reclaimed uint t.Logf("GC starting to reclaim %d bytes", size) stats := vfs.StatAll() sort.Slice(stats, func(i, j int) bool { // Sort by access time so we can remove the oldest files first. return stats[i].AccessTime().Before(stats[j].AccessTime()) }) // Delete the oldest files until we've reclaimed enough space. for _, s := range stats { sz := uint(s.Size()) // Get the size of the file err := vfs.Delete(s.Name()) if err != nil { panic(err) } reclaimed += sz // Track how much space we've reclaimed deletions++ // Track how many files we've deleted // t.Logf("GC deleting %s, %v", s.Name(), s.AccessTime().Format(time.RFC3339Nano)) if reclaimed >= size { // We've reclaimed enough space break } } return uint(reclaimed), uint(deletions) }) for i := 0; i < 10000; i++ { if err := gc.Set(fmt.Sprintf("key:%d", i), genRandomData(1024*1, 1024*4)); err != nil { t.Errorf("Set failed: %v", err) } } if gc.Size() > 1024*1024*16 { t.Errorf("MemoryFS size is %d, want <= 1024", m.Size()) } } func genRandomData(min int, max int) []byte { data := make([]byte, rand.Intn(max-min)+min) rand.Read(data) return data } func TestGCLargeRandom(t *testing.T) { t.Parallel() m := memory.New(1024 * 1024 * 16) // 16MB gc := New(m, 10, func(vfs vfs.VFS, size uint) (uint, uint) { deletions := 0 var reclaimed uint t.Logf("GC starting to reclaim %d bytes", size) stats := vfs.StatAll() sort.Slice(stats, func(i, j int) bool { // Sort by access time so we can remove the oldest files first. return stats[i].AccessTime().Before(stats[j].AccessTime()) }) // Delete the oldest files until we've reclaimed enough space. for _, s := range stats { sz := uint(s.Size()) // Get the size of the file vfs.Delete(s.Name()) reclaimed += sz // Track how much space we've reclaimed deletions++ // Track how many files we've deleted if reclaimed >= size { // We've reclaimed enough space break } } return uint(reclaimed), uint(deletions) }) for i := 0; i < 10000; i++ { if err := gc.Set(fmt.Sprintf("key:%d", i), genRandomData(1024, 1024*1024)); err != nil { t.Errorf("Set failed: %v", err) } } if gc.Size() > 1024*1024*16 { t.Errorf("MemoryFS size is %d, want <= 1024", m.Size()) } }