Chromium Code Reviews| 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 |