1
// Copyright 2010 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
17
testFile = "testdata/file"
21
var ServeFileRangeTests = []struct {
26
{0, testFileLength, "", StatusOK},
27
{0, 5, "0-4", StatusPartialContent},
28
{2, testFileLength, "2-", StatusPartialContent},
29
{testFileLength - 5, testFileLength, "-5", StatusPartialContent},
30
{3, 8, "3-7", StatusPartialContent},
31
{0, 0, "20-", StatusRequestedRangeNotSatisfiable},
34
func TestServeFile(t *testing.T) {
35
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
36
ServeFile(w, r, "testdata/file")
42
file, err := ioutil.ReadFile(testFile)
44
t.Fatal("reading file:", err)
47
// set up the Request (re-used for all tests)
49
req.Header = make(Header)
50
if req.URL, err = ParseURL(ts.URL); err != nil {
51
t.Fatal("ParseURL:", err)
56
_, body := getBody(t, req)
57
if !equal(body, file) {
58
t.Fatalf("body mismatch: got %q, want %q", body, file)
62
for _, rt := range ServeFileRangeTests {
63
req.Header.Set("Range", "bytes="+rt.r)
65
req.Header["Range"] = nil
67
r, body := getBody(t, req)
68
if r.StatusCode != rt.code {
69
t.Errorf("range=%q: StatusCode=%d, want %d", rt.r, r.StatusCode, rt.code)
71
if rt.code == StatusRequestedRangeNotSatisfiable {
74
h := fmt.Sprintf("bytes %d-%d/%d", rt.start, rt.end-1, testFileLength)
78
cr := r.Header.Get("Content-Range")
80
t.Errorf("header mismatch: range=%q: got %q, want %q", rt.r, cr, h)
82
if !equal(body, file[rt.start:rt.end]) {
83
t.Errorf("body mismatch: range=%q: got %q, want %q", rt.r, body, file[rt.start:rt.end])
88
func getBody(t *testing.T, req Request) (*Response, []byte) {
89
r, err := DefaultClient.Do(&req)
91
t.Fatal(req.URL.String(), "send:", err)
93
b, err := ioutil.ReadAll(r.Body)
95
t.Fatal("reading Body:", err)
100
func equal(a, b []byte) bool {
101
if len(a) != len(b) {