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  }