blob: 8e41a155061231510b825be79ad73828cbc1abac [file] [edit]
//go:build !windows
package runconfig
import (
"testing"
cerrdefs "github.com/containerd/errdefs"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/v2/pkg/sysinfo"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
)
func TestValidateResources(t *testing.T) {
type resourceTest struct {
doc string
resources container.Resources
sysInfoCPURealtime bool
sysInfoCPUShares bool
expectedError string
}
tests := []resourceTest{
{
doc: "empty configuration",
},
{
doc: "valid configuration",
resources: container.Resources{
CPURealtimePeriod: 1000,
CPURealtimeRuntime: 1000,
},
sysInfoCPURealtime: true,
},
{
doc: "cpu-rt-period not supported",
resources: container.Resources{
CPURealtimePeriod: 5000,
},
expectedError: "kernel does not support CPU real-time scheduler",
},
{
doc: "cpu-rt-runtime not supported",
resources: container.Resources{
CPURealtimeRuntime: 5000,
},
expectedError: "kernel does not support CPU real-time scheduler",
},
{
doc: "cpu-rt-runtime greater than cpu-rt-period",
resources: container.Resources{
CPURealtimePeriod: 5000,
CPURealtimeRuntime: 10000,
},
sysInfoCPURealtime: true,
expectedError: "cpu real-time runtime cannot be higher than cpu real-time period",
},
{
doc: "negative CPU shares",
resources: container.Resources{
CPUShares: -1,
},
sysInfoCPUShares: true,
expectedError: "invalid CPU shares (-1): value must be a positive integer",
},
}
for _, tc := range tests {
t.Run(tc.doc, func(t *testing.T) {
var hc container.HostConfig
hc.Resources = tc.resources
var si sysinfo.SysInfo
si.CPURealtime = tc.sysInfoCPURealtime
si.CPUShares = tc.sysInfoCPUShares
err := validateResources(&hc, &si)
if tc.expectedError != "" {
assert.Check(t, is.ErrorType(err, cerrdefs.IsInvalidArgument))
assert.Check(t, is.Error(err, tc.expectedError))
} else {
assert.NilError(t, err)
}
})
}
}