code.gitea.io/gitea@v1.22.3/modules/httplib/serve_test.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package httplib 5 6 import ( 7 "fmt" 8 "net/http" 9 "net/http/httptest" 10 "net/url" 11 "os" 12 "strings" 13 "testing" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func TestServeContentByReader(t *testing.T) { 19 data := "0123456789abcdef" 20 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{}} 24 if rangeStr != "" { 25 r.Header.Set("Range", fmt.Sprintf("bytes=%s", rangeStr)) 26 } 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()) 34 } 35 } 36 37 t.Run("_range_", func(t *testing.T) { 38 test(t, http.StatusOK, data) 39 }) 40 t.Run("_range_0-", func(t *testing.T) { 41 test(t, http.StatusPartialContent, data) 42 }) 43 t.Run("_range_0-15", func(t *testing.T) { 44 test(t, http.StatusPartialContent, data) 45 }) 46 t.Run("_range_1-", func(t *testing.T) { 47 test(t, http.StatusPartialContent, data[1:]) 48 }) 49 t.Run("_range_1-3", func(t *testing.T) { 50 test(t, http.StatusPartialContent, data[1:3+1]) 51 }) 52 t.Run("_range_16-", func(t *testing.T) { 53 test(t, http.StatusRequestedRangeNotSatisfiable, "") 54 }) 55 t.Run("_range_1-99999", func(t *testing.T) { 56 test(t, http.StatusPartialContent, data[1:]) 57 }) 58 } 59 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) 65 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{}} 69 if rangeStr != "" { 70 r.Header.Set("Range", fmt.Sprintf("bytes=%s", rangeStr)) 71 } 72 73 seekReader, err := os.OpenFile(tmpFile, os.O_RDONLY, 0o644) 74 if !assert.NoError(t, err) { 75 return 76 } 77 defer seekReader.Close() 78 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()) 85 } 86 } 87 88 t.Run("_range_", func(t *testing.T) { 89 test(t, http.StatusOK, data) 90 }) 91 t.Run("_range_0-", func(t *testing.T) { 92 test(t, http.StatusPartialContent, data) 93 }) 94 t.Run("_range_0-15", func(t *testing.T) { 95 test(t, http.StatusPartialContent, data) 96 }) 97 t.Run("_range_1-", func(t *testing.T) { 98 test(t, http.StatusPartialContent, data[1:]) 99 }) 100 t.Run("_range_1-3", func(t *testing.T) { 101 test(t, http.StatusPartialContent, data[1:3+1]) 102 }) 103 t.Run("_range_16-", func(t *testing.T) { 104 test(t, http.StatusRequestedRangeNotSatisfiable, "") 105 }) 106 t.Run("_range_1-99999", func(t *testing.T) { 107 test(t, http.StatusPartialContent, data[1:]) 108 }) 109 }