mirror of
https://github.com/datarhei/core.git
synced 2025-10-16 13:00:37 +08:00
Make resource manager a main module and expose more details
This commit is contained in:
167
resources/resources_test.go
Normal file
167
resources/resources_test.go
Normal file
@@ -0,0 +1,167 @@
|
||||
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) 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) 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)
|
||||
}
|
Reference in New Issue
Block a user