Skip to content

Commit

Permalink
add UT for pkg/util 02
Browse files Browse the repository at this point in the history
Signed-off-by: Lyndon-Li <lyonghui@vmware.com>
  • Loading branch information
Lyndon-Li committed Jun 15, 2023
1 parent b006339 commit 75b7599
Show file tree
Hide file tree
Showing 3 changed files with 735 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelogs/unreleased/6368-Lyndon-Li
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add UT for pkg/util
252 changes: 252 additions & 0 deletions pkg/util/kube/pod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import (
"k8s.io/client-go/kubernetes/fake"

clientTesting "k8s.io/client-go/testing"

velerotest "github.com/vmware-tanzu/velero/pkg/test"
)

func TestEnsureDeletePod(t *testing.T) {
Expand Down Expand Up @@ -91,3 +93,253 @@ func TestEnsureDeletePod(t *testing.T) {
})
}
}

func TestIsPodRunning(t *testing.T) {
tests := []struct {
name string
pod *corev1api.Pod
err string
}{
{
name: "pod is nil",
err: "invalid input pod",
},
{
name: "pod is not scheduled",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Status: corev1api.PodStatus{
Phase: "fake-phase",
},
},
err: "pod is not scheduled, name=fake-pod, namespace=fake-ns, phase=fake-phase",
},
{
name: "pod is not running",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: "fake-phase",
},
},
err: "pod is not in the expected status, name=fake-pod, namespace=fake-ns, phase=fake-phase: pod is not running",
},
{
name: "pod is being deleted",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
DeletionTimestamp: &metav1.Time{Time: time.Now()},
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: corev1api.PodRunning,
},
},
err: "pod is being terminated, name=fake-pod, namespace=fake-ns, phase=Running",
},
{
name: "success",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: corev1api.PodRunning,
},
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := IsPodRunning(test.pod)
if err != nil {
assert.EqualError(t, err, test.err)
} else {
assert.NoError(t, err)
}
})
}
}

func TestIsPodScheduled(t *testing.T) {
tests := []struct {
name string
pod *corev1api.Pod
err string
}{
{
name: "pod is nil",
err: "invalid input pod",
},
{
name: "pod is not scheduled",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Status: corev1api.PodStatus{
Phase: "fake-phase",
},
},
err: "pod is not scheduled, name=fake-pod, namespace=fake-ns, phase=fake-phase",
},
{
name: "pod is not running or pending",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: "fake-phase",
},
},
err: "pod is not in the expected status, name=fake-pod, namespace=fake-ns, phase=fake-phase: pod is not running or pending",
},
{
name: "pod is being deleted",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
DeletionTimestamp: &metav1.Time{Time: time.Now()},
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: corev1api.PodRunning,
},
},
err: "pod is being terminated, name=fake-pod, namespace=fake-ns, phase=Running",
},
{
name: "success on running",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: corev1api.PodRunning,
},
},
},
{
name: "success on pending",
pod: &corev1api.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: "fake-ns",
Name: "fake-pod",
},
Spec: corev1api.PodSpec{
NodeName: "fake-node",
},
Status: corev1api.PodStatus{
Phase: corev1api.PodPending,
},
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := IsPodScheduled(test.pod)
if err != nil {
assert.EqualError(t, err, test.err)
} else {
assert.NoError(t, err)
}
})
}
}

func TestDeletePodIfAny(t *testing.T) {
tests := []struct {
name string
podName string
podNamespace string
kubeClientObj []runtime.Object
kubeReactors []reactor
logMessage string
logLevel string
logError string
}{
{
name: "get fail",
podName: "fake-pod",
podNamespace: "fake-namespace",
logMessage: "Abort deleting pod, it doesn't exist fake-namespace/fake-pod",
logLevel: "level=debug",
},
{
name: "delete fail",
podName: "fake-pod",
podNamespace: "fake-namespace",
kubeReactors: []reactor{
{
verb: "delete",
resource: "pods",
reactorFunc: func(action clientTesting.Action) (handled bool, ret runtime.Object, err error) {
return true, nil, errors.New("fake-delete-error")
},
},
},
logMessage: "Failed to delete pod fake-namespace/fake-pod",
logLevel: "level=error",
logError: "error=fake-delete-error",
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
fakeKubeClient := fake.NewSimpleClientset(test.kubeClientObj...)

for _, reactor := range test.kubeReactors {
fakeKubeClient.Fake.PrependReactor(reactor.verb, reactor.resource, reactor.reactorFunc)
}

var kubeClient kubernetes.Interface = fakeKubeClient

logMessage := ""
DeletePodIfAny(context.Background(), kubeClient.CoreV1(), test.podName, test.podNamespace, velerotest.NewSingleLogger(&logMessage))

if len(test.logMessage) > 0 {
assert.Contains(t, logMessage, test.logMessage)
}

if len(test.logLevel) > 0 {
assert.Contains(t, logMessage, test.logLevel)
}

if len(test.logError) > 0 {
assert.Contains(t, logMessage, test.logError)
}
})
}
}
Loading

0 comments on commit 75b7599

Please sign in to comment.