github.com/xgoffin/jenkins-library@v1.154.0/cmd/containerSaveImage_test.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "testing" 10 11 pkgutil "github.com/GoogleContainerTools/container-diff/pkg/util" 12 "github.com/SAP/jenkins-library/pkg/mock" 13 "github.com/SAP/jenkins-library/pkg/telemetry" 14 "github.com/stretchr/testify/assert" 15 ) 16 17 type containerMock struct { 18 filePath string 19 imageSource string 20 registryURL string 21 localPath string 22 includeLayers bool 23 downloadImageErr string 24 imageSourceErr string 25 tarImageErr string 26 } 27 28 func (c *containerMock) DownloadImageToPath(imageSource, filePath string) (pkgutil.Image, error) { 29 c.imageSource = imageSource 30 c.filePath = filePath 31 if c.downloadImageErr != "" { 32 return pkgutil.Image{}, fmt.Errorf(c.downloadImageErr) 33 } 34 return pkgutil.Image{}, nil 35 } 36 37 func (c *containerMock) GetImageSource() (string, error) { 38 if c.imageSourceErr != "" { 39 return "", fmt.Errorf(c.imageSourceErr) 40 } 41 return "imageSource", nil 42 } 43 44 func (c *containerMock) TarImage(writer io.Writer, image pkgutil.Image) error { 45 if c.tarImageErr != "" { 46 return fmt.Errorf(c.tarImageErr) 47 } 48 writer.Write([]byte("This is a test")) 49 return nil 50 } 51 52 func TestRunContainerSaveImage(t *testing.T) { 53 telemetryData := telemetry.CustomData{} 54 55 t.Run("success case", func(t *testing.T) { 56 config := containerSaveImageOptions{} 57 tmpFolder, err := ioutil.TempDir("", "") 58 if err != nil { 59 t.Fatal("failed to create temp dir") 60 } 61 defer os.RemoveAll(tmpFolder) 62 63 cacheFolder := filepath.Join(tmpFolder, "cache") 64 65 config.FilePath = "testfile" 66 67 dClient := containerMock{} 68 files := mock.FilesMock{} 69 70 filePath, err := runContainerSaveImage(&config, &telemetryData, cacheFolder, tmpFolder, &dClient, &files) 71 assert.NoError(t, err) 72 73 assert.Equal(t, cacheFolder, dClient.filePath) 74 assert.Equal(t, "imageSource", dClient.imageSource) 75 76 content, err := ioutil.ReadFile(filepath.Join(tmpFolder, "testfile.tar")) 77 assert.NoError(t, err) 78 assert.Equal(t, "This is a test", string(content)) 79 80 assert.Contains(t, filePath, "testfile.tar") 81 }) 82 83 t.Run("failure - cache creation", func(t *testing.T) { 84 config := containerSaveImageOptions{} 85 dClient := containerMock{} 86 files := mock.FilesMock{} 87 _, err := runContainerSaveImage(&config, &telemetryData, "", "", &dClient, &files) 88 assert.Contains(t, fmt.Sprint(err), "failed to create cache: mkdir :") 89 }) 90 91 t.Run("failure - get image source", func(t *testing.T) { 92 config := containerSaveImageOptions{} 93 tmpFolder, err := ioutil.TempDir("", "") 94 if err != nil { 95 t.Fatal("failed to create temp dir") 96 } 97 defer os.RemoveAll(tmpFolder) 98 99 dClient := containerMock{imageSourceErr: "image source error"} 100 files := mock.FilesMock{} 101 _, err = runContainerSaveImage(&config, &telemetryData, filepath.Join(tmpFolder, "cache"), tmpFolder, &dClient, &files) 102 assert.EqualError(t, err, "failed to get docker image source: image source error") 103 }) 104 105 t.Run("failure - download image", func(t *testing.T) { 106 config := containerSaveImageOptions{} 107 tmpFolder, err := ioutil.TempDir("", "") 108 if err != nil { 109 t.Fatal("failed to create temp dir") 110 } 111 defer os.RemoveAll(tmpFolder) 112 113 dClient := containerMock{downloadImageErr: "download error"} 114 files := mock.FilesMock{} 115 _, err = runContainerSaveImage(&config, &telemetryData, filepath.Join(tmpFolder, "cache"), tmpFolder, &dClient, &files) 116 assert.EqualError(t, err, "failed to download docker image: download error") 117 }) 118 119 t.Run("failure - tar image", func(t *testing.T) { 120 config := containerSaveImageOptions{} 121 tmpFolder, err := ioutil.TempDir("", "") 122 if err != nil { 123 t.Fatal("failed to create temp dir") 124 } 125 defer os.RemoveAll(tmpFolder) 126 127 dClient := containerMock{tarImageErr: "tar error"} 128 files := mock.FilesMock{} 129 _, err = runContainerSaveImage(&config, &telemetryData, filepath.Join(tmpFolder, "cache"), tmpFolder, &dClient, &files) 130 assert.EqualError(t, err, "failed to tar container image: tar error") 131 }) 132 } 133 134 func TestFilenameFromContainer(t *testing.T) { 135 136 tt := []struct { 137 rootPath string 138 containerImage string 139 expected string 140 }{ 141 {rootPath: "", containerImage: "image:tag", expected: "image_tag.tar"}, 142 {rootPath: "root/path", containerImage: "image:tag", expected: filepath.Join("root/path", "image_tag.tar")}, 143 {rootPath: "", containerImage: "my.registry.com:55555/path/to/my/image:tag", expected: "my_registry_com_55555_path_to_my_image_tag.tar"}, 144 {rootPath: "root/path", containerImage: "my.registry.com:55555/path/to/my/image:tag", expected: filepath.Join("root/path", "my_registry_com_55555_path_to_my_image_tag.tar")}, 145 } 146 147 for _, test := range tt { 148 assert.Equal(t, test.expected, filenameFromContainer(test.rootPath, test.containerImage)) 149 } 150 151 } 152 153 func TestCorrectContainerDockerConfigEnvVar(t *testing.T) { 154 t.Run("with credentials", func(t *testing.T) { 155 // init 156 utilsMock := mock.FilesMock{} 157 utilsMock.CurrentDir = "/tmp/test" 158 159 dockerConfigFile := "myConfig/docker.json" 160 utilsMock.AddFile(dockerConfigFile, []byte("{}")) 161 162 resetValue := os.Getenv("DOCKER_CONFIG") 163 os.Setenv("DOCKER_CONFIG", "") 164 defer os.Setenv("DOCKER_CONFIG", resetValue) 165 166 // test 167 correctContainerDockerConfigEnvVar(&containerSaveImageOptions{DockerConfigJSON: dockerConfigFile}, &utilsMock) 168 // assert 169 assert.NotNil(t, os.Getenv("DOCKER_CONFIG")) 170 }) 171 t.Run("with added credentials", func(t *testing.T) { 172 // init 173 utilsMock := mock.FilesMock{} 174 utilsMock.CurrentDir = "/tmp/test" 175 176 dockerConfigFile := "myConfig/docker.json" 177 utilsMock.AddFile(dockerConfigFile, []byte("{}")) 178 179 resetValue := os.Getenv("DOCKER_CONFIG") 180 os.Setenv("DOCKER_CONFIG", "") 181 defer os.Setenv("DOCKER_CONFIG", resetValue) 182 183 // test 184 correctContainerDockerConfigEnvVar(&containerSaveImageOptions{DockerConfigJSON: dockerConfigFile, ContainerRegistryURL: "https://test.registry", ContainerRegistryUser: "testuser", ContainerRegistryPassword: "testPassword"}, &utilsMock) 185 // assert 186 assert.NotNil(t, os.Getenv("DOCKER_CONFIG")) 187 absoluteFilePath, _ := utilsMock.Abs(fmt.Sprintf("%s/%s", os.Getenv("DOCKER_CONFIG"), "config.json")) 188 content, _ := utilsMock.FileRead(absoluteFilePath) 189 assert.Contains(t, string(content), "https://test.registry") 190 }) 191 t.Run("without credentials", func(t *testing.T) { 192 // init 193 utilsMock := mock.FilesMock{} 194 resetValue := os.Getenv("DOCKER_CONFIG") 195 os.Setenv("DOCKER_CONFIG", "") 196 defer os.Setenv("DOCKER_CONFIG", resetValue) 197 // test 198 correctContainerDockerConfigEnvVar(&containerSaveImageOptions{}, &utilsMock) 199 // assert 200 assert.NotNil(t, os.Getenv("DOCKER_CONFIG")) 201 }) 202 }