Files
core/resources/resources_test.go
2024-07-16 08:14:19 +02:00

208 lines
3.1 KiB
Go

package resources
import (
"sync"
"testing"
"time"
"github.com/datarhei/core/v16/psutil"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/net"
"github.com/stretchr/testify/require"
)
type util struct{}
func (u *util) Start() {}
func (u *util) Stop() {}
func (u *util) CPUCounts(logical bool) (float64, error) {
return 2, nil
}
func (u *util) GPUCounts() (float64, error) {
return 0, nil
}
func (u *util) CPUPercent() (*psutil.CPUInfoStat, error) {
return &psutil.CPUInfoStat{
System: 10,
User: 50,
Idle: 35,
Other: 5,
}, nil
}
func (u *util) DiskUsage(path string) (*disk.UsageStat, error) {
return &disk.UsageStat{}, nil
}
func (u *util) VirtualMemory() (*psutil.MemoryInfoStat, error) {
return &psutil.MemoryInfoStat{
Total: 200,
Available: 40,
Used: 160,
}, nil
}
func (u *util) NetIOCounters(pernic bool) ([]net.IOCountersStat, error) {
return nil, nil
}
func (u *util) GPUStats() ([]psutil.GPUInfoStat, error) {
return nil, nil
}
func (u *util) Process(pid int32) (psutil.Process, error) {
return nil, nil
}
func TestMemoryLimit(t *testing.T) {
r, err := New(Config{
MaxCPU: 100,
MaxMemory: 150. / 200. * 100,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
wg := sync.WaitGroup{}
wg.Add(1)
limit := false
go func() {
defer func() {
wg.Done()
}()
timer := time.NewTimer(10 * time.Second)
defer timer.Stop()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
_, limit = r.ShouldLimit()
if limit {
return
}
case <-timer.C:
return
}
}
}()
r.Start()
wg.Wait()
require.True(t, limit)
r.Stop()
}
func TestCPULimit(t *testing.T) {
r, err := New(Config{
MaxCPU: 50.,
MaxMemory: 100,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
wg := sync.WaitGroup{}
wg.Add(1)
limit := false
go func() {
defer func() {
wg.Done()
}()
timer := time.NewTimer(10 * time.Second)
defer timer.Stop()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
limit, _ = r.ShouldLimit()
if limit {
return
}
case <-timer.C:
return
}
}
}()
r.Start()
wg.Wait()
require.True(t, limit)
r.Stop()
}
func TestRequest(t *testing.T) {
r, err := New(Config{
MaxCPU: 70.,
MaxMemory: 170. / 200. * 100,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
err = r.Request(-1, 0)
require.Error(t, err)
err = r.Request(5, 10)
require.NoError(t, err)
err = r.Request(5, 20)
require.Error(t, err)
err = r.Request(10, 10)
require.NoError(t, err)
}
func TestHasLimits(t *testing.T) {
r, err := New(Config{
MaxCPU: 70.,
MaxMemory: 170. / 200. * 100,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
require.True(t, r.HasLimits())
r, err = New(Config{
MaxCPU: 100,
MaxMemory: 100,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
require.True(t, r.HasLimits())
r, err = New(Config{
MaxCPU: 0,
MaxMemory: 0,
PSUtil: &util{},
Logger: nil,
})
require.NoError(t, err)
require.False(t, r.HasLimits())
}