OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/websockets/websocket_deflate_parameters.h" | |
6 | |
7 #include <string> | |
8 | |
tyoshino (SeeGerritForStatus)
2015/09/10 09:06:19
base/macros.h
yhirano
2015/09/10 11:20:13
Done.
| |
9 #include "net/websockets/websocket_extension_parser.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 namespace net { | |
13 | |
14 namespace { | |
15 | |
16 void CheckExtension(const WebSocketDeflateParameters& params, | |
17 const std::string& name, | |
18 const std::string& value) { | |
19 WebSocketExtension e = params.AsExtension(); | |
20 EXPECT_EQ("permessage-deflate", e.name()); | |
21 if (e.parameters().size() != 1) | |
22 FAIL() << "parameters must have one element."; | |
23 EXPECT_EQ(name, e.parameters()[0].name()); | |
24 EXPECT_EQ(value, e.parameters()[0].value()); | |
25 } | |
26 | |
27 TEST(WebSocketDeflateParametersTest, Empty) { | |
28 WebSocketDeflateParameters r; | |
29 | |
30 EXPECT_EQ(WebSocketDeflater::TAKE_OVER_CONTEXT, | |
31 r.server_context_take_over_mode()); | |
32 EXPECT_EQ(WebSocketDeflater::TAKE_OVER_CONTEXT, | |
33 r.client_context_take_over_mode()); | |
34 EXPECT_FALSE(r.is_server_max_window_bits_specified()); | |
35 EXPECT_FALSE(r.is_client_max_window_bits_specified()); | |
36 EXPECT_TRUE(r.IsValidAsRequest()); | |
37 EXPECT_TRUE(r.IsValidAsResponse()); | |
38 WebSocketExtension e = r.AsExtension(); | |
39 EXPECT_EQ("permessage-deflate", e.name()); | |
40 EXPECT_TRUE(e.parameters().empty()); | |
41 } | |
42 | |
43 TEST(WebSocketDeflateParametersTest, ServerContextTakeover) { | |
44 WebSocketDeflateParameters r; | |
45 | |
46 r.SetServerNoContextTakeOver(); | |
47 CheckExtension(r, "server_no_context_takeover", ""); | |
48 EXPECT_TRUE(r.IsValidAsRequest()); | |
49 EXPECT_TRUE(r.IsValidAsResponse()); | |
50 } | |
51 | |
52 TEST(WebSocketDeflateParametersTest, ClientContextTakeover) { | |
53 WebSocketDeflateParameters r; | |
54 | |
55 r.SetClientNoContextTakeOver(); | |
56 CheckExtension(r, "client_no_context_takeover", ""); | |
57 EXPECT_TRUE(r.IsValidAsRequest()); | |
58 EXPECT_TRUE(r.IsValidAsResponse()); | |
59 } | |
60 | |
61 TEST(WebSocketDeflateParametersTest, ServerMaxWindowBits) { | |
62 WebSocketDeflateParameters r; | |
63 | |
64 r.SetServerMaxWindowBits(13); | |
65 CheckExtension(r, "server_max_window_bits", "13"); | |
66 EXPECT_TRUE(r.IsValidAsRequest()); | |
67 EXPECT_TRUE(r.IsValidAsResponse()); | |
68 } | |
69 | |
70 TEST(WebSocketDeflateParametersTest, ClientMaxWindowBitsWithoutValue) { | |
71 WebSocketDeflateParameters r; | |
72 std::string failure_message; | |
73 | |
74 r.SetClientMaxWindowBits(); | |
75 CheckExtension(r, "client_max_window_bits", ""); | |
76 EXPECT_TRUE(r.IsValidAsRequest()); | |
77 EXPECT_FALSE(r.IsValidAsResponse(&failure_message)); | |
78 EXPECT_EQ("client_max_window_bits must have value", failure_message); | |
79 } | |
80 | |
81 TEST(WebSocketDeflateParametersTest, ClientMaxWindowBitsWithValue) { | |
82 WebSocketDeflateParameters r; | |
83 | |
84 r.SetClientMaxWindowBits(12); | |
85 CheckExtension(r, "client_max_window_bits", "12"); | |
86 EXPECT_TRUE(r.IsValidAsRequest()); | |
87 EXPECT_TRUE(r.IsValidAsResponse()); | |
88 } | |
89 | |
90 struct InitializeTestParameter { | |
91 const std::string query; | |
92 struct Expectation { | |
93 bool result; | |
94 std::string failure_message; | |
95 } const expected; | |
96 }; | |
97 | |
98 void PrintTo(const InitializeTestParameter& p, std::ostream* o) { | |
99 *o << p.query; | |
100 } | |
101 | |
102 class WebSocketDeflateParametersInitializeTest | |
103 : public ::testing::TestWithParam<InitializeTestParameter> {}; | |
104 | |
105 TEST_P(WebSocketDeflateParametersInitializeTest, Initialize) { | |
106 const std::string query = GetParam().query; | |
107 const bool expected = GetParam().expected.result; | |
108 const std::string expected_failure_message = | |
109 GetParam().expected.failure_message; | |
110 | |
111 WebSocketExtensionParser parser; | |
112 ASSERT_TRUE(parser.Parse("permessage-deflate" + query)); | |
113 ASSERT_EQ(1u, parser.extensions().size()); | |
114 WebSocketExtension extension = parser.extensions()[0]; | |
115 | |
116 WebSocketDeflateParameters parameters; | |
117 std::string failure_message; | |
118 bool actual = parameters.Initialize(extension, &failure_message); | |
119 | |
120 if (expected) { | |
121 EXPECT_TRUE(actual); | |
122 EXPECT_TRUE(extension.Equals(parameters.AsExtension())); | |
123 } else { | |
124 EXPECT_FALSE(actual); | |
125 } | |
126 EXPECT_EQ(expected_failure_message, failure_message); | |
127 } | |
128 | |
129 struct CompatibilityTestParameter { | |
130 const char* request_query; | |
131 const char* response_query; | |
132 const bool expected; | |
133 }; | |
134 | |
135 void PrintTo(const CompatibilityTestParameter& p, std::ostream* o) { | |
136 *o << "req = \"" << p.request_query << "\", res = \"" << p.response_query | |
137 << "\""; | |
138 } | |
139 | |
140 class WebSocketDeflateParametersCompatibilityTest | |
141 : public ::testing::TestWithParam<CompatibilityTestParameter> {}; | |
142 | |
143 TEST_P(WebSocketDeflateParametersCompatibilityTest, CheckCompatiblity) { | |
144 const std::string request_query = GetParam().request_query; | |
145 const std::string response_query = GetParam().response_query; | |
146 const bool expected = GetParam().expected; | |
147 | |
148 std::string message; | |
149 WebSocketDeflateParameters request, response; | |
150 | |
151 WebSocketExtensionParser request_parser; | |
152 ASSERT_TRUE(request_parser.Parse("permessage-deflate" + request_query)); | |
153 ASSERT_EQ(1u, request_parser.extensions().size()); | |
154 ASSERT_TRUE(request.Initialize(request_parser.extensions()[0], &message)); | |
155 ASSERT_TRUE(request.IsValidAsRequest(&message)); | |
156 | |
157 WebSocketExtensionParser response_parser; | |
158 ASSERT_TRUE(response_parser.Parse("permessage-deflate" + response_query)); | |
159 ASSERT_EQ(1u, response_parser.extensions().size()); | |
160 ASSERT_TRUE(response.Initialize(response_parser.extensions()[0], &message)); | |
161 ASSERT_TRUE(response.IsValidAsResponse(&message)); | |
162 | |
163 EXPECT_EQ(expected, request.IsCompatibleWith(response)); | |
164 } | |
165 | |
166 InitializeTestParameter::Expectation Duplicate(const std::string& name) { | |
167 return {false, | |
168 "Received duplicate permessage-deflate extension parameter " + name}; | |
169 } | |
170 | |
171 InitializeTestParameter::Expectation Invalid(const std::string& name) { | |
172 return {false, "Received invalid " + name + " parameter"}; | |
173 } | |
174 | |
175 // We need to this function in order to avoid global non-pod variables. | |
176 std::vector<InitializeTestParameter> InitializeTestParameters() { | |
177 const InitializeTestParameter::Expectation kInitialized = {true, ""}; | |
178 const InitializeTestParameter::Expectation kUnknownParameter = { | |
179 false, "Received an unexpected permessage-deflate extension parameter"}; | |
180 | |
181 const InitializeTestParameter parameters[] = { | |
182 {"", kInitialized}, | |
183 {"; server_no_context_takeover", kInitialized}, | |
184 {"; server_no_context_takeover=0", Invalid("server_no_context_takeover")}, | |
185 {"; server_no_context_takeover; server_no_context_takeover", | |
186 Duplicate("server_no_context_takeover")}, | |
187 {"; client_no_context_takeover", kInitialized}, | |
188 {"; client_no_context_takeover=0", Invalid("client_no_context_takeover")}, | |
189 {"; client_no_context_takeover; client_no_context_takeover", | |
190 Duplicate("client_no_context_takeover")}, | |
191 {"; server_max_window_bits=8", kInitialized}, | |
192 {"; server_max_window_bits=15", kInitialized}, | |
193 {"; server_max_window_bits=15; server_max_window_bits=15", | |
194 Duplicate("server_max_window_bits")}, | |
195 {"; server_max_window_bits=a", Invalid("server_max_window_bits")}, | |
196 {"; server_max_window_bits=09", Invalid("server_max_window_bits")}, | |
197 {"; server_max_window_bits=+9", Invalid("server_max_window_bits")}, | |
198 {"; server_max_window_bits=9a", Invalid("server_max_window_bits")}, | |
199 {"; server_max_window_bits", Invalid("server_max_window_bits")}, | |
200 {"; server_max_window_bits=7", Invalid("server_max_window_bits")}, | |
201 {"; server_max_window_bits=16", Invalid("server_max_window_bits")}, | |
202 {"; client_max_window_bits=15; client_max_window_bits=15", | |
tyoshino (SeeGerritForStatus)
2015/09/10 09:06:20
include the client_max_window_bits version of L191
yhirano
2015/09/10 11:20:13
Done.
| |
203 Duplicate("client_max_window_bits")}, | |
204 {"; client_max_window_bits=a", Invalid("client_max_window_bits")}, | |
205 {"; client_max_window_bits=09", Invalid("client_max_window_bits")}, | |
206 {"; client_max_window_bits=+9", Invalid("client_max_window_bits")}, | |
207 {"; client_max_window_bits=9a", Invalid("client_max_window_bits")}, | |
208 {"; client_max_window_bits", kInitialized}, | |
209 {"; client_max_window_bits=7", Invalid("client_max_window_bits")}, | |
210 {"; client_max_window_bits=16", Invalid("client_max_window_bits")}, | |
211 {"; server_no_context_takeover; client_no_context_takeover" | |
212 "; server_max_window_bits=12; client_max_window_bits=13", | |
213 kInitialized}, | |
214 {"; hogefuga", kUnknownParameter}, | |
215 }; | |
216 return std::vector<InitializeTestParameter>( | |
217 parameters, parameters + arraysize(parameters)); | |
218 } | |
219 | |
220 const CompatibilityTestParameter kCompatibilityTestParameters[] = { | |
221 {"", "", true}, | |
222 // server_no_context_takeover | |
223 {"", "; server_no_context_takeover", true}, | |
224 {"; server_no_context_takeover", "", false}, | |
225 {"; server_no_context_takeover", "; server_no_context_takeover", true}, | |
226 // client_no_context_takeover | |
227 {"", "; client_no_context_takeover", true}, | |
228 {"; client_no_context_takeover", "", true}, | |
229 {"; client_no_context_takeover", "; client_no_context_takeover", true}, | |
230 // server_max_window_bits | |
231 {"", "; server_max_window_bits=14", true}, | |
232 {"; server_max_window_bits=12", "", false}, | |
233 {"; server_max_window_bits=12", "; server_max_window_bits=12", true}, | |
234 {"; server_max_window_bits=12", "; server_max_window_bits=11", true}, | |
235 {"; server_max_window_bits=12", "; server_max_window_bits=13", false}, | |
236 // client_max_window_bits | |
237 {"", "; client_max_window_bits=14", false}, | |
238 {"; client_max_window_bits", "", true}, | |
239 {"; client_max_window_bits", "; client_max_window_bits=15", true}, | |
240 {"; client_max_window_bits=12", "", true}, | |
241 {"; client_max_window_bits=12", "; client_max_window_bits=12", true}, | |
242 {"; client_max_window_bits=12", "; client_max_window_bits=11", true}, | |
243 {"; client_max_window_bits=12", "; client_max_window_bits=13", false}, | |
tyoshino (SeeGerritForStatus)
2015/09/10 09:06:19
this response is fine
yhirano
2015/09/10 11:20:13
Done.
| |
244 }; | |
245 | |
246 INSTANTIATE_TEST_CASE_P(WebSocketDeflateParametersInitializeTest, | |
247 WebSocketDeflateParametersInitializeTest, | |
248 ::testing::ValuesIn(InitializeTestParameters())); | |
249 | |
250 INSTANTIATE_TEST_CASE_P(WebSocketDeflateParametersCompatibilityTest, | |
251 WebSocketDeflateParametersCompatibilityTest, | |
252 ::testing::ValuesIn(kCompatibilityTestParameters)); | |
253 | |
254 } // namespace | |
255 | |
256 } // namespace net | |
OLD | NEW |