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  }