tizen 2.4 release
[external/nghttp2.git] / integration-tests / nghttpx_spdy_test.go
1 package nghttp2
2
3 import (
4         "github.com/bradfitz/http2/hpack"
5         "golang.org/x/net/spdy"
6         "net/http"
7         "testing"
8 )
9
10 // TestS3H1PlainGET tests whether simple SPDY GET request works.
11 func TestS3H1PlainGET(t *testing.T) {
12         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, noopHandler)
13         defer st.Close()
14
15         res, err := st.spdy(requestParam{
16                 name: "TestS3H1PlainGET",
17         })
18         if err != nil {
19                 t.Fatalf("Error st.spdy() = %v", err)
20         }
21
22         want := 200
23         if got := res.status; got != want {
24                 t.Errorf("status = %v; want %v", got, want)
25         }
26 }
27
28 // TestS3H1BadRequestCL tests that server rejects request whose
29 // content-length header field value does not match its request body
30 // size.
31 func TestS3H1BadRequestCL(t *testing.T) {
32         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, noopHandler)
33         defer st.Close()
34
35         // we set content-length: 1024, but the actual request body is
36         // 3 bytes.
37         res, err := st.spdy(requestParam{
38                 name:   "TestS3H1BadRequestCL",
39                 method: "POST",
40                 header: []hpack.HeaderField{
41                         pair("content-length", "1024"),
42                 },
43                 body: []byte("foo"),
44         })
45         if err != nil {
46                 t.Fatalf("Error st.spdy() = %v", err)
47         }
48
49         want := spdy.ProtocolError
50         if got := res.spdyRstErrCode; got != want {
51                 t.Errorf("res.spdyRstErrCode = %v; want %v", got, want)
52         }
53 }
54
55 // TestS3H1MultipleRequestCL tests that server rejects request with
56 // multiple Content-Length request header fields.
57 func TestS3H1MultipleRequestCL(t *testing.T) {
58         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
59                 t.Errorf("server should not forward bad request")
60         })
61         defer st.Close()
62
63         res, err := st.spdy(requestParam{
64                 name: "TestS3H1MultipleRequestCL",
65                 header: []hpack.HeaderField{
66                         pair("content-length", "1"),
67                         pair("content-length", "1"),
68                 },
69         })
70         if err != nil {
71                 t.Fatalf("Error st.spdy() = %v", err)
72         }
73         want := 400
74         if got := res.status; got != want {
75                 t.Errorf("status: %v; want %v", got, want)
76         }
77 }
78
79 // TestS3H1InvalidRequestCL tests that server rejects request with
80 // Content-Length which cannot be parsed as a number.
81 func TestS3H1InvalidRequestCL(t *testing.T) {
82         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
83                 t.Errorf("server should not forward bad request")
84         })
85         defer st.Close()
86
87         res, err := st.spdy(requestParam{
88                 name: "TestS3H1InvalidRequestCL",
89                 header: []hpack.HeaderField{
90                         pair("content-length", ""),
91                 },
92         })
93         if err != nil {
94                 t.Fatalf("Error st.spdy() = %v", err)
95         }
96         want := 400
97         if got := res.status; got != want {
98                 t.Errorf("status: %v; want %v", got, want)
99         }
100 }
101
102 // TestS3H1GenerateVia tests that server generates Via header field to and
103 // from backend server.
104 func TestS3H1GenerateVia(t *testing.T) {
105         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
106                 if got, want := r.Header.Get("Via"), "1.1 nghttpx"; got != want {
107                         t.Errorf("Via: %v; want %v", got, want)
108                 }
109         })
110         defer st.Close()
111
112         res, err := st.spdy(requestParam{
113                 name: "TestS3H1GenerateVia",
114         })
115         if err != nil {
116                 t.Fatalf("Error st.spdy() = %v", err)
117         }
118         if got, want := res.header.Get("Via"), "1.1 nghttpx"; got != want {
119                 t.Errorf("Via: %v; want %v", got, want)
120         }
121 }
122
123 // TestS3H1AppendVia tests that server adds value to existing Via
124 // header field to and from backend server.
125 func TestS3H1AppendVia(t *testing.T) {
126         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1"}, t, func(w http.ResponseWriter, r *http.Request) {
127                 if got, want := r.Header.Get("Via"), "foo, 1.1 nghttpx"; got != want {
128                         t.Errorf("Via: %v; want %v", got, want)
129                 }
130                 w.Header().Add("Via", "bar")
131         })
132         defer st.Close()
133
134         res, err := st.spdy(requestParam{
135                 name: "TestS3H1AppendVia",
136                 header: []hpack.HeaderField{
137                         pair("via", "foo"),
138                 },
139         })
140         if err != nil {
141                 t.Fatalf("Error st.spdy() = %v", err)
142         }
143         if got, want := res.header.Get("Via"), "bar, 1.1 nghttpx"; got != want {
144                 t.Errorf("Via: %v; want %v", got, want)
145         }
146 }
147
148 // TestS3H1NoVia tests that server does not add value to existing Via
149 // header field to and from backend server.
150 func TestS3H1NoVia(t *testing.T) {
151         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1", "--no-via"}, t, func(w http.ResponseWriter, r *http.Request) {
152                 if got, want := r.Header.Get("Via"), "foo"; got != want {
153                         t.Errorf("Via: %v; want %v", got, want)
154                 }
155                 w.Header().Add("Via", "bar")
156         })
157         defer st.Close()
158
159         res, err := st.spdy(requestParam{
160                 name: "TestS3H1NoVia",
161                 header: []hpack.HeaderField{
162                         pair("via", "foo"),
163                 },
164         })
165         if err != nil {
166                 t.Fatalf("Error st.spdy() = %v", err)
167         }
168         if got, want := res.header.Get("Via"), "bar"; got != want {
169                 t.Errorf("Via: %v; want %v", got, want)
170         }
171 }
172
173 // TestS3H2ConnectFailure tests that server handles the situation that
174 // connection attempt to HTTP/2 backend failed.
175 func TestS3H2ConnectFailure(t *testing.T) {
176         st := newServerTesterTLS([]string{"--npn-list=spdy/3.1", "--http2-bridge"}, t, noopHandler)
177         defer st.Close()
178
179         // simulate backend connect attempt failure
180         st.ts.Close()
181
182         res, err := st.spdy(requestParam{
183                 name: "TestS3H2ConnectFailure",
184         })
185         if err != nil {
186                 t.Fatalf("Error st.spdy() = %v", err)
187         }
188         want := 503
189         if got := res.status; got != want {
190                 t.Errorf("status: %v; want %v", got, want)
191         }
192 }