Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

organize apis unit tests into subtests #98910

Merged
merged 1 commit into from Feb 9, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
142 changes: 79 additions & 63 deletions pkg/apis/core/v1/validation/validation_test.go
Expand Up @@ -28,11 +28,11 @@ import (

func TestValidateResourceRequirements(t *testing.T) {
successCase := []struct {
Name string
name string
requirements v1.ResourceRequirements
}{
{
Name: "Resources with Requests equal to Limits",
name: "Resources with Requests equal to Limits",
requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
Expand All @@ -45,7 +45,7 @@ func TestValidateResourceRequirements(t *testing.T) {
},
},
{
Name: "Resources with only Limits",
name: "Resources with only Limits",
requirements: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
Expand All @@ -55,7 +55,7 @@ func TestValidateResourceRequirements(t *testing.T) {
},
},
{
Name: "Resources with only Requests",
name: "Resources with only Requests",
requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
Expand All @@ -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{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("9"),
Expand All @@ -81,17 +81,19 @@ func TestValidateResourceRequirements(t *testing.T) {
},
}
for _, tc := range successCase {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) != 0 {
t.Errorf("unexpected error: %v", errs)
}
})
}

errorCase := []struct {
Name string
name string
requirements v1.ResourceRequirements
}{
{
Name: "Resources with Requests Larger Than Limits",
name: "Resources with Requests Larger Than Limits",
requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceCPU): resource.MustParse("10"),
Expand All @@ -106,15 +108,15 @@ func TestValidateResourceRequirements(t *testing.T) {
},
},
{
Name: "Invalid Resources with Requests",
name: "Invalid Resources with Requests",
requirements: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceName("my.org"): resource.MustParse("10m"),
},
},
},
{
Name: "Invalid Resources with Limits",
name: "Invalid Resources with Limits",
requirements: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceName("my.org"): resource.MustParse("9m"),
Expand All @@ -123,65 +125,71 @@ func TestValidateResourceRequirements(t *testing.T) {
},
}
for _, tc := range errorCase {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateResourceRequirements(&tc.requirements, field.NewPath("resources")); len(errs) == 0 {
t.Errorf("expected error")
}
})
}
}

func TestValidateContainerResourceName(t *testing.T) {
successCase := []struct {
Name string
name string
ResourceName string
}{
{
Name: "CPU resource",
name: "CPU resource",
ResourceName: "cpu",
},
{
Name: "Memory resource",
name: "Memory resource",
ResourceName: "memory",
},
{
Name: "Hugepages resource",
name: "Hugepages resource",
ResourceName: "hugepages-2Mi",
},
{
Name: "Namespaced resource",
name: "Namespaced resource",
ResourceName: "kubernetes.io/resource-foo",
},
{
Name: "Extended Resource",
name: "Extended Resource",
ResourceName: "my.org/resource-bar",
},
}
for _, tc := range successCase {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) != 0 {
t.Errorf("unexpected error: %v", errs)
}
})
}

errorCase := []struct {
Name string
name string
ResourceName string
}{
{
Name: "Invalid standard resource",
name: "Invalid standard resource",
ResourceName: "cpu-core",
},
{
Name: "Invalid namespaced resource",
name: "Invalid namespaced resource",
ResourceName: "kubernetes.io/",
},
{
Name: "Invalid extended resource",
name: "Invalid extended resource",
ResourceName: "my.org-foo-resource",
},
}
for _, tc := range errorCase {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidateContainerResourceName(tc.ResourceName, field.NewPath(tc.ResourceName)); len(errs) == 0 {
t.Errorf("expected error")
}
})
}
}

Expand All @@ -198,40 +206,40 @@ func TestValidatePodLogOptions(t *testing.T) {
)

successCase := []struct {
Name string
name string
podLogOptions v1.PodLogOptions
}{
{
Name: "Empty PodLogOptions",
name: "Empty PodLogOptions",
podLogOptions: v1.PodLogOptions{},
},
{
Name: "PodLogOptions with TailLines",
name: "PodLogOptions with TailLines",
podLogOptions: v1.PodLogOptions{
TailLines: &positiveLine,
},
},
{
Name: "PodLogOptions with LimitBytes",
name: "PodLogOptions with LimitBytes",
podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1,
},
},
{
Name: "PodLogOptions with only sinceSeconds",
name: "PodLogOptions with only sinceSeconds",
podLogOptions: v1.PodLogOptions{
SinceSeconds: &sinceSecondsGreaterThan1,
},
},
{
Name: "PodLogOptions with LimitBytes with TailLines",
name: "PodLogOptions with LimitBytes with TailLines",
podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1,
TailLines: &positiveLine,
},
},
{
Name: "PodLogOptions with LimitBytes with TailLines with SinceSeconds",
name: "PodLogOptions with LimitBytes with TailLines with SinceSeconds",
podLogOptions: v1.PodLogOptions{
LimitBytes: &limitBytesGreaterThan1,
TailLines: &positiveLine,
Expand All @@ -240,40 +248,42 @@ func TestValidatePodLogOptions(t *testing.T) {
},
}
for _, tc := range successCase {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) != 0 {
t.Errorf("%q unexpected error: %v", tc.Name, errs)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) != 0 {
t.Errorf("unexpected error: %v", errs)
}
})
}

errorCase := []struct {
Name string
name string
podLogOptions v1.PodLogOptions
}{
{
Name: "Invalid podLogOptions with Negative TailLines",
name: "Invalid podLogOptions with Negative TailLines",
podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1,
SinceSeconds: &sinceSecondsGreaterThan1,
},
},
{
Name: "Invalid podLogOptions with zero or negative LimitBytes",
name: "Invalid podLogOptions with zero or negative LimitBytes",
podLogOptions: v1.PodLogOptions{
TailLines: &positiveLine,
LimitBytes: &limitBytesLessThan1,
SinceSeconds: &sinceSecondsGreaterThan1,
},
},
{
Name: "Invalid podLogOptions with zero or negative SinceSeconds",
name: "Invalid podLogOptions with zero or negative SinceSeconds",
podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1,
SinceSeconds: &sinceSecondsLessThan1,
},
}, {
Name: "Invalid podLogOptions with both SinceSeconds and SinceTime set",
name: "Invalid podLogOptions with both SinceSeconds and SinceTime set",
podLogOptions: v1.PodLogOptions{
TailLines: &negativeLine,
LimitBytes: &limitBytesGreaterThan1,
Expand All @@ -283,20 +293,23 @@ func TestValidatePodLogOptions(t *testing.T) {
},
}
for _, tc := range errorCase {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) == 0 {
t.Errorf("%q expected error", tc.Name)
}
t.Run(tc.name, func(t *testing.T) {
if errs := ValidatePodLogOptions(&tc.podLogOptions); len(errs) == 0 {
t.Errorf("expected error")
}
})
}
}

func TestAccumulateUniqueHostPorts(t *testing.T) {
successCase := []struct {
name string
containers []v1.Container
accumulator *sets.String
fldPath *field.Path
result string
}{
{
name: "HostPort is not allocated while containers use the same port with different protocol",
containers: []v1.Container{
{
Ports: []v1.ContainerPort{
Expand All @@ -317,9 +330,9 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
},
accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"),
result: "HostPort is not allocated",
},
{
name: "HostPort is not allocated while containers use different ports",
containers: []v1.Container{
{
Ports: []v1.ContainerPort{
Expand All @@ -340,21 +353,23 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
},
accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"),
result: "HostPort is not allocated",
},
}
for index, tc := range successCase {
if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) != 0 {
t.Errorf("unexpected error for test case %v: %v", index, errs)
}
for _, tc := range successCase {
t.Run(tc.name, func(t *testing.T) {
if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) != 0 {
t.Errorf("unexpected error: %v", errs)
}
})
}
errorCase := []struct {
name string
containers []v1.Container
accumulator *sets.String
fldPath *field.Path
result string
}{
{
name: "HostPort is already allocated while containers use the same port with UDP",
containers: []v1.Container{
{
Ports: []v1.ContainerPort{
Expand All @@ -375,9 +390,9 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
},
accumulator: &sets.String{},
fldPath: field.NewPath("spec", "containers"),
result: "HostPort is already allocated",
},
{
name: "HostPort is already allocated",
containers: []v1.Container{
{
Ports: []v1.ContainerPort{
Expand All @@ -398,12 +413,13 @@ func TestAccumulateUniqueHostPorts(t *testing.T) {
},
accumulator: &sets.String{"8080/UDP": sets.Empty{}},
fldPath: field.NewPath("spec", "containers"),
result: "HostPort is already allocated",
},
}
for index, tc := range errorCase {
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)
}
for _, tc := range errorCase {
t.Run(tc.name, func(t *testing.T) {
if errs := AccumulateUniqueHostPorts(tc.containers, tc.accumulator, tc.fldPath); len(errs) == 0 {
t.Errorf("expected error, but get nil")
}
})
}
}