github.com/nilium/gitlab-runner@v12.5.0+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  	_, err = file.Write(testZipFileContent)
    51  	require.NoError(t, err)
    52  	file.Close()
    53  
    54  	var buffer bytes.Buffer
    55  	err = CreateGzipArchive(&buffer, []string{file.Name(), file.Name()})
    56  	require.NoError(t, err)
    57  
    58  	testGzipStreams(t, &buffer, [][]byte{testGzipFileContent, testGzipFileContent})
    59  }
    60  
    61  func TestGzipArchivingShouldFailIfDirectoryIsBeingArchived(t *testing.T) {
    62  	dir, err := ioutil.TempDir("", "test_dir")
    63  	require.NoError(t, err)
    64  	defer os.Remove(dir)
    65  
    66  	var buffer bytes.Buffer
    67  	err = CreateGzipArchive(&buffer, []string{dir})
    68  	require.Errorf(t, err, "the %q is not a regular file", dir)
    69  }
    70  
    71  func TestGzipArchivingShouldFailIfSymlinkIsBeingArchived(t *testing.T) {
    72  	dir, err := ioutil.TempDir("", "test_dir")
    73  	require.NoError(t, err)
    74  	defer os.Remove(dir)
    75  
    76  	filePath := filepath.Join(dir, "file")
    77  	err = ioutil.WriteFile(filePath, testGzipFileContent, 0644)
    78  	require.NoError(t, err)
    79  
    80  	symlinkPath := filepath.Join(dir, "symlink")
    81  	err = os.Symlink(filePath, symlinkPath)
    82  	require.NoError(t, err)
    83  
    84  	var buffer bytes.Buffer
    85  	err = CreateGzipArchive(&buffer, []string{filePath, symlinkPath})
    86  	require.Errorf(t, err, "the %q is not a regular file", symlinkPath)
    87  }
    88  
    89  func TestGzipDoesNotArchiveNonExistingFile(t *testing.T) {
    90  	var buffer bytes.Buffer
    91  	err := CreateGzipArchive(&buffer, []string{"non-existing-file"})
    92  	require.NoError(t, err)
    93  
    94  	// test that we have empty number of streams
    95  	testGzipStreams(t, &buffer, [][]byte{})
    96  }
    97  
    98  func TestGzipArchivesExistingAndNonExistingFile(t *testing.T) {
    99  	dir, err := ioutil.TempDir("", "test_dir")
   100  	require.NoError(t, err)
   101  	defer os.Remove(dir)
   102  
   103  	filePath := filepath.Join(dir, "file")
   104  	err = ioutil.WriteFile(filePath, testGzipFileContent, 0644)
   105  	require.NoError(t, err)
   106  
   107  	var buffer bytes.Buffer
   108  	err = CreateGzipArchive(&buffer, []string{filePath, "non-existing-file"})
   109  	require.NoError(t, err)
   110  
   111  	// we have only one stream
   112  	testGzipStreams(t, &buffer, [][]byte{testGzipFileContent})
   113  }