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