1// +build !integration
2
3package archive_test
4
5import (
6	"io/ioutil"
7	"testing"
8
9	"github.com/stretchr/testify/assert"
10
11	"gitlab.com/gitlab-org/gitlab-runner/commands/helpers/archive"
12
13	"gitlab.com/gitlab-org/gitlab-runner/commands/helpers/archive/gziplegacy"
14	_ "gitlab.com/gitlab-org/gitlab-runner/commands/helpers/archive/raw"
15	"gitlab.com/gitlab-org/gitlab-runner/commands/helpers/archive/ziplegacy"
16)
17
18func TestDefaultRegistration(t *testing.T) {
19	tests := map[archive.Format]struct {
20		hasArchiver, hasExtractor bool
21	}{
22		archive.Raw:  {hasArchiver: true, hasExtractor: false},
23		archive.Gzip: {hasArchiver: true, hasExtractor: false},
24		archive.Zip:  {hasArchiver: true, hasExtractor: true},
25	}
26
27	for tn, tc := range tests {
28		t.Run(string(tn), func(t *testing.T) {
29			_, err := archive.NewArchiver(tn, nil, "", archive.DefaultCompression)
30
31			if tc.hasArchiver {
32				assert.NoError(t, err)
33			} else {
34				assert.ErrorIs(t, err, archive.ErrUnsupportedArchiveFormat)
35			}
36
37			_, err = archive.NewExtractor(tn, nil, 0, "")
38
39			if tc.hasExtractor {
40				assert.NoError(t, err)
41			} else {
42				assert.ErrorIs(t, err, archive.ErrUnsupportedArchiveFormat)
43			}
44		})
45	}
46}
47
48func TestRegister(t *testing.T) {
49	format := archive.Format("new-format")
50
51	archive.Register(format, ziplegacy.NewArchiver, ziplegacy.NewExtractor)
52
53	_, err := archive.NewArchiver(format, nil, "", archive.DefaultCompression)
54	assert.NoError(t, err)
55
56	_, err = archive.NewExtractor(format, nil, 0, "")
57	assert.NoError(t, err)
58}
59
60func TestRegisterOverride(t *testing.T) {
61	existingGzipArchiver, err := gziplegacy.NewArchiver(ioutil.Discard, "", archive.DefaultCompression)
62	assert.NoError(t, err)
63
64	existingZipArchiver, err := ziplegacy.NewArchiver(ioutil.Discard, "", archive.DefaultCompression)
65	assert.NoError(t, err)
66
67	existingZipExtractor, err := ziplegacy.NewExtractor(nil, 0, "")
68	assert.NoError(t, err)
69
70	// assert existing archiver
71	archiver, err := archive.NewArchiver(archive.Gzip, nil, "", archive.DefaultCompression)
72	assert.NoError(t, err)
73	assert.IsType(t, existingGzipArchiver, archiver)
74
75	_, err = archive.NewExtractor(archive.Gzip, nil, 0, "")
76	assert.Error(t, err)
77
78	// override
79	archive.Register(archive.Gzip, ziplegacy.NewArchiver, ziplegacy.NewExtractor)
80
81	archiver, err = archive.NewArchiver(archive.Gzip, nil, "", archive.DefaultCompression)
82	assert.NoError(t, err)
83	assert.IsType(t, existingZipArchiver, archiver)
84
85	extractor, err := archive.NewExtractor(archive.Gzip, nil, 0, "")
86	assert.NoError(t, err)
87	assert.IsType(t, existingZipExtractor, extractor)
88}
89