github.com/jaylevin/jenkins-library@v1.230.4/cmd/containerSaveImage_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/SAP/jenkins-library/pkg/mock"
    11  	"github.com/SAP/jenkins-library/pkg/telemetry"
    12  	"github.com/stretchr/testify/assert"
    13  
    14  	v1 "github.com/google/go-containerregistry/pkg/v1"
    15  	"github.com/google/go-containerregistry/pkg/v1/fake"
    16  )
    17  
    18  func TestRunContainerSaveImage(t *testing.T) {
    19  	telemetryData := telemetry.CustomData{}
    20  
    21  	t.Run("success case", func(t *testing.T) {
    22  		config := containerSaveImageOptions{}
    23  		config.FilePath = "testfile.tar"
    24  
    25  		dClient := mock.DownloadMock{}
    26  		files := mock.FilesMock{}
    27  
    28  		cacheFolder, err := files.TempDir("", "containerSaveImage-")
    29  		assert.NoError(t, err)
    30  
    31  		dClient.Stub = func(imgRef string, dest string) (v1.Image, error) {
    32  			files.AddFile(dest, []byte("This is a test"))
    33  			return &fake.FakeImage{}, nil
    34  		}
    35  
    36  		filePath, err := runContainerSaveImage(&config, &telemetryData, cacheFolder, cacheFolder, &dClient, &files)
    37  		assert.NoError(t, err)
    38  
    39  		content, err := files.FileRead(filepath.Join(cacheFolder, "testfile.tar"))
    40  		assert.NoError(t, err)
    41  		assert.Equal(t, "This is a test", string(content))
    42  
    43  		assert.Contains(t, filePath, "testfile.tar")
    44  	})
    45  
    46  	t.Run("failure - download image", func(t *testing.T) {
    47  		config := containerSaveImageOptions{}
    48  		tmpFolder, err := ioutil.TempDir("", "")
    49  		if err != nil {
    50  			t.Fatal("failed to create temp dir")
    51  		}
    52  		defer os.RemoveAll(tmpFolder)
    53  
    54  		dClient := mock.DownloadMock{ReturnError: "download error"}
    55  		files := mock.FilesMock{}
    56  		_, err = runContainerSaveImage(&config, &telemetryData, filepath.Join(tmpFolder, "cache"), tmpFolder, &dClient, &files)
    57  		assert.EqualError(t, err, "failed to download docker image: download error")
    58  	})
    59  }
    60  
    61  func TestFilenameFromContainer(t *testing.T) {
    62  
    63  	tt := []struct {
    64  		rootPath       string
    65  		containerImage string
    66  		expected       string
    67  	}{
    68  		{rootPath: "", containerImage: "image:tag", expected: "image_tag.tar"},
    69  		{rootPath: "root/path", containerImage: "image:tag", expected: filepath.Join("root/path", "image_tag.tar")},
    70  		{rootPath: "", containerImage: "my.registry.com:55555/path/to/my/image:tag", expected: "my_registry_com_55555_path_to_my_image_tag.tar"},
    71  		{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")},
    72  	}
    73  
    74  	for _, test := range tt {
    75  		assert.Equal(t, test.expected, filenameFromContainer(test.rootPath, test.containerImage))
    76  	}
    77  
    78  }
    79  
    80  func TestCorrectContainerDockerConfigEnvVar(t *testing.T) {
    81  	t.Run("with credentials", func(t *testing.T) {
    82  		// init
    83  		utilsMock := mock.FilesMock{}
    84  		utilsMock.CurrentDir = "/tmp/test"
    85  
    86  		dockerConfigFile := "myConfig/docker.json"
    87  		utilsMock.AddFile(dockerConfigFile, []byte("{}"))
    88  
    89  		resetValue := os.Getenv("DOCKER_CONFIG")
    90  		os.Setenv("DOCKER_CONFIG", "")
    91  		defer os.Setenv("DOCKER_CONFIG", resetValue)
    92  
    93  		// test
    94  		correctContainerDockerConfigEnvVar(&containerSaveImageOptions{DockerConfigJSON: dockerConfigFile}, &utilsMock)
    95  		// assert
    96  		assert.NotNil(t, os.Getenv("DOCKER_CONFIG"))
    97  	})
    98  	t.Run("with added credentials", func(t *testing.T) {
    99  		// init
   100  		utilsMock := mock.FilesMock{}
   101  		utilsMock.CurrentDir = "/tmp/test"
   102  
   103  		dockerConfigFile := "myConfig/docker.json"
   104  		utilsMock.AddFile(dockerConfigFile, []byte("{}"))
   105  
   106  		resetValue := os.Getenv("DOCKER_CONFIG")
   107  		os.Setenv("DOCKER_CONFIG", "")
   108  		defer os.Setenv("DOCKER_CONFIG", resetValue)
   109  
   110  		// test
   111  		correctContainerDockerConfigEnvVar(&containerSaveImageOptions{DockerConfigJSON: dockerConfigFile, ContainerRegistryURL: "https://test.registry", ContainerRegistryUser: "testuser", ContainerRegistryPassword: "testPassword"}, &utilsMock)
   112  		// assert
   113  		assert.NotNil(t, os.Getenv("DOCKER_CONFIG"))
   114  		absoluteFilePath, _ := utilsMock.Abs(fmt.Sprintf("%s/%s", os.Getenv("DOCKER_CONFIG"), "config.json"))
   115  		content, _ := utilsMock.FileRead(absoluteFilePath)
   116  		assert.Contains(t, string(content), "https://test.registry")
   117  	})
   118  	t.Run("without credentials", func(t *testing.T) {
   119  		// init
   120  		utilsMock := mock.FilesMock{}
   121  		resetValue := os.Getenv("DOCKER_CONFIG")
   122  		os.Setenv("DOCKER_CONFIG", "")
   123  		defer os.Setenv("DOCKER_CONFIG", resetValue)
   124  		// test
   125  		correctContainerDockerConfigEnvVar(&containerSaveImageOptions{}, &utilsMock)
   126  		// assert
   127  		assert.NotNil(t, os.Getenv("DOCKER_CONFIG"))
   128  	})
   129  }