gitech

Форк
0
/
serve_test.go 
109 строк · 3.2 Кб
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
}
110

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.