| //go:build !windows | |
| // +build !windows | |
| package runconfig // import "github.com/docker/docker/runconfig" | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "os" | |
| "testing" | |
| "github.com/docker/docker/api/types/container" | |
| "github.com/docker/docker/pkg/sysinfo" | |
| "gotest.tools/v3/assert" | |
| ) | |
| func TestDecodeHostConfig(t *testing.T) { | |
| fixtures := []struct { | |
| file string | |
| }{ | |
| {"fixtures/unix/container_hostconfig_1_14.json"}, | |
| {"fixtures/unix/container_hostconfig_1_19.json"}, | |
| } | |
| for _, f := range fixtures { | |
| b, err := os.ReadFile(f.file) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| c, err := decodeHostConfig(bytes.NewReader(b)) | |
| if err != nil { | |
| t.Fatal(fmt.Errorf("Error parsing %s: %v", f, err)) | |
| } | |
| assert.Check(t, !c.Privileged) | |
| if l := len(c.Binds); l != 1 { | |
| t.Fatalf("Expected 1 bind, found %d\n", l) | |
| } | |
| if len(c.CapAdd) != 1 && c.CapAdd[0] != "NET_ADMIN" { | |
| t.Fatalf("Expected CapAdd NET_ADMIN, got %v", c.CapAdd) | |
| } | |
| if len(c.CapDrop) != 1 && c.CapDrop[0] != "NET_ADMIN" { | |
| t.Fatalf("Expected CapDrop NET_ADMIN, got %v", c.CapDrop) | |
| } | |
| } | |
| } | |
| func TestValidateResources(t *testing.T) { | |
| type resourceTest struct { | |
| ConfigCPURealtimePeriod int64 | |
| ConfigCPURealtimeRuntime int64 | |
| SysInfoCPURealtime bool | |
| ErrorExpected bool | |
| FailureMsg string | |
| } | |
| tests := []resourceTest{ | |
| { | |
| ConfigCPURealtimePeriod: 1000, | |
| ConfigCPURealtimeRuntime: 1000, | |
| SysInfoCPURealtime: true, | |
| ErrorExpected: false, | |
| FailureMsg: "Expected valid configuration", | |
| }, | |
| { | |
| ConfigCPURealtimePeriod: 5000, | |
| ConfigCPURealtimeRuntime: 5000, | |
| SysInfoCPURealtime: false, | |
| ErrorExpected: true, | |
| FailureMsg: "Expected failure when cpu-rt-period is set but kernel doesn't support it", | |
| }, | |
| { | |
| ConfigCPURealtimePeriod: 5000, | |
| ConfigCPURealtimeRuntime: 5000, | |
| SysInfoCPURealtime: false, | |
| ErrorExpected: true, | |
| FailureMsg: "Expected failure when cpu-rt-runtime is set but kernel doesn't support it", | |
| }, | |
| { | |
| ConfigCPURealtimePeriod: 5000, | |
| ConfigCPURealtimeRuntime: 10000, | |
| SysInfoCPURealtime: true, | |
| ErrorExpected: true, | |
| FailureMsg: "Expected failure when cpu-rt-runtime is greater than cpu-rt-period", | |
| }, | |
| } | |
| for _, rt := range tests { | |
| var hc container.HostConfig | |
| hc.Resources.CPURealtimePeriod = rt.ConfigCPURealtimePeriod | |
| hc.Resources.CPURealtimeRuntime = rt.ConfigCPURealtimeRuntime | |
| var si sysinfo.SysInfo | |
| si.CPURealtime = rt.SysInfoCPURealtime | |
| if err := validateResources(&hc, &si); (err != nil) != rt.ErrorExpected { | |
| t.Fatal(rt.FailureMsg, err) | |
| } | |
| } | |
| } |