File: gzip_create_test.go

package info (click to toggle)
gitlab-ci-multi-runner 14.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 31,248 kB
  • sloc: sh: 1,694; makefile: 384; asm: 79; ruby: 68
file content (116 lines) | stat: -rw-r--r-- 3,010 bytes parent folder | download
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})
}