gitlab.com/jfprevost/gitlab-runner-notlscheck@v11.11.4+incompatible/helpers/archives/gzip_create_test.go (about)

     1  package archives
     2  
     3  import (
     4  	"bytes"
     5  	"compress/gzip"
     6  	"io"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  var testGzipFileContent = []byte("test content")
    16  
    17  func testGzipStreams(t *testing.T, r io.Reader, streams [][]byte) {
    18  	gz, err := gzip.NewReader(r)
    19  	if err == io.EOF && len(streams) == 0 {
    20  		return
    21  	}
    22  	require.NoError(t, err)
    23  	defer gz.Close()
    24  
    25  	stream := 0
    26  	for ; stream < len(streams); stream++ {
    27  		if stream > 0 {
    28  			err := gz.Reset(r)
    29  			require.NoError(t, err, "stream should have another gzip archive")
    30  		}
    31  
    32  		gz.Multistream(false)
    33  
    34  		readed, err := ioutil.ReadAll(gz)
    35  		require.NoError(t, err, "gzip archive should be uncompressed")
    36  		require.Equal(t, readed, streams[stream], "gzip archive should equal content")
    37  	}
    38  
    39  	if gz.Reset(r) != io.EOF {
    40  		t.Fatal("gzip stream should end")
    41  	}
    42  }
    43  
    44  func TestGzipArchiveOfMultipleFiles(t *testing.T) {
    45  	file, err := ioutil.TempFile("", "test_file")
    46  	require.NoError(t, err)
    47  	defer file.Close()
    48  	defer os.Remove(file.Name())
    49  
    50  	file.Write(testZipFileContent)
    51  	file.Close()
    52  
    53  	var buffer bytes.Buffer
    54  	err = CreateGzipArchive(&buffer, []string{file.Name(), file.Name()})
    55  	require.NoError(t, err)
    56  
    57  	testGzipStreams(t, &buffer, [][]byte{testGzipFileContent, testGzipFileContent})
    58  }
    59  
    60  func TestGzipArchivingShouldFailIfDirectoryIsBeingArchived(t *testing.T) {
    61  	dir, err := ioutil.TempDir("", "test_dir")
    62  	require.NoError(t, err)
    63  	defer os.Remove(dir)
    64  
    65  	var buffer bytes.Buffer
    66  	err = CreateGzipArchive(&buffer, []string{dir})
    67  	require.Errorf(t, err, "the %q is not a regular file", dir)
    68  }
    69  
    70  func TestGzipArchivingShouldFailIfSymlinkIsBeingArchived(t *testing.T) {
    71  	dir, err := ioutil.TempDir("", "test_dir")
    72  	require.NoError(t, err)
    73  	defer os.Remove(dir)
    74  
    75  	filePath := filepath.Join(dir, "file")
    76  	err = ioutil.WriteFile(filePath, testGzipFileContent, 0644)
    77  	require.NoError(t, err)
    78  
    79  	symlinkPath := filepath.Join(dir, "symlink")
    80  	err = os.Symlink(filePath, symlinkPath)
    81  	require.NoError(t, err)
    82  
    83  	var buffer bytes.Buffer
    84  	err = CreateGzipArchive(&buffer, []string{filePath, symlinkPath})
    85  	require.Errorf(t, err, "the %q is not a regular file", symlinkPath)
    86  }
    87  
    88  func TestGzipDoesNotArchiveNonExistingFile(t *testing.T) {
    89  	var buffer bytes.Buffer
    90  	err := CreateGzipArchive(&buffer, []string{"non-existing-file"})
    91  	require.NoError(t, err)
    92  
    93  	// test that we have empty number of streams
    94  	testGzipStreams(t, &buffer, [][]byte{})
    95  }
    96  
    97  func TestGzipArchivesExistingAndNonExistingFile(t *testing.T) {
    98  	dir, err := ioutil.TempDir("", "test_dir")
    99  	require.NoError(t, err)
   100  	defer os.Remove(dir)
   101  
   102  	filePath := filepath.Join(dir, "file")
   103  	err = ioutil.WriteFile(filePath, testGzipFileContent, 0644)
   104  	require.NoError(t, err)
   105  
   106  	var buffer bytes.Buffer
   107  	err = CreateGzipArchive(&buffer, []string{filePath, "non-existing-file"})
   108  
   109  	// we have only one stream
   110  	testGzipStreams(t, &buffer, [][]byte{testGzipFileContent})
   111  }