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  }