summaryrefslogtreecommitdiff
path: root/workhorse/internal/zipartifacts/metadata_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'workhorse/internal/zipartifacts/metadata_test.go')
-rw-r--r--workhorse/internal/zipartifacts/metadata_test.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/workhorse/internal/zipartifacts/metadata_test.go b/workhorse/internal/zipartifacts/metadata_test.go
new file mode 100644
index 00000000000..0f130ab4c15
--- /dev/null
+++ b/workhorse/internal/zipartifacts/metadata_test.go
@@ -0,0 +1,102 @@
+package zipartifacts_test
+
+import (
+ "archive/zip"
+ "bytes"
+ "compress/gzip"
+ "context"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/zipartifacts"
+)
+
+func generateTestArchive(w io.Writer) error {
+ archive := zip.NewWriter(w)
+
+ // non-POSIX paths are here just to test if we never enter infinite loop
+ files := []string{"file1", "some/file/dir/", "some/file/dir/file2", "../../test12/test",
+ "/usr/bin/test", `c:\windows\win32.exe`, `c:/windows/win.dll`, "./f/asd", "/"}
+
+ for _, file := range files {
+ archiveFile, err := archive.Create(file)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprint(archiveFile, file)
+ }
+
+ return archive.Close()
+}
+
+func validateMetadata(r io.Reader) error {
+ gz, err := gzip.NewReader(r)
+ if err != nil {
+ return err
+ }
+
+ meta, err := ioutil.ReadAll(gz)
+ if err != nil {
+ return err
+ }
+
+ paths := []string{"file1", "some/", "some/file/", "some/file/dir/", "some/file/dir/file2"}
+ for _, path := range paths {
+ if !bytes.Contains(meta, []byte(path+"\x00")) {
+ return fmt.Errorf(fmt.Sprintf("zipartifacts: metadata for path %q not found", path))
+ }
+ }
+
+ return nil
+}
+
+func TestGenerateZipMetadataFromFile(t *testing.T) {
+ var metaBuffer bytes.Buffer
+
+ f, err := ioutil.TempFile("", "workhorse-metadata.zip-")
+ if f != nil {
+ defer os.Remove(f.Name())
+ }
+ require.NoError(t, err)
+ defer f.Close()
+
+ err = generateTestArchive(f)
+ require.NoError(t, err)
+ f.Close()
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ archive, err := zipartifacts.OpenArchive(ctx, f.Name())
+ require.NoError(t, err, "zipartifacts: OpenArchive failed")
+
+ err = zipartifacts.GenerateZipMetadata(&metaBuffer, archive)
+ require.NoError(t, err, "zipartifacts: GenerateZipMetadata failed")
+
+ err = validateMetadata(&metaBuffer)
+ require.NoError(t, err)
+}
+
+func TestErrNotAZip(t *testing.T) {
+ f, err := ioutil.TempFile("", "workhorse-metadata.zip-")
+ if f != nil {
+ defer os.Remove(f.Name())
+ }
+ require.NoError(t, err)
+ defer f.Close()
+
+ _, err = fmt.Fprint(f, "Not a zip file")
+ require.NoError(t, err)
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ _, err = zipartifacts.OpenArchive(ctx, f.Name())
+ require.Equal(t, zipartifacts.ErrorCode[zipartifacts.CodeNotZip], err, "OpenArchive requires a zip file")
+}