Skip to content

Commit f215096

Browse files
Add error path testing to image handling by kubeGenericRuntimeManager
In kubernetes#88372, we added the ability to inject errors to the `FakeImageService`. Use this ability to test the error paths executed by the `kubeGenericRuntimeManager` when underlying `ImageService` calls fail. I don't foresee this change having a huge impact, but it should set a good precedent for test coverage, and should the failure case behavior become more "interesting" or risky in the future, we already will have the scaffolding in place with which we can expand the tests.
1 parent e6c4ac3 commit f215096

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

pkg/kubelet/kuberuntime/kuberuntime_image_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package kuberuntime
1818

1919
import (
2020
"encoding/json"
21+
"fmt"
2122
"testing"
2223

2324
"github.com/stretchr/testify/assert"
@@ -44,6 +45,20 @@ func TestPullImage(t *testing.T) {
4445
assert.Equal(t, images[0].RepoTags, []string{"busybox"})
4546
}
4647

48+
func TestPullImageWithError(t *testing.T) {
49+
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
50+
assert.NoError(t, err)
51+
52+
fakeImageService.InjectError("PullImage", fmt.Errorf("test-error"))
53+
imageRef, err := fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil, nil)
54+
assert.Error(t, err)
55+
assert.Equal(t, "", imageRef)
56+
57+
images, err := fakeManager.ListImages()
58+
assert.NoError(t, err)
59+
assert.Equal(t, 0, len(images))
60+
}
61+
4762
func TestListImages(t *testing.T) {
4863
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
4964
assert.NoError(t, err)
@@ -62,6 +77,17 @@ func TestListImages(t *testing.T) {
6277
assert.Equal(t, expected.List(), actual.List())
6378
}
6479

80+
func TestListImagesWithError(t *testing.T) {
81+
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
82+
assert.NoError(t, err)
83+
84+
fakeImageService.InjectError("ListImages", fmt.Errorf("test-failure"))
85+
86+
actualImages, err := fakeManager.ListImages()
87+
assert.Error(t, err)
88+
assert.Nil(t, actualImages)
89+
}
90+
6591
func TestGetImageRef(t *testing.T) {
6692
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
6793
assert.NoError(t, err)
@@ -73,6 +99,32 @@ func TestGetImageRef(t *testing.T) {
7399
assert.Equal(t, image, imageRef)
74100
}
75101

102+
func TestGetImageRefImageNotAvailableLocally(t *testing.T) {
103+
_, _, fakeManager, err := createTestRuntimeManager()
104+
assert.NoError(t, err)
105+
106+
image := "busybox"
107+
108+
imageRef, err := fakeManager.GetImageRef(kubecontainer.ImageSpec{Image: image})
109+
assert.NoError(t, err)
110+
111+
imageNotAvailableLocallyRef := ""
112+
assert.Equal(t, imageNotAvailableLocallyRef, imageRef)
113+
}
114+
115+
func TestGetImageRefWithError(t *testing.T) {
116+
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
117+
assert.NoError(t, err)
118+
119+
image := "busybox"
120+
121+
fakeImageService.InjectError("ImageStatus", fmt.Errorf("test-error"))
122+
123+
imageRef, err := fakeManager.GetImageRef(kubecontainer.ImageSpec{Image: image})
124+
assert.Error(t, err)
125+
assert.Equal(t, "", imageRef)
126+
}
127+
76128
func TestRemoveImage(t *testing.T) {
77129
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
78130
assert.NoError(t, err)
@@ -86,6 +138,29 @@ func TestRemoveImage(t *testing.T) {
86138
assert.Equal(t, 0, len(fakeImageService.Images))
87139
}
88140

141+
func TestRemoveImageNoOpIfImageNotLocal(t *testing.T) {
142+
_, _, fakeManager, err := createTestRuntimeManager()
143+
assert.NoError(t, err)
144+
145+
err = fakeManager.RemoveImage(kubecontainer.ImageSpec{Image: "busybox"})
146+
assert.NoError(t, err)
147+
}
148+
149+
func TestRemoveImageWithError(t *testing.T) {
150+
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
151+
assert.NoError(t, err)
152+
153+
_, err = fakeManager.PullImage(kubecontainer.ImageSpec{Image: "busybox"}, nil, nil)
154+
assert.NoError(t, err)
155+
assert.Equal(t, 1, len(fakeImageService.Images))
156+
157+
fakeImageService.InjectError("RemoveImage", fmt.Errorf("test-failure"))
158+
159+
err = fakeManager.RemoveImage(kubecontainer.ImageSpec{Image: "busybox"})
160+
assert.Error(t, err)
161+
assert.Equal(t, 1, len(fakeImageService.Images))
162+
}
163+
89164
func TestImageStats(t *testing.T) {
90165
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
91166
assert.NoError(t, err)
@@ -101,6 +176,17 @@ func TestImageStats(t *testing.T) {
101176
assert.Equal(t, expectedStats, actualStats)
102177
}
103178

179+
func TestImageStatsWithError(t *testing.T) {
180+
_, fakeImageService, fakeManager, err := createTestRuntimeManager()
181+
assert.NoError(t, err)
182+
183+
fakeImageService.InjectError("ListImages", fmt.Errorf("test-failure"))
184+
185+
actualImageStats, err := fakeManager.ImageStats()
186+
assert.Error(t, err)
187+
assert.Nil(t, actualImageStats)
188+
}
189+
104190
func TestPullWithSecrets(t *testing.T) {
105191
// auth value is equivalent to: "username":"passed-user","password":"passed-password"
106192
dockerCfg := map[string]map[string]string{"index.docker.io/v1/": {"email": "passed-email", "auth": "cGFzc2VkLXVzZXI6cGFzc2VkLXBhc3N3b3Jk"}}

0 commit comments

Comments
 (0)