github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/httputil/range_test.go (about) 1 package httputil_test 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 8 "github.com/treeverse/lakefs/pkg/httputil" 9 ) 10 11 func TestParseRange(t *testing.T) { 12 cases := []struct { 13 Spec string 14 Length int 15 ExpectedError error 16 ExpectedStart int 17 ExpectedEnd int 18 ExpectedSize int 19 }{ 20 {"bytes=0-20", 50, nil, 0, 20, 21}, 21 {"bytes=0-20", 10, nil, 0, 9, 10}, 22 {"bytes=-20", 50, nil, 30, 49, 20}, 23 {"bytes=20-", 50, nil, 20, 49, 30}, 24 {"bytes=-20", 10, nil, 0, 9, 10}, 25 {"bytes=0-20", 20, nil, 0, 19, 20}, 26 {"bytes=0-19", 20, nil, 0, 19, 20}, 27 {"bytes=1-300", 20, nil, 1, 19, 19}, 28 {"bytes=-0-19", 20, httputil.ErrBadRange, 0, 0, 0}, 29 {"bytess=0-19", 20, httputil.ErrBadRange, 0, 0, 0}, 30 {"0-19", 20, httputil.ErrBadRange, 0, 0, 0}, 31 {"bytes=-", 20, httputil.ErrBadRange, 0, 0, 0}, 32 {"bytes=0-foo", 20, httputil.ErrBadRange, 0, 0, 0}, 33 {"bytes=foo-19", 20, httputil.ErrBadRange, 0, 0, 0}, 34 {"bytes=20-", 20, httputil.ErrUnsatisfiableRange, 0, 0, 0}, 35 {"bytes=21-", 20, httputil.ErrUnsatisfiableRange, 0, 0, 0}, 36 {"bytes=19-", 20, nil, 19, 19, 1}, 37 } 38 39 for _, c := range cases { 40 t.Run(fmt.Sprintf("%s_length_%d", c.Spec, c.Length), func(t *testing.T) { 41 r, err := httputil.ParseRange(c.Spec, int64(c.Length)) 42 if !errors.Is(err, c.ExpectedError) { 43 t.Fatalf("epxected error: %v, got %v!", c.ExpectedError, err) 44 } 45 if err != nil { 46 return 47 } 48 49 if r.EndOffset != int64(c.ExpectedEnd) { 50 t.Fatalf("expected end offset: %d, got %d", c.ExpectedEnd, r.EndOffset) 51 } 52 if r.StartOffset != int64(c.ExpectedStart) { 53 t.Fatalf("expected start offset: %d, got %d", c.ExpectedStart, r.StartOffset) 54 } 55 if r.Size() != int64(c.ExpectedSize) { 56 t.Fatalf("expected size: %d, got %d", c.ExpectedSize, r.Size()) 57 } 58 }) 59 } 60 }