15
"github.com/stretchr/testify/assert"
18
func TestServeContentByReader(t *testing.T) {
19
data := "0123456789abcdef"
21
test := func(t *testing.T, expectedStatusCode int, expectedContent string) {
22
_, rangeStr, _ := strings.Cut(t.Name(), "_range_")
23
r := &http.Request{Header: http.Header{}, Form: url.Values{}}
25
r.Header.Set("Range", fmt.Sprintf("bytes=%s", rangeStr))
27
reader := strings.NewReader(data)
28
w := httptest.NewRecorder()
29
ServeContentByReader(r, w, "test", int64(len(data)), reader)
30
assert.Equal(t, expectedStatusCode, w.Code)
31
if expectedStatusCode == http.StatusPartialContent || expectedStatusCode == http.StatusOK {
32
assert.Equal(t, fmt.Sprint(len(expectedContent)), w.Header().Get("Content-Length"))
33
assert.Equal(t, expectedContent, w.Body.String())
37
t.Run("_range_", func(t *testing.T) {
38
test(t, http.StatusOK, data)
40
t.Run("_range_0-", func(t *testing.T) {
41
test(t, http.StatusPartialContent, data)
43
t.Run("_range_0-15", func(t *testing.T) {
44
test(t, http.StatusPartialContent, data)
46
t.Run("_range_1-", func(t *testing.T) {
47
test(t, http.StatusPartialContent, data[1:])
49
t.Run("_range_1-3", func(t *testing.T) {
50
test(t, http.StatusPartialContent, data[1:3+1])
52
t.Run("_range_16-", func(t *testing.T) {
53
test(t, http.StatusRequestedRangeNotSatisfiable, "")
55
t.Run("_range_1-99999", func(t *testing.T) {
56
test(t, http.StatusPartialContent, data[1:])
60
func TestServeContentByReadSeeker(t *testing.T) {
61
data := "0123456789abcdef"
62
tmpFile := t.TempDir() + "/test"
63
err := os.WriteFile(tmpFile, []byte(data), 0o644)
64
assert.NoError(t, err)
66
test := func(t *testing.T, expectedStatusCode int, expectedContent string) {
67
_, rangeStr, _ := strings.Cut(t.Name(), "_range_")
68
r := &http.Request{Header: http.Header{}, Form: url.Values{}}
70
r.Header.Set("Range", fmt.Sprintf("bytes=%s", rangeStr))
73
seekReader, err := os.OpenFile(tmpFile, os.O_RDONLY, 0o644)
74
if !assert.NoError(t, err) {
77
defer seekReader.Close()
79
w := httptest.NewRecorder()
80
ServeContentByReadSeeker(r, w, "test", nil, seekReader)
81
assert.Equal(t, expectedStatusCode, w.Code)
82
if expectedStatusCode == http.StatusPartialContent || expectedStatusCode == http.StatusOK {
83
assert.Equal(t, fmt.Sprint(len(expectedContent)), w.Header().Get("Content-Length"))
84
assert.Equal(t, expectedContent, w.Body.String())
88
t.Run("_range_", func(t *testing.T) {
89
test(t, http.StatusOK, data)
91
t.Run("_range_0-", func(t *testing.T) {
92
test(t, http.StatusPartialContent, data)
94
t.Run("_range_0-15", func(t *testing.T) {
95
test(t, http.StatusPartialContent, data)
97
t.Run("_range_1-", func(t *testing.T) {
98
test(t, http.StatusPartialContent, data[1:])
100
t.Run("_range_1-3", func(t *testing.T) {
101
test(t, http.StatusPartialContent, data[1:3+1])
103
t.Run("_range_16-", func(t *testing.T) {
104
test(t, http.StatusRequestedRangeNotSatisfiable, "")
106
t.Run("_range_1-99999", func(t *testing.T) {
107
test(t, http.StatusPartialContent, data[1:])