github.com/xgoffin/jenkins-library@v1.154.0/pkg/docker/docker_test.go (about) 1 package docker 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "testing" 7 8 "github.com/SAP/jenkins-library/pkg/mock" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestCreateDockerConfigJSON(t *testing.T) { 14 t.Parallel() 15 t.Run("success - new file", func(t *testing.T) { 16 utilsMock := mock.FilesMock{} 17 configFile, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "test/config.json", "", &utilsMock) 18 assert.NoError(t, err) 19 assert.Equal(t, "test/config.json", configFile) 20 21 configFileContent, err := utilsMock.FileRead(configFile) 22 assert.NoError(t, err) 23 assert.Contains(t, string(configFileContent), `"auth":"dGVzdFVzZXI6dGVzdFBhc3N3b3Jk"`) 24 }) 25 26 t.Run("success - update file", func(t *testing.T) { 27 utilsMock := mock.FilesMock{} 28 existingConfig := `{ 29 "auths": { 30 "existing.registry.url:50000": { 31 "auth": "Base64Auth" 32 } 33 }, 34 "HttpHeaders": { 35 "User-Agent": "Docker-Client/18.06.3-ce (linux)" 36 } 37 }` 38 existingConfigFilePath := ".docker/config.json" 39 utilsMock.AddFile(existingConfigFilePath, []byte(existingConfig)) 40 configFile, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "", existingConfigFilePath, &utilsMock) 41 assert.NoError(t, err) 42 43 configFileContent, err := utilsMock.FileRead(configFile) 44 assert.NoError(t, err) 45 assert.Contains(t, string(configFileContent), `"existing.registry.url:50000"`) 46 assert.Contains(t, string(configFileContent), `"auth":"Base64Auth"`) 47 assert.Contains(t, string(configFileContent), `"https://test.server.url"`) 48 assert.Contains(t, string(configFileContent), `"auth":"dGVzdFVzZXI6dGVzdFBhc3N3b3Jk"`) 49 assert.Contains(t, string(configFileContent), `"User-Agent":"Docker-Client/18.06.3-ce (linux)`) 50 }) 51 52 t.Run("success - update file with empty auths", func(t *testing.T) { 53 utilsMock := mock.FilesMock{} 54 existingConfig := `{ 55 "auths": {}, 56 "HttpHeaders": { 57 "User-Agent": "Docker-Client/18.06.3-ce (linux)" 58 } 59 }` 60 existingConfigFilePath := ".docker/config.json" 61 utilsMock.AddFile(existingConfigFilePath, []byte(existingConfig)) 62 configFile, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "", existingConfigFilePath, &utilsMock) 63 assert.NoError(t, err) 64 65 configFileContent, err := utilsMock.FileRead(configFile) 66 assert.NoError(t, err) 67 assert.Contains(t, string(configFileContent), `"auth":"dGVzdFVzZXI6dGVzdFBhc3N3b3Jk"`) 68 assert.Contains(t, string(configFileContent), `"User-Agent":"Docker-Client/18.06.3-ce (linux)`) 69 }) 70 71 t.Run("error - config file read", func(t *testing.T) { 72 // FilesMock does not yet provide capability for FileRead errors 73 //t.Skip() 74 utilsMock := mock.FilesMock{FileReadErrors: map[string]error{".docker/config.json": fmt.Errorf("read error")}} 75 existingConfigFilePath := ".docker/config.json" 76 utilsMock.AddFile(existingConfigFilePath, []byte("{}")) 77 78 _, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "", existingConfigFilePath, &utilsMock) 79 80 assert.Error(t, err) 81 assert.Contains(t, fmt.Sprint(err), "failed to read file '.docker/config.json'") 82 83 }) 84 85 t.Run("error - config file unmarshal", func(t *testing.T) { 86 utilsMock := mock.FilesMock{} 87 existingConfig := `{` 88 existingConfigFilePath := ".docker/config.json" 89 utilsMock.AddFile(existingConfigFilePath, []byte(existingConfig)) 90 _, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "", existingConfigFilePath, &utilsMock) 91 92 assert.Error(t, err) 93 assert.Contains(t, fmt.Sprint(err), "failed to unmarshal json file '.docker/config.json'") 94 }) 95 96 t.Run("error - config file write", func(t *testing.T) { 97 utilsMock := mock.FilesMock{} 98 utilsMock.FileWriteError = fmt.Errorf("write error") 99 _, err := CreateDockerConfigJSON("https://test.server.url", "testUser", "testPassword", "", "", &utilsMock) 100 101 assert.Error(t, err) 102 assert.Contains(t, fmt.Sprint(err), "failed to write Docker config.json") 103 }) 104 } 105 106 func TestGetImageSource(t *testing.T) { 107 108 cases := []struct { 109 imageName string 110 registryURL string 111 localPath string 112 want string 113 }{ 114 {"imageName", "", "", "imageName"}, 115 {"imageName", "", "localPath", "daemon://localPath"}, 116 {"imageName", "http://registryURL", "", "remote://registryURL/imageName"}, 117 {"imageName", "https://containerRegistryUrl", "", "remote://containerRegistryUrl/imageName"}, 118 {"imageName", "registryURL", "", "remote://registryURL/imageName"}, 119 } 120 121 client := Client{} 122 123 for _, c := range cases { 124 125 options := ClientOptions{ImageName: c.imageName, RegistryURL: c.registryURL, LocalPath: c.localPath} 126 client.SetOptions(options) 127 128 got, err := client.GetImageSource() 129 130 assert.Nil(t, err) 131 assert.Equal(t, c.want, got) 132 } 133 } 134 135 func TestImageListWithFilePath(t *testing.T) { 136 t.Parallel() 137 138 imageName := "testImage" 139 140 tt := []struct { 141 name string 142 excludes []string 143 trimDir string 144 fileList []string 145 expected map[string]string 146 expectedError error 147 }{ 148 {name: "Dockerfile only", fileList: []string{"Dockerfile"}, expected: map[string]string{imageName: "Dockerfile"}}, 149 {name: "Dockerfile in subdir", fileList: []string{"sub/Dockerfile"}, expected: map[string]string{fmt.Sprintf("%v-sub", imageName): filepath.FromSlash("sub/Dockerfile")}}, 150 {name: "Dockerfile in subdir excluding top dir", fileList: []string{".ci/sub/Dockerfile"}, trimDir: ".ci", expected: map[string]string{fmt.Sprintf("%v-sub", imageName): filepath.FromSlash(".ci/sub/Dockerfile")}}, 151 {name: "Dockerfiles in multiple subdirs & parent", fileList: []string{"Dockerfile", "sub1/Dockerfile", "sub2/Dockerfile"}, expected: map[string]string{fmt.Sprintf("%v", imageName): filepath.FromSlash("Dockerfile"), fmt.Sprintf("%v-sub1", imageName): filepath.FromSlash("sub1/Dockerfile"), fmt.Sprintf("%v-sub2", imageName): filepath.FromSlash("sub2/Dockerfile")}}, 152 {name: "Dockerfiles in multiple subdirs & parent - with excludes", excludes: []string{"Dockerfile"}, fileList: []string{"Dockerfile", "sub1/Dockerfile", "sub2/Dockerfile"}, expected: map[string]string{fmt.Sprintf("%v-sub1", imageName): filepath.FromSlash("sub1/Dockerfile"), fmt.Sprintf("%v-sub2", imageName): filepath.FromSlash("sub2/Dockerfile")}}, 153 {name: "Dockerfiles with extensions", fileList: []string{"Dockerfile_main", "Dockerfile_sub1", "Dockerfile_sub2"}, expected: map[string]string{fmt.Sprintf("%v-main", imageName): filepath.FromSlash("Dockerfile_main"), fmt.Sprintf("%v-sub1", imageName): filepath.FromSlash("Dockerfile_sub1"), fmt.Sprintf("%v-sub2", imageName): filepath.FromSlash("Dockerfile_sub2")}}, 154 {name: "Dockerfiles with extensions", fileList: []string{"Dockerfile_main", "Dockerfile_sub1", "Dockerfile_sub2"}, expected: map[string]string{fmt.Sprintf("%v-main", imageName): filepath.FromSlash("Dockerfile_main"), fmt.Sprintf("%v-sub1", imageName): filepath.FromSlash("Dockerfile_sub1"), fmt.Sprintf("%v-sub2", imageName): filepath.FromSlash("Dockerfile_sub2")}}, 155 {name: "No Dockerfile", fileList: []string{"NoDockerFile"}, expectedError: fmt.Errorf("failed to retrieve Dockerfiles")}, 156 {name: "Incorrect Dockerfile", fileList: []string{"DockerfileNotSupported"}, expectedError: fmt.Errorf("wrong format of Dockerfile, must be inside a sub-folder or contain a separator")}, 157 } 158 159 for _, test := range tt { 160 t.Run(test.name, func(t *testing.T) { 161 fileMock := mock.FilesMock{} 162 for _, file := range test.fileList { 163 fileMock.AddFile(file, []byte("someContent")) 164 } 165 166 imageList, err := ImageListWithFilePath(imageName, test.excludes, test.trimDir, &fileMock) 167 168 if test.expectedError != nil { 169 assert.EqualError(t, err, fmt.Sprint(test.expectedError)) 170 } else { 171 assert.NoError(t, err) 172 assert.Equal(t, test.expected, imageList) 173 } 174 }) 175 } 176 }