mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-12-24 13:48:04 +08:00
175 lines
3.2 KiB
Go
175 lines
3.2 KiB
Go
package util
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
func TestAllocator(t *testing.T) {
|
|
allocator := NewAllocator(1000)
|
|
|
|
// 分配内存
|
|
block1 := allocator.Allocate(100)
|
|
if block1 != 0 {
|
|
t.Error("Failed to allocate memory")
|
|
}
|
|
|
|
// 分配内存
|
|
block2 := allocator.Allocate(200)
|
|
if block2 != 100 {
|
|
t.Error("Failed to allocate memory")
|
|
}
|
|
|
|
// 释放内存
|
|
allocator.Free(0, 299)
|
|
if allocator.GetFreeSize() != 999 {
|
|
t.Error("Failed to free memory")
|
|
}
|
|
allocator.Free(299, 1)
|
|
|
|
// 重新分配内存
|
|
block3 := allocator.Allocate(50)
|
|
if block3 != 0 {
|
|
t.Error("Failed to allocate memory")
|
|
}
|
|
|
|
// 释放内存
|
|
allocator.Free(0, 50)
|
|
|
|
// 分配大于剩余空间的内存
|
|
block4 := allocator.Allocate(1000)
|
|
if block4 != 0 {
|
|
t.Error("Should not allocate memory larger than available space")
|
|
}
|
|
}
|
|
|
|
func FuzzAllocator(f *testing.F) {
|
|
f.Add(100, false)
|
|
allocator := NewAllocator(65535)
|
|
var used [][2]int
|
|
var totalMalloc, totalFree int = 0, 0
|
|
f.Fuzz(func(t *testing.T, size int, alloc bool) {
|
|
free := !alloc
|
|
if size <= 0 {
|
|
return
|
|
}
|
|
t.Logf("totalFree:%d,size:%d, free:%v", totalFree, size, free)
|
|
defer func() {
|
|
t.Logf("totalMalloc:%d, totalFree:%d, freeSize:%d", totalMalloc, totalFree, allocator.GetFreeSize())
|
|
if totalMalloc-totalFree != allocator.Size-allocator.GetFreeSize() {
|
|
t.Logf("totalUsed:%d, used:%d", totalMalloc-totalFree, allocator.Size-allocator.GetFreeSize())
|
|
t.FailNow()
|
|
}
|
|
}()
|
|
if free {
|
|
if len(used) == 0 {
|
|
return
|
|
}
|
|
for _, u := range used {
|
|
if u[1] > size {
|
|
totalFree += size
|
|
t.Logf("totalFree1:%d, free:%v", totalFree, size)
|
|
allocator.Free(u[0], size)
|
|
u[1] -= size
|
|
u[0] += size
|
|
return
|
|
}
|
|
}
|
|
allocator.Free(used[0][0], used[0][1])
|
|
totalFree += used[0][1]
|
|
t.Logf("totalFree2:%d, free:%v", totalFree, used[0][1])
|
|
used = slices.Delete(used, 0, 1)
|
|
return
|
|
}
|
|
offset := allocator.Allocate(size)
|
|
if offset == -1 {
|
|
return
|
|
}
|
|
used = append(used, [2]int{offset, size})
|
|
totalMalloc += size
|
|
t.Logf("totalMalloc:%d, free:%v", totalMalloc, size)
|
|
})
|
|
}
|
|
|
|
const testData = `
|
|
- malloc: true
|
|
offset: 0
|
|
size: 16384
|
|
- malloc: false
|
|
offset: 139
|
|
size: 16245
|
|
- malloc: false
|
|
offset: 0
|
|
size: 50
|
|
- malloc: false
|
|
offset: 50
|
|
size: 31
|
|
- malloc: false
|
|
offset: 81
|
|
size: 9
|
|
- malloc: false
|
|
offset: 90
|
|
size: 26
|
|
- malloc: false
|
|
offset: 116
|
|
size: 21
|
|
- malloc: false
|
|
offset: 137
|
|
size: 2
|
|
- malloc: true
|
|
offset: 0
|
|
size: 16384
|
|
- malloc: false
|
|
offset: 277
|
|
size: 16107
|
|
- malloc: true
|
|
offset: 0
|
|
size: 16384
|
|
- malloc: false
|
|
offset: 432
|
|
size: 16229
|
|
- malloc: false
|
|
offset: 0
|
|
size: 277
|
|
- malloc: false
|
|
offset: 277
|
|
size: 58
|
|
- malloc: false
|
|
offset: 335
|
|
size: 60
|
|
- malloc: false
|
|
offset: 395
|
|
size: 9
|
|
- malloc: false
|
|
offset: 404
|
|
size: 26
|
|
- malloc: true
|
|
offset: 0
|
|
size: 16384
|
|
- malloc: false
|
|
offset: 557
|
|
size: 16259
|
|
- malloc: false
|
|
offset: 430
|
|
size: 2
|
|
`
|
|
|
|
var history []History
|
|
|
|
func init() {
|
|
yaml.Unmarshal([]byte(testData), &history)
|
|
}
|
|
|
|
func TestAllocatorUseData(t *testing.T) {
|
|
allocator := NewAllocator(65535)
|
|
for _, h := range history {
|
|
if h.Malloc {
|
|
allocator.Allocate(h.Size)
|
|
} else {
|
|
allocator.Free(h.Offset, h.Size)
|
|
}
|
|
}
|
|
}
|