88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package git
 | |
| 
 | |
| import (
 | |
| 	"net/http/httptest"
 | |
| 	"os"
 | |
| 	"testing"
 | |
| 
 | |
| 	"gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
 | |
| 
 | |
| 	"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
 | |
| 
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestParseBasename(t *testing.T) {
 | |
| 	for _, testCase := range []struct {
 | |
| 		in  string
 | |
| 		out gitalypb.GetArchiveRequest_Format
 | |
| 	}{
 | |
| 		{"archive", gitalypb.GetArchiveRequest_TAR_GZ},
 | |
| 		{"master.tar.gz", gitalypb.GetArchiveRequest_TAR_GZ},
 | |
| 		{"foo-master.tgz", gitalypb.GetArchiveRequest_TAR_GZ},
 | |
| 		{"foo-v1.2.1.gz", gitalypb.GetArchiveRequest_TAR_GZ},
 | |
| 		{"foo.tar.bz2", gitalypb.GetArchiveRequest_TAR_BZ2},
 | |
| 		{"archive.tbz", gitalypb.GetArchiveRequest_TAR_BZ2},
 | |
| 		{"archive.tbz2", gitalypb.GetArchiveRequest_TAR_BZ2},
 | |
| 		{"archive.tb2", gitalypb.GetArchiveRequest_TAR_BZ2},
 | |
| 		{"archive.bz2", gitalypb.GetArchiveRequest_TAR_BZ2},
 | |
| 	} {
 | |
| 		basename := testCase.in
 | |
| 		out, ok := parseBasename(basename)
 | |
| 		if !ok {
 | |
| 			t.Fatalf("parseBasename did not recognize %q", basename)
 | |
| 		}
 | |
| 
 | |
| 		if out != testCase.out {
 | |
| 			t.Fatalf("expected %q, got %q", testCase.out, out)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestFinalizeArchive(t *testing.T) {
 | |
| 	tempFile, err := os.CreateTemp("", "gitlab-workhorse-test")
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer tempFile.Close()
 | |
| 
 | |
| 	// Deliberately cause an EEXIST error: we know tempFile.Name() already exists
 | |
| 	err = finalizeCachedArchive(tempFile, tempFile.Name())
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("expected nil from finalizeCachedArchive, received %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestSetArchiveHeaders(t *testing.T) {
 | |
| 	for _, testCase := range []struct {
 | |
| 		in  gitalypb.GetArchiveRequest_Format
 | |
| 		out string
 | |
| 	}{
 | |
| 		{gitalypb.GetArchiveRequest_ZIP, "application/zip"},
 | |
| 		{gitalypb.GetArchiveRequest_TAR, "application/octet-stream"},
 | |
| 		{gitalypb.GetArchiveRequest_TAR_GZ, "application/octet-stream"},
 | |
| 		{gitalypb.GetArchiveRequest_TAR_BZ2, "application/octet-stream"},
 | |
| 	} {
 | |
| 		w := httptest.NewRecorder()
 | |
| 
 | |
| 		// These should be replaced, not appended to
 | |
| 		w.Header().Set("Content-Type", "test")
 | |
| 		w.Header().Set("Content-Length", "test")
 | |
| 		w.Header().Set("Content-Disposition", "test")
 | |
| 
 | |
| 		// This should be deleted
 | |
| 		w.Header().Set("Set-Cookie", "test")
 | |
| 
 | |
| 		// This should be preserved
 | |
| 		w.Header().Set("Cache-Control", "public, max-age=3600")
 | |
| 
 | |
| 		setArchiveHeaders(w, testCase.in, "filename")
 | |
| 
 | |
| 		testhelper.RequireResponseHeader(t, w, "Content-Type", testCase.out)
 | |
| 		testhelper.RequireResponseHeader(t, w, "Content-Length")
 | |
| 		testhelper.RequireResponseHeader(t, w, "Content-Disposition", `attachment; filename="filename"`)
 | |
| 		testhelper.RequireResponseHeader(t, w, "Cache-Control", "public, max-age=3600")
 | |
| 		require.Empty(t, w.Header().Get("Set-Cookie"), "remove Set-Cookie")
 | |
| 	}
 | |
| }
 |