Merge pull request #98910 from lala123912/test_api

organize apis unit tests into subtests
This commit is contained in:
Kubernetes Prow Robot 2021-02-09 06:53:13 -08:00 committed by GitHub
commit c304418b54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -28,11 +28,11 @@ import (
func TestValidateResourceRequirements(t *testing.T) { func TestValidateResourceRequirements(t *testing.T) {
successCase := []struct { successCase := []struct {
Name string name string
requirements v1.ResourceRequirements requirements v1.ResourceRequirements
}{ }{
{ {
Name: "Resources with Requests equal to Limits", name: "Resources with Requests equal to Limits",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
@ -45,7 +45,7 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
}, },
{ {
Name: "Resources with only Limits", name: "Resources with only Limits",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Limits: v1.ResourceList{ Limits: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
@ -55,7 +55,7 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
}, },
{ {
Name: "Resources with only Requests", name: "Resources with only Requests",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
@ -65,7 +65,7 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
}, },
{ {
Name: "Resources with Requests Less Than Limits", name: "Resources with Requests Less Than Limits",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("9"), v1.ResourceName(v1.ResourceCPU): resource.MustParse("9"),
@ -81,17 +81,19 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
} }
for _, tc := range successCase { for _, tc := range successCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) != 0 { if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs) t.Errorf("unexpected error: %v", errs)
} }
})
} }
errorCase := []struct { errorCase := []struct {
Name string name string
requirements v1.ResourceRequirements requirements v1.ResourceRequirements
}{ }{
{ {
Name: "Resources with Requests Larger Than Limits", name: "Resources with Requests Larger Than Limits",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"), v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
@ -106,7 +108,7 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
}, },
{ {
Name: "Invalid Resources with Requests", name: "Invalid Resources with Requests",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName("my.org"): resource.MustParse("10m"), v1.ResourceName("my.org"): resource.MustParse("10m"),
@ -114,7 +116,7 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
}, },
{ {
Name: "Invalid Resources with Limits", name: "Invalid Resources with Limits",
requirements: v1.ResourceRequirements{ requirements: v1.ResourceRequirements{
Limits: v1.ResourceList{ Limits: v1.ResourceList{
v1.ResourceName("my.org"): resource.MustParse("9m"), v1.ResourceName("my.org"): resource.MustParse("9m"),
@ -123,65 +125,71 @@ func TestValidateResourceRequirements(t *testing.T) {
}, },
} }
for _, tc := range errorCase { for _, tc := range errorCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) == 0 { if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name) t.Errorf("expected error")
} }
})
} }
} }
func TestValidateContainerResourceName(t *testing.T) { func TestValidateContainerResourceName(t *testing.T) {
successCase := []struct { successCase := []struct {
Name string name string
ResourceName string ResourceName string
}{ }{
{ {
Name: "CPU resource", name: "CPU resource",
ResourceName: "cpu", ResourceName: "cpu",
}, },
{ {
Name: "Memory resource", name: "Memory resource",
ResourceName: "memory", ResourceName: "memory",
}, },
{ {
Name: "Hugepages resource", name: "Hugepages resource",
ResourceName: "hugepages-2Mi", ResourceName: "hugepages-2Mi",
}, },
{ {
Name: "Namespaced resource", name: "Namespaced resource",
ResourceName: "kubernetes.io/resource-foo", ResourceName: "kubernetes.io/resource-foo",
}, },
{ {
Name: "Extended Resource", name: "Extended Resource",
ResourceName: "my.org/resource-bar", ResourceName: "my.org/resource-bar",
}, },
} }
for _, tc := range successCase { for _, tc := range successCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) != 0 { if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs) t.Errorf("unexpected error: %v", errs)
} }
})
} }
errorCase := []struct { errorCase := []struct {
Name string name string
ResourceName string ResourceName string
}{ }{
{ {
Name: "Invalid standard resource", name: "Invalid standard resource",
ResourceName: "cpu-core", ResourceName: "cpu-core",
}, },
{ {
Name: "Invalid namespaced resource", name: "Invalid namespaced resource",
ResourceName: "kubernetes.io/", ResourceName: "kubernetes.io/",
}, },
{ {
Name: "Invalid extended resource", name: "Invalid extended resource",
ResourceName: "my.org-foo-resource", ResourceName: "my.org-foo-resource",
}, },
} }
for _, tc := range errorCase { for _, tc := range errorCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) == 0 { if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name) t.Errorf("expected error")
} }
})
} }
} }
@ -198,40 +206,40 @@ func TestValidatePodLogOptions(t *testing.T) {
) )
successCase := []struct { successCase := []struct {
Name string name string
podLogOptions v1.PodLogOptions podLogOptions v1.PodLogOptions
}{ }{
{ {
Name: "Empty PodLogOptions", name: "Empty PodLogOptions",
podLogOptions: v1.PodLogOptions{}, podLogOptions: v1.PodLogOptions{},
}, },
{ {
Name: "PodLogOptions with TailLines", name: "PodLogOptions with TailLines",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
TailLines: &positiveLine, TailLines: &positiveLine,
}, },
}, },
{ {
Name: "PodLogOptions with LimitBytes", name: "PodLogOptions with LimitBytes",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
}, },
}, },
{ {
Name: "PodLogOptions with only sinceSeconds", name: "PodLogOptions with only sinceSeconds",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
SinceSeconds: &sinceSecondsGreaterThan1, SinceSeconds: &sinceSecondsGreaterThan1,
}, },
}, },
{ {
Name: "PodLogOptions with LimitBytes with TailLines", name: "PodLogOptions with LimitBytes with TailLines",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
TailLines: &positiveLine, TailLines: &positiveLine,
}, },
}, },
{ {
Name: "PodLogOptions with LimitBytes with TailLines with SinceSeconds", name: "PodLogOptions with LimitBytes with TailLines with SinceSeconds",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
TailLines: &positiveLine, TailLines: &positiveLine,
@ -240,17 +248,19 @@ func TestValidatePodLogOptions(t *testing.T) {
}, },
} }
for _, tc := range successCase { for _, tc := range successCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) != 0 { if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs) t.Errorf("unexpected error: %v", errs)
} }
})
} }
errorCase := []struct { errorCase := []struct {
Name string name string
podLogOptions v1.PodLogOptions podLogOptions v1.PodLogOptions
}{ }{
{ {
Name: "Invalid podLogOptions with Negative TailLines", name: "Invalid podLogOptions with Negative TailLines",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine, TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
@ -258,7 +268,7 @@ func TestValidatePodLogOptions(t *testing.T) {
}, },
}, },
{ {
Name: "Invalid podLogOptions with zero or negative LimitBytes", name: "Invalid podLogOptions with zero or negative LimitBytes",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
TailLines: &positiveLine, TailLines: &positiveLine,
LimitBytes: &limitBytesLessThan1, LimitBytes: &limitBytesLessThan1,
@ -266,14 +276,14 @@ func TestValidatePodLogOptions(t *testing.T) {
}, },
}, },
{ {
Name: "Invalid podLogOptions with zero or negative SinceSeconds", name: "Invalid podLogOptions with zero or negative SinceSeconds",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine, TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
SinceSeconds: &sinceSecondsLessThan1, SinceSeconds: &sinceSecondsLessThan1,
}, },
}, { }, {
Name: "Invalid podLogOptions with both SinceSeconds and SinceTime set", name: "Invalid podLogOptions with both SinceSeconds and SinceTime set",
podLogOptions: v1.PodLogOptions{ podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine, TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1, LimitBytes: &limitBytesGreaterThan1,
@ -283,20 +293,23 @@ func TestValidatePodLogOptions(t *testing.T) {
}, },
} }
for _, tc := range errorCase { for _, tc := range errorCase {
t.Run(tc.name, func(t *testing.T) {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) == 0 { if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name) t.Errorf("expected error")
} }
})
} }
} }
func TestAccumulateUniqueHostPorts(t *testing.T) { func TestAccumulateUniqueHostPorts(t *testing.T) {
successCase := []struct { successCase := []struct {
name string
containers []v1.Container containers []v1.Container
accumulator *sets.String accumulator *sets.String
fldPath *field.Path fldPath *field.Path
result string
}{ }{
{ {
name: "HostPort is not allocated while containers use the same port with different protocol",
containers: []v1.Container{ containers: []v1.Container{
{ {
Ports: []v1.ContainerPort{ Ports: []v1.ContainerPort{
@ -317,9 +330,9 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
}, },
accumulator: &sets.String{}, accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"), fldPath: field.NewPath("spec", "containers"),
result: "HostPort is not allocated",
}, },
{ {
name: "HostPort is not allocated while containers use different ports",
containers: []v1.Container{ containers: []v1.Container{
{ {
Ports: []v1.ContainerPort{ Ports: []v1.ContainerPort{
@ -340,21 +353,23 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
}, },
accumulator: &sets.String{}, accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"), fldPath: field.NewPath("spec", "containers"),
result: "HostPort is not allocated",
}, },
} }
for index, tc := range successCase { for _, tc := range successCase {
t.Run(tc.name, func(t *testing.T) {
if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) != 0 { if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) != 0 {
t.Errorf("unexpected error for test case %v: %v", index, errs) t.Errorf("unexpected error: %v", errs)
} }
})
} }
errorCase := []struct { errorCase := []struct {
name string
containers []v1.Container containers []v1.Container
accumulator *sets.String accumulator *sets.String
fldPath *field.Path fldPath *field.Path
result string
}{ }{
{ {
name: "HostPort is already allocated while containers use the same port with UDP",
containers: []v1.Container{ containers: []v1.Container{
{ {
Ports: []v1.ContainerPort{ Ports: []v1.ContainerPort{
@ -375,9 +390,9 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
}, },
accumulator: &sets.String{}, accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"), fldPath: field.NewPath("spec", "containers"),
result: "HostPort is already allocated",
}, },
{ {
name: "HostPort is already allocated",
containers: []v1.Container{ containers: []v1.Container{
{ {
Ports: []v1.ContainerPort{ Ports: []v1.ContainerPort{
@ -398,12 +413,13 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
}, },
accumulator: &sets.String{"8080/UDP": sets.Empty{}}, accumulator: &sets.String{"8080/UDP": sets.Empty{}},
fldPath: field.NewPath("spec", "containers"), fldPath: field.NewPath("spec", "containers"),
result: "HostPort is already allocated",
}, },
} }
for index, tc := range errorCase { for _, tc := range errorCase {
t.Run(tc.name, func(t *testing.T) {
if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) == 0 { if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) == 0 {
t.Errorf("test case %v: expected error %v, but get nil", index, tc.result) t.Errorf("expected error, but get nil")
} }
})
} }
} }