Parent directory

lfs_test.go

2159 bytes
 1package git
 2
 3import (
 4	"errors"
 5	"strings"
 6	"testing"
 7
 8	"github.com/charmbracelet/git-lfs-transfer/transfer"
 9	"github.com/charmbracelet/soft-serve/pkg/lfs"
10)
11
12// Object IDs arrive raw off the pktline stream. They must be rejected before
13// they can be joined into a storage path. The backend is left zero-valued on
14// purpose: a guard that fires only after the store or filesystem is touched is
15// not a guard.
16func TestLFSTransferRejectsMalformedOid(t *testing.T) {
17	oids := []string{
18		"../../../../../../../../etc/passwd",
19		"../../ssh/soft_serve_host_ed25519",
20		"objects/../../../soft-serve.db",
21		"/etc/passwd",
22		"",
23		"abc",
24		strings.Repeat("a", 63),
25		strings.Repeat("a", 65),
26		strings.ToUpper(strings.Repeat("a", 64)),
27	}
28
29	var backend lfsTransfer
30	for _, oid := range oids {
31		t.Run(oid, func(t *testing.T) {
32			if _, _, err := backend.Download(oid, nil); !errors.Is(err, errInvalidOid) {
33				t.Errorf("Download: got %v, want errInvalidOid", err)
34			}
35			if err := backend.Upload(oid, 1, strings.NewReader("x"), nil); !errors.Is(err, errInvalidOid) {
36				t.Errorf("Upload: got %v, want errInvalidOid", err)
37			}
38			// Verify answers in-band with a conflict status rather than
39			// tearing down the session.
40			status, err := backend.Verify(oid, 1, nil)
41			if err != nil {
42				t.Errorf("Verify: unexpected error %v", err)
43			} else if status == nil || status.Code() != transfer.StatusConflict {
44				t.Errorf("Verify: got %v, want a conflict status", status)
45			}
46
47			items := []transfer.BatchItem{{Pointer: transfer.Pointer{Oid: oid, Size: 1}}}
48			if _, err := backend.Batch("download", items, nil); !errors.Is(err, errInvalidOid) {
49				t.Errorf("Batch: got %v, want errInvalidOid", err)
50			}
51		})
52	}
53}
54
55// A malformed object ID is a client error, so the processor reports it as a
56// 400 rather than falling through to a generic internal error.
57func TestInvalidOidIsAParseError(t *testing.T) {
58	if !errors.Is(errInvalidOid, transfer.ErrParseError) {
59		t.Errorf("errInvalidOid does not wrap transfer.ErrParseError")
60	}
61	if !errors.Is(errInvalidOid, lfs.ErrInvalidOIDFormat) {
62		t.Errorf("errInvalidOid does not wrap lfs.ErrInvalidOIDFormat")
63	}
64}