Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: net/websockets/websocket_deflate_parameters_test.cc

Issue 1324113002: Introduce WebSocketDeflateParameters. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698