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 }