2020-12-02 10:09:37 -05:00
|
|
|
package zipartifacts_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"archive/zip"
|
|
|
|
"bytes"
|
|
|
|
"compress/gzip"
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2021-07-21 11:08:52 -04:00
|
|
|
"gitlab.com/gitlab-org/gitlab/workhorse/internal/zipartifacts"
|
2020-12-02 10:09:37 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
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")
|
|
|
|
}
|