@@ -12,6 +12,7 @@ import (
12
12
"io"
13
13
"io/ioutil"
14
14
"net/http"
15
+ "net/http/httptest"
15
16
"testing"
16
17
17
18
"code.gitea.io/gitea/models"
@@ -56,13 +57,7 @@ func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string
56
57
return oid
57
58
}
58
59
59
- func doLfs (t * testing.T , content * []byte , expectGzip bool ) {
60
- defer prepareTestEnv (t )()
61
- setting .CheckLFSVersion ()
62
- if ! setting .LFS .StartServer {
63
- t .Skip ()
64
- return
65
- }
60
+ func storeAndGetLfs (t * testing.T , content * []byte , extraHeader * http.Header , expectedStatus int ) * httptest.ResponseRecorder {
66
61
repo , err := models .GetRepositoryByOwnerAndName ("user2" , "repo1" )
67
62
assert .NoError (t , err )
68
63
oid := storeObjectInRepo (t , repo .ID , content )
@@ -73,8 +68,19 @@ func doLfs(t *testing.T, content *[]byte, expectGzip bool) {
73
68
// Request OID
74
69
req := NewRequest (t , "GET" , "/user2/repo1.git/info/lfs/objects/" + oid + "/test" )
75
70
req .Header .Set ("Accept-Encoding" , "gzip" )
76
- resp := session .MakeRequest (t , req , http .StatusOK )
71
+ if extraHeader != nil {
72
+ for key , values := range * extraHeader {
73
+ for _ , value := range values {
74
+ req .Header .Add (key , value )
75
+ }
76
+ }
77
+ }
78
+ resp := session .MakeRequest (t , req , expectedStatus )
77
79
80
+ return resp
81
+ }
82
+
83
+ func checkResponseTestContentEncoding (t * testing.T , content * []byte , resp * httptest.ResponseRecorder , expectGzip bool ) {
78
84
contentEncoding := resp .Header ().Get ("Content-Encoding" )
79
85
if ! expectGzip || ! setting .EnableGzip {
80
86
assert .NotContains (t , contentEncoding , "gzip" )
@@ -89,23 +95,44 @@ func doLfs(t *testing.T, content *[]byte, expectGzip bool) {
89
95
assert .NoError (t , err )
90
96
assert .Equal (t , * content , result )
91
97
}
92
-
93
98
}
94
99
95
100
func TestGetLFSSmall (t * testing.T ) {
101
+ defer prepareTestEnv (t )()
102
+ setting .CheckLFSVersion ()
103
+ if ! setting .LFS .StartServer {
104
+ t .Skip ()
105
+ return
106
+ }
96
107
content := []byte ("A very small file\n " )
97
- doLfs (t , & content , false )
108
+
109
+ resp := storeAndGetLfs (t , & content , nil , http .StatusOK )
110
+ checkResponseTestContentEncoding (t , & content , resp , false )
98
111
}
99
112
100
113
func TestGetLFSLarge (t * testing.T ) {
114
+ defer prepareTestEnv (t )()
115
+ setting .CheckLFSVersion ()
116
+ if ! setting .LFS .StartServer {
117
+ t .Skip ()
118
+ return
119
+ }
101
120
content := make ([]byte , gzip .MinSize * 10 )
102
121
for i := range content {
103
122
content [i ] = byte (i % 256 )
104
123
}
105
- doLfs (t , & content , true )
124
+
125
+ resp := storeAndGetLfs (t , & content , nil , http .StatusOK )
126
+ checkResponseTestContentEncoding (t , & content , resp , true )
106
127
}
107
128
108
129
func TestGetLFSGzip (t * testing.T ) {
130
+ defer prepareTestEnv (t )()
131
+ setting .CheckLFSVersion ()
132
+ if ! setting .LFS .StartServer {
133
+ t .Skip ()
134
+ return
135
+ }
109
136
b := make ([]byte , gzip .MinSize * 10 )
110
137
for i := range b {
111
138
b [i ] = byte (i % 256 )
@@ -115,10 +142,18 @@ func TestGetLFSGzip(t *testing.T) {
115
142
gzippWriter .Write (b )
116
143
gzippWriter .Close ()
117
144
content := outputBuffer .Bytes ()
118
- doLfs (t , & content , false )
145
+
146
+ resp := storeAndGetLfs (t , & content , nil , http .StatusOK )
147
+ checkResponseTestContentEncoding (t , & content , resp , false )
119
148
}
120
149
121
150
func TestGetLFSZip (t * testing.T ) {
151
+ defer prepareTestEnv (t )()
152
+ setting .CheckLFSVersion ()
153
+ if ! setting .LFS .StartServer {
154
+ t .Skip ()
155
+ return
156
+ }
122
157
b := make ([]byte , gzip .MinSize * 10 )
123
158
for i := range b {
124
159
b [i ] = byte (i % 256 )
@@ -130,5 +165,61 @@ func TestGetLFSZip(t *testing.T) {
130
165
fileWriter .Write (b )
131
166
zipWriter .Close ()
132
167
content := outputBuffer .Bytes ()
133
- doLfs (t , & content , false )
168
+
169
+ resp := storeAndGetLfs (t , & content , nil , http .StatusOK )
170
+ checkResponseTestContentEncoding (t , & content , resp , false )
171
+ }
172
+
173
+ func TestGetLFSRangeNo (t * testing.T ) {
174
+ defer prepareTestEnv (t )()
175
+ setting .CheckLFSVersion ()
176
+ if ! setting .LFS .StartServer {
177
+ t .Skip ()
178
+ return
179
+ }
180
+ content := []byte ("123456789\n " )
181
+
182
+ resp := storeAndGetLfs (t , & content , nil , http .StatusOK )
183
+ assert .Equal (t , content , resp .Body .Bytes ())
184
+ }
185
+
186
+ func TestGetLFSRange (t * testing.T ) {
187
+ defer prepareTestEnv (t )()
188
+ setting .CheckLFSVersion ()
189
+ if ! setting .LFS .StartServer {
190
+ t .Skip ()
191
+ return
192
+ }
193
+ content := []byte ("123456789\n " )
194
+
195
+ tests := []struct {
196
+ in string
197
+ out string
198
+ status int
199
+ }{
200
+ {"bytes=0-0" , "1" , http .StatusPartialContent },
201
+ {"bytes=0-1" , "12" , http .StatusPartialContent },
202
+ {"bytes=1-1" , "2" , http .StatusPartialContent },
203
+ {"bytes=1-3" , "234" , http .StatusPartialContent },
204
+ {"bytes=1-" , "23456789\n " , http .StatusPartialContent },
205
+ // end-range smaller than start-range is ignored
206
+ {"bytes=1-0" , "23456789\n " , http .StatusPartialContent },
207
+ {"bytes=0-10" , "123456789\n " , http .StatusPartialContent },
208
+ // end-range bigger than length-1 is ignored
209
+ {"bytes=0-11" , "123456789\n " , http .StatusPartialContent },
210
+ {"bytes=11-" , "" , http .StatusPartialContent },
211
+ // incorrect header value cause whole header to be ignored
212
+ {"bytes=-" , "123456789\n " , http .StatusOK },
213
+ {"foobar" , "123456789\n " , http .StatusOK },
214
+ }
215
+
216
+ for _ , tt := range tests {
217
+ t .Run (tt .in , func (t * testing.T ) {
218
+ h := http.Header {
219
+ "Range" : []string {tt .in },
220
+ }
221
+ resp := storeAndGetLfs (t , & content , & h , tt .status )
222
+ assert .Equal (t , tt .out , resp .Body .String ())
223
+ })
224
+ }
134
225
}
0 commit comments