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  }