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

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

Powered by Google App Engine
This is Rietveld 408576698