~john-koepi/ubuntu/trusty/golang/default

« back to all changes in this revision

Viewing changes to src/pkg/http/fs_test.go

  • Committer: Bazaar Package Importer
  • Author(s): Ondřej Surý
  • Date: 2011-04-20 17:36:48 UTC
  • Revision ID: james.westby@ubuntu.com-20110420173648-ifergoxyrm832trd
Tags: upstream-2011.03.07.1
Import upstream version 2011.03.07.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
4
 
 
5
package http_test
 
6
 
 
7
import (
 
8
        "fmt"
 
9
        . "http"
 
10
        "http/httptest"
 
11
        "io/ioutil"
 
12
        "os"
 
13
        "testing"
 
14
)
 
15
 
 
16
const (
 
17
        testFile       = "testdata/file"
 
18
        testFileLength = 11
 
19
)
 
20
 
 
21
var ServeFileRangeTests = []struct {
 
22
        start, end int
 
23
        r          string
 
24
        code       int
 
25
}{
 
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},
 
32
}
 
33
 
 
34
func TestServeFile(t *testing.T) {
 
35
        ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
 
36
                ServeFile(w, r, "testdata/file")
 
37
        }))
 
38
        defer ts.Close()
 
39
 
 
40
        var err os.Error
 
41
 
 
42
        file, err := ioutil.ReadFile(testFile)
 
43
        if err != nil {
 
44
                t.Fatal("reading file:", err)
 
45
        }
 
46
 
 
47
        // set up the Request (re-used for all tests)
 
48
        var req Request
 
49
        req.Header = make(Header)
 
50
        if req.URL, err = ParseURL(ts.URL); err != nil {
 
51
                t.Fatal("ParseURL:", err)
 
52
        }
 
53
        req.Method = "GET"
 
54
 
 
55
        // straight GET
 
56
        _, body := getBody(t, req)
 
57
        if !equal(body, file) {
 
58
                t.Fatalf("body mismatch: got %q, want %q", body, file)
 
59
        }
 
60
 
 
61
        // Range tests
 
62
        for _, rt := range ServeFileRangeTests {
 
63
                req.Header.Set("Range", "bytes="+rt.r)
 
64
                if rt.r == "" {
 
65
                        req.Header["Range"] = nil
 
66
                }
 
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)
 
70
                }
 
71
                if rt.code == StatusRequestedRangeNotSatisfiable {
 
72
                        continue
 
73
                }
 
74
                h := fmt.Sprintf("bytes %d-%d/%d", rt.start, rt.end-1, testFileLength)
 
75
                if rt.r == "" {
 
76
                        h = ""
 
77
                }
 
78
                cr := r.Header.Get("Content-Range")
 
79
                if cr != h {
 
80
                        t.Errorf("header mismatch: range=%q: got %q, want %q", rt.r, cr, h)
 
81
                }
 
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])
 
84
                }
 
85
        }
 
86
}
 
87
 
 
88
func getBody(t *testing.T, req Request) (*Response, []byte) {
 
89
        r, err := DefaultClient.Do(&req)
 
90
        if err != nil {
 
91
                t.Fatal(req.URL.String(), "send:", err)
 
92
        }
 
93
        b, err := ioutil.ReadAll(r.Body)
 
94
        if err != nil {
 
95
                t.Fatal("reading Body:", err)
 
96
        }
 
97
        return r, b
 
98
}
 
99
 
 
100
func equal(a, b []byte) bool {
 
101
        if len(a) != len(b) {
 
102
                return false
 
103
        }
 
104
        for i := range a {
 
105
                if a[i] != b[i] {
 
106
                        return false
 
107
                }
 
108
        }
 
109
        return true
 
110
}