1 // Copyright (c) 2012-2016 The Revel Framework Authors, All rights reserved.
2 // Revel Framework source code and usage is governed by a MIT style
3 // license that can be found in the LICENSE file.
17 // Params: Testing Multipart forms
20 MultipartBoundary = "A"
21 MultipartFormData = `--A
22 Content-Disposition: form-data; name="text1"
26 Content-Disposition: form-data; name="text2"
30 Content-Disposition: form-data; name="text2"
34 Content-Disposition: form-data; name="file1"; filename="test.txt"
35 Content-Type: text/plain
39 Content-Disposition: form-data; name="file2[]"; filename="test.txt"
40 Content-Type: text/plain
44 Content-Disposition: form-data; name="file2[]"; filename="favicon.ico"
45 Content-Type: image/x-icon
49 Content-Disposition: form-data; name="file3[0]"; filename="test.txt"
50 Content-Type: text/plain
54 Content-Disposition: form-data; name="file3[1]"; filename="favicon.ico"
55 Content-Type: image/x-icon
62 // The values represented by the form data.
69 expectedValues = map[string][]string{
71 "text2": {"data2", "data3"},
73 expectedFiles = map[string][]fh{
74 "file1": {fh{"test.txt", []byte("content1")}},
75 "file2[]": {fh{"test.txt", []byte("content2")}, fh{"favicon.ico", []byte("xyz")}},
76 "file3[0]": {fh{"test.txt", []byte("content3")}},
77 "file3[1]": {fh{"favicon.ico", []byte("zzz")}},
81 func getMultipartRequest() *http.Request {
82 req, _ := http.NewRequest("POST", "http://localhost/path",
83 bytes.NewBufferString(MultipartFormData))
85 "Content-Type", fmt.Sprintf("multipart/form-data; boundary=%s", MultipartBoundary))
87 "Content-Length", fmt.Sprintf("%d", len(MultipartFormData)))
91 func BenchmarkParams(b *testing.B) {
92 c := NewTestController(nil, showRequest)
95 for i := 0; i < b.N; i++ {
96 ParamsFilter(c, NilChain)
100 func TestMultipartForm(t *testing.T) {
101 c := NewTestController(nil, getMultipartRequest())
104 ParamsFilter(c, NilChain)
106 if !reflect.DeepEqual(expectedValues, map[string][]string(c.Params.Values)) {
107 t.Errorf("Param values: (expected) %v != %v (actual)",
108 expectedValues, map[string][]string(c.Params.Values))
111 actualFiles := make(map[string][]fh)
112 for key, fileHeaders := range c.Params.Files {
113 for _, fileHeader := range fileHeaders {
114 file, _ := fileHeader.Open()
115 content, _ := ioutil.ReadAll(file)
116 actualFiles[key] = append(actualFiles[key], fh{fileHeader.Filename, content})
120 if !reflect.DeepEqual(expectedFiles, actualFiles) {
121 t.Errorf("Param files: (expected) %v != %v (actual)", expectedFiles, actualFiles)
125 func TestBind(t *testing.T) {
134 t.Errorf("Failed to bind x. Value: %d", x)
138 func TestResolveAcceptLanguage(t *testing.T) {
139 request := buildHTTPRequestWithAcceptLanguage("")
140 if result := ResolveAcceptLanguage(request); result != nil {
141 t.Errorf("Expected Accept-Language to resolve to an empty string but it was '%s'", result)
144 request = buildHTTPRequestWithAcceptLanguage("en-GB,en;q=0.8,nl;q=0.6")
145 if result := ResolveAcceptLanguage(request); len(result) != 3 {
146 t.Errorf("Unexpected Accept-Language values length of %d (expected %d)", len(result), 3)
148 if result[0].Language != "en-GB" {
149 t.Errorf("Expected '%s' to be most qualified but instead it's '%s'", "en-GB", result[0].Language)
151 if result[1].Language != "en" {
152 t.Errorf("Expected '%s' to be most qualified but instead it's '%s'", "en", result[1].Language)
154 if result[2].Language != "nl" {
155 t.Errorf("Expected '%s' to be most qualified but instead it's '%s'", "nl", result[2].Language)
159 request = buildHTTPRequestWithAcceptLanguage("en;q=0.8,nl;q=0.6,en-AU;q=malformed")
160 if result := ResolveAcceptLanguage(request); len(result) != 3 {
161 t.Errorf("Unexpected Accept-Language values length of %d (expected %d)", len(result), 3)
163 if result[0].Language != "en-AU" {
164 t.Errorf("Expected '%s' to be most qualified but instead it's '%s'", "en-AU", result[0].Language)
169 func BenchmarkResolveAcceptLanguage(b *testing.B) {
170 for i := 0; i < b.N; i++ {
171 request := buildHTTPRequestWithAcceptLanguage("en-GB,en;q=0.8,nl;q=0.6,fr;q=0.5,de-DE;q=0.4,no-NO;q=0.4,ru;q=0.2")
172 ResolveAcceptLanguage(request)
176 func buildHTTPRequestWithAcceptLanguage(acceptLanguage string) *Request {
177 request, _ := http.NewRequest("POST", "http://localhost/path", nil)
178 request.Header.Set("Accept-Language", acceptLanguage)
179 c := NewTestController(nil, request)