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_stream.h" | |
| 6 | |
| 7 #include <string> | |
| 8 #include "base/run_loop.h" | |
| 9 #include "base/strings/string_util.h" | |
| 10 #include "base/strings/stringprintf.h" | |
| 11 #include "net/websockets/websocket_stream_test_util.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 #include "url/gurl.h" | |
| 14 | |
| 15 namespace net { | |
| 16 namespace { | |
| 17 | |
| 18 using ::testing::TestWithParam; | |
| 19 using ::testing::ValuesIn; | |
| 20 | |
| 21 const char* const kNoCookieHeader = ""; | |
| 22 | |
| 23 class TestBase : public WebSocketStreamCreateTestBase { | |
| 24 public: | |
| 25 void CreateAndConnect(const GURL& url, | |
| 26 const std::string& origin, | |
| 27 const std::string& cookie_header, | |
| 28 const std::string& response_body) { | |
| 29 CHECK(cookie_header.empty() || EndsWith(cookie_header, "\r\n", true)); | |
|
Ryan Sleevi
2015/02/02 20:14:41
Comment explaining why?
yhirano
2015/02/09 10:50:14
Done.
| |
| 30 | |
| 31 url_request_context_host_.SetExpectations( | |
| 32 WebSocketStandardRequestWithCookies(url.path(), url.host(), origin, | |
| 33 cookie_header, std::string()), | |
| 34 response_body); | |
| 35 CreateAndConnectStream(url.spec(), NoSubProtocols(), origin, nullptr); | |
| 36 } | |
| 37 | |
| 38 static std::string AddCRLFIfNotEmpty(const std::string& s) { | |
|
Ryan Sleevi
2015/02/02 20:14:41
No need to make this static.
yhirano
2015/02/09 10:50:14
Done.
| |
| 39 return s.empty() ? s : s + "\r\n"; | |
| 40 } | |
| 41 }; | |
| 42 | |
| 43 class ClientUseCookieParameter { | |
|
yhirano
2015/02/02 05:39:57
I made this (and the other) class POD.
Ryan Sleevi
2015/02/02 20:14:41
Make this a struct then, since you're following st
yhirano
2015/02/09 10:50:14
Done.
| |
| 44 public: | |
| 45 // The URL for the WebSocket connection. | |
|
yhirano
2015/02/02 05:29:56
Comment: done
| |
| 46 const char* const url; | |
|
yhirano
2015/02/02 05:29:56
I don't see any harm from constness.
| |
| 47 // The URL for the previously set cookies. | |
| 48 const char* const cookie_url; | |
| 49 // The previously set cookies contents. | |
| 50 const char* const cookie_line; | |
| 51 // The Cookie: HTTP header expected to appear in the WS request. An empty | |
| 52 // string means there is no Cookie: header. | |
| 53 const char* const cookie_header; | |
| 54 }; | |
| 55 | |
| 56 class WebSocketStreamClientUseCookieTest | |
| 57 : public TestBase, | |
| 58 public TestWithParam<ClientUseCookieParameter> { | |
| 59 public: | |
| 60 ~WebSocketStreamClientUseCookieTest() override { | |
| 61 // Permit any endpoint locks to be released. | |
| 62 stream_request_.reset(); | |
| 63 stream_.reset(); | |
| 64 RunUntilIdle(); | |
| 65 } | |
| 66 | |
| 67 void SetCookie(CookieStore* store, | |
| 68 const GURL& url, | |
| 69 const std::string& cookie_line) { | |
| 70 class RunLoop { | |
|
yhirano
2015/02/02 05:29:56
I will fix this helper if necessary after the GetC
yhirano
2015/02/09 10:50:14
Done.
| |
| 71 public: | |
| 72 void Run() { run_loop_.Run(); } | |
| 73 void Quit(bool unused) { run_loop_.Quit(); } | |
| 74 | |
| 75 private: | |
| 76 base::RunLoop run_loop_; | |
| 77 }; | |
| 78 | |
| 79 RunLoop run_loop; | |
| 80 store->SetCookieWithOptionsAsync( | |
| 81 url, cookie_line, CookieOptions(), | |
| 82 base::Bind(&RunLoop::Quit, base::Unretained(&run_loop))); | |
| 83 run_loop.Run(); | |
| 84 } | |
| 85 }; | |
| 86 | |
| 87 class ServerSetCookieParameter { | |
|
Ryan Sleevi
2015/02/02 20:14:41
ditto struct
yhirano
2015/02/09 10:50:14
Done.
| |
| 88 public: | |
| 89 // The URL for the WebSocket connection. | |
| 90 const char* const url; | |
| 91 // The URL used to query cookies after the response received. | |
| 92 const char* const cookie_url; | |
| 93 // The cookies expected to appear for |cookie_url| inquiry. | |
| 94 const char* const cookie_line; | |
| 95 // The Set-Cookie: HTTP header attached to the response. | |
| 96 const char* const cookie_header; | |
| 97 }; | |
| 98 | |
| 99 class WebSocketStreamServerSetCookieTest | |
| 100 : public TestBase, | |
| 101 public TestWithParam<ServerSetCookieParameter> { | |
| 102 public: | |
| 103 ~WebSocketStreamServerSetCookieTest() override { | |
| 104 // Permit any endpoint locks to be released. | |
| 105 stream_request_.reset(); | |
| 106 stream_.reset(); | |
| 107 RunUntilIdle(); | |
| 108 } | |
| 109 | |
| 110 std::string GetCookies(CookieStore* store, const GURL& url) { | |
| 111 struct GetCookiesHelper { | |
|
yhirano
2015/02/02 05:29:56
Ryan's comment (https://codereview.chromium.org/86
yhirano
2015/02/02 05:39:57
I'm not sure what you presume: If you are worrying
Ryan Sleevi
2015/02/02 20:14:41
The concern here is that the message loop is quit
yhirano
2015/02/03 01:26:32
When the message loop is quit without calling Stas
Ryan Sleevi
2015/02/03 02:16:27
I still find this code not up to the degree that w
yhirano
2015/02/03 03:41:10
Sorry, I still don't understand.
I understand you
yhirano
2015/02/09 10:50:14
Although I am not 100% sure what you suggested, bu
| |
| 112 void Run() { run_loop_.Run(); } | |
| 113 void Quit(const std::string& cookies) { | |
| 114 cookies_ = cookies; | |
| 115 run_loop_.Quit(); | |
| 116 } | |
| 117 | |
| 118 const std::string& cookies() const { return cookies_; } | |
| 119 | |
| 120 private: | |
| 121 base::RunLoop run_loop_; | |
| 122 std::string cookies_; | |
| 123 }; | |
| 124 GetCookiesHelper helper; | |
| 125 | |
| 126 store->GetCookiesWithOptionsAsync( | |
| 127 url, CookieOptions(), | |
| 128 base::Bind(&GetCookiesHelper::Quit, base::Unretained(&helper))); | |
| 129 helper.Run(); | |
| 130 return helper.cookies(); | |
| 131 } | |
| 132 }; | |
| 133 | |
| 134 TEST_P(WebSocketStreamClientUseCookieTest, ClientUseCookie) { | |
| 135 // For wss tests. | |
| 136 ssl_data_.push_back(new SSLSocketDataProvider(ASYNC, OK)); | |
| 137 | |
| 138 CookieStore* store = | |
| 139 url_request_context_host_.GetURLRequestContext()->cookie_store(); | |
| 140 | |
| 141 const GURL url(GetParam().url); | |
| 142 const GURL cookie_url(GetParam().cookie_url); | |
| 143 const std::string origin("http://www.example.com"); | |
| 144 const std::string cookie_line(GetParam().cookie_line); | |
| 145 const std::string cookie_header(AddCRLFIfNotEmpty(GetParam().cookie_header)); | |
| 146 | |
| 147 SetCookie(store, cookie_url, cookie_line); | |
| 148 | |
| 149 CreateAndConnect(url, origin, cookie_header, WebSocketStandardResponse("")); | |
| 150 | |
| 151 RunUntilIdle(); | |
| 152 EXPECT_FALSE(has_failed()); | |
| 153 } | |
| 154 | |
| 155 TEST_P(WebSocketStreamServerSetCookieTest, ServerSetCookie) { | |
| 156 // For wss tests. | |
|
yhirano
2015/02/02 05:29:56
Ryan's comment:
This comment doesn't make sense. I
yhirano
2015/02/02 05:39:57
I'm not certain because it depends parameters. Fix
yhirano
2015/02/02 06:11:58
Sorry, I meant 'it depends on parameters.'
| |
| 157 ssl_data_.push_back(new SSLSocketDataProvider(ASYNC, OK)); | |
| 158 | |
| 159 const GURL url(GetParam().url); | |
| 160 const GURL cookie_url(GetParam().cookie_url); | |
| 161 const std::string origin("http://www.example.com"); | |
| 162 const std::string cookie_line(GetParam().cookie_line); | |
| 163 const std::string cookie_header(AddCRLFIfNotEmpty(GetParam().cookie_header)); | |
|
yhirano
2015/02/02 05:29:56
I don't have a strong opinion whether we enforce "
| |
| 164 | |
| 165 const std::string response = base::StringPrintf( | |
| 166 "HTTP/1.1 101 Switching Protocols\r\n" | |
| 167 "Upgrade: websocket\r\n" | |
| 168 "Connection: Upgrade\r\n" | |
| 169 "%s" | |
| 170 "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n" | |
| 171 "\r\n", | |
| 172 cookie_header.c_str()); | |
| 173 | |
| 174 CookieStore* store = | |
| 175 url_request_context_host_.GetURLRequestContext()->cookie_store(); | |
| 176 | |
| 177 CreateAndConnect(url, origin, "", response); | |
| 178 | |
| 179 RunUntilIdle(); | |
| 180 EXPECT_FALSE(has_failed()); | |
| 181 | |
| 182 EXPECT_EQ(cookie_line, GetCookies(store, cookie_url)); | |
| 183 } | |
| 184 | |
| 185 // Test parameters definitions follow... | |
| 186 | |
| 187 const ClientUseCookieParameter kClientUseCookieParameters[] = { | |
| 188 // Non-secure cookies for ws | |
| 189 {"ws://www.example.com", | |
| 190 "http://www.example.com", | |
| 191 "test-cookie", | |
| 192 "Cookie: test-cookie"}, | |
| 193 | |
| 194 {"ws://www.example.com", | |
| 195 "https://www.example.com", | |
| 196 "test-cookie", | |
| 197 "Cookie: test-cookie"}, | |
| 198 | |
| 199 {"ws://www.example.com", | |
| 200 "ws://www.example.com", | |
| 201 "test-cookie", | |
| 202 "Cookie: test-cookie"}, | |
| 203 | |
| 204 {"ws://www.example.com", | |
| 205 "wss://www.example.com", | |
| 206 "test-cookie", | |
| 207 "Cookie: test-cookie"}, | |
| 208 | |
| 209 // Non-secure cookies for wss | |
| 210 {"wss://www.example.com", | |
| 211 "http://www.example.com", | |
| 212 "test-cookie", | |
| 213 "Cookie: test-cookie"}, | |
| 214 | |
| 215 {"wss://www.example.com", | |
| 216 "https://www.example.com", | |
| 217 "test-cookie", | |
| 218 "Cookie: test-cookie"}, | |
| 219 | |
| 220 {"wss://www.example.com", | |
| 221 "ws://www.example.com", | |
| 222 "test-cookie", | |
| 223 "Cookie: test-cookie"}, | |
| 224 | |
| 225 {"wss://www.example.com", | |
| 226 "wss://www.example.com", | |
| 227 "test-cookie", | |
| 228 "Cookie: test-cookie"}, | |
| 229 | |
| 230 // Secure-cookies for ws | |
| 231 {"ws://www.example.com", | |
| 232 "https://www.example.com", | |
| 233 "test-cookie; secure", | |
| 234 kNoCookieHeader}, | |
| 235 | |
| 236 {"ws://www.example.com", | |
| 237 "wss://www.example.com", | |
| 238 "test-cookie; secure", | |
| 239 kNoCookieHeader}, | |
| 240 | |
| 241 // Secure-cookies for wss | |
| 242 {"wss://www.example.com", | |
| 243 "https://www.example.com", | |
| 244 "test-cookie; secure", | |
| 245 "Cookie: test-cookie"}, | |
| 246 | |
| 247 {"wss://www.example.com", | |
| 248 "wss://www.example.com", | |
| 249 "test-cookie; secure", | |
| 250 "Cookie: test-cookie"}, | |
| 251 | |
| 252 // Non-secure cookies for ws (sharing domain) | |
| 253 {"ws://www.example.com", | |
| 254 "http://www2.example.com", | |
| 255 "test-cookie; Domain=example.com", | |
| 256 "Cookie: test-cookie"}, | |
| 257 | |
| 258 {"ws://www.example.com", | |
| 259 "https://www2.example.com", | |
| 260 "test-cookie; Domain=example.com", | |
| 261 "Cookie: test-cookie"}, | |
| 262 | |
| 263 {"ws://www.example.com", | |
| 264 "ws://www2.example.com", | |
| 265 "test-cookie; Domain=example.com", | |
| 266 "Cookie: test-cookie"}, | |
| 267 | |
| 268 {"ws://www.example.com", | |
| 269 "wss://www2.example.com", | |
| 270 "test-cookie; Domain=example.com", | |
| 271 "Cookie: test-cookie"}, | |
| 272 | |
| 273 // Non-secure cookies for wss (sharing domain) | |
| 274 {"wss://www.example.com", | |
| 275 "http://www2.example.com", | |
| 276 "test-cookie; Domain=example.com", | |
| 277 "Cookie: test-cookie"}, | |
| 278 | |
| 279 {"wss://www.example.com", | |
| 280 "https://www2.example.com", | |
| 281 "test-cookie; Domain=example.com", | |
| 282 "Cookie: test-cookie"}, | |
| 283 | |
| 284 {"wss://www.example.com", | |
| 285 "ws://www2.example.com", | |
| 286 "test-cookie; Domain=example.com", | |
| 287 "Cookie: test-cookie"}, | |
| 288 | |
| 289 {"wss://www.example.com", | |
| 290 "wss://www2.example.com", | |
| 291 "test-cookie; Domain=example.com", | |
| 292 "Cookie: test-cookie"}, | |
| 293 | |
| 294 // Secure-cookies for ws (sharing domain) | |
| 295 {"ws://www.example.com", | |
| 296 "https://www2.example.com", | |
| 297 "test-cookie; Domain=example.com; secure", | |
| 298 kNoCookieHeader}, | |
| 299 | |
| 300 {"ws://www.example.com", | |
| 301 "wss://www2.example.com", | |
| 302 "test-cookie; Domain=example.com; secure", | |
| 303 kNoCookieHeader}, | |
| 304 | |
| 305 // Secure-cookies for wss (sharing domain) | |
| 306 {"wss://www.example.com", | |
| 307 "https://www2.example.com", | |
| 308 "test-cookie; Domain=example.com; secure", | |
| 309 "Cookie: test-cookie"}, | |
| 310 | |
| 311 {"wss://www.example.com", | |
| 312 "wss://www2.example.com", | |
| 313 "test-cookie; Domain=example.com; secure", | |
| 314 "Cookie: test-cookie"}, | |
| 315 | |
| 316 // Non-matching cookies for ws | |
| 317 {"ws://www.example.com", | |
| 318 "http://www2.example.com", | |
| 319 "test-cookie", | |
| 320 kNoCookieHeader}, | |
| 321 | |
| 322 {"ws://www.example.com", | |
| 323 "https://www2.example.com", | |
| 324 "test-cookie", | |
| 325 kNoCookieHeader}, | |
| 326 | |
| 327 {"ws://www.example.com", | |
| 328 "ws://www2.example.com", | |
| 329 "test-cookie", | |
| 330 kNoCookieHeader}, | |
| 331 | |
| 332 {"ws://www.example.com", | |
| 333 "wss://www2.example.com", | |
| 334 "test-cookie", | |
| 335 kNoCookieHeader}, | |
| 336 | |
| 337 // Non-matching cookies for wss | |
| 338 {"wss://www.example.com", | |
| 339 "http://www2.example.com", | |
| 340 "test-cookie", | |
| 341 kNoCookieHeader}, | |
| 342 | |
| 343 {"wss://www.example.com", | |
| 344 "https://www2.example.com", | |
| 345 "test-cookie", | |
| 346 kNoCookieHeader}, | |
| 347 | |
| 348 {"wss://www.example.com", | |
| 349 "ws://www2.example.com", | |
| 350 "test-cookie", | |
| 351 kNoCookieHeader}, | |
| 352 | |
| 353 {"wss://www.example.com", | |
| 354 "wss://www2.example.com", | |
| 355 "test-cookie", | |
| 356 kNoCookieHeader}, | |
| 357 }; | |
| 358 | |
| 359 const ServerSetCookieParameter kServerSetCookieParameters[] = { | |
| 360 // Cookies coming from ws | |
| 361 {"ws://www.example.com", | |
| 362 "http://www.example.com", | |
| 363 "test-cookie", | |
| 364 "Set-Cookie: test-cookie"}, | |
| 365 | |
| 366 {"ws://www.example.com", | |
| 367 "https://www.example.com", | |
| 368 "test-cookie", | |
| 369 "Set-Cookie: test-cookie"}, | |
| 370 | |
| 371 {"ws://www.example.com", | |
| 372 "ws://www.example.com", | |
| 373 "test-cookie", | |
| 374 "Set-Cookie: test-cookie"}, | |
| 375 | |
| 376 {"ws://www.example.com", | |
| 377 "wss://www.example.com", | |
| 378 "test-cookie", | |
| 379 "Set-Cookie: test-cookie"}, | |
| 380 | |
| 381 // Cookies coming from wss | |
| 382 {"wss://www.example.com", | |
| 383 "http://www.example.com", | |
| 384 "test-cookie", | |
| 385 "Set-Cookie: test-cookie"}, | |
| 386 | |
| 387 {"wss://www.example.com", | |
| 388 "https://www.example.com", | |
| 389 "test-cookie", | |
| 390 "Set-Cookie: test-cookie"}, | |
| 391 | |
| 392 {"wss://www.example.com", | |
| 393 "ws://www.example.com", | |
| 394 "test-cookie", | |
| 395 "Set-Cookie: test-cookie"}, | |
| 396 | |
| 397 {"wss://www.example.com", | |
| 398 "wss://www.example.com", | |
| 399 "test-cookie", | |
| 400 "Set-Cookie: test-cookie"}, | |
| 401 | |
| 402 // cookies coming from ws (sharing domain) | |
| 403 {"ws://www.example.com", | |
| 404 "http://www2.example.com", | |
| 405 "test-cookie", | |
| 406 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 407 | |
| 408 {"ws://www.example.com", | |
| 409 "https://www2.example.com", | |
| 410 "test-cookie", | |
| 411 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 412 | |
| 413 {"ws://www.example.com", | |
| 414 "ws://www2.example.com", | |
| 415 "test-cookie", | |
| 416 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 417 | |
| 418 {"ws://www.example.com", | |
| 419 "wss://www2.example.com", | |
| 420 "test-cookie", | |
| 421 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 422 | |
| 423 // cookies coming from wss (sharing domain) | |
| 424 {"wss://www.example.com", | |
| 425 "http://www2.example.com", | |
| 426 "test-cookie", | |
| 427 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 428 | |
| 429 {"wss://www.example.com", | |
| 430 "https://www2.example.com", | |
| 431 "test-cookie", | |
| 432 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 433 | |
| 434 {"wss://www.example.com", | |
| 435 "ws://www2.example.com", | |
| 436 "test-cookie", | |
| 437 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 438 | |
| 439 {"wss://www.example.com", | |
| 440 "wss://www2.example.com", | |
| 441 "test-cookie", | |
| 442 "Set-Cookie: test-cookie; Domain=example.com"}, | |
| 443 | |
| 444 // Non-matching cookies coming from ws | |
| 445 {"ws://www.example.com", | |
| 446 "http://www2.example.com", | |
| 447 "", | |
| 448 "Set-Cookie: test-cookie"}, | |
| 449 | |
| 450 {"ws://www.example.com", | |
| 451 "https://www2.example.com", | |
| 452 "", | |
| 453 "Set-Cookie: test-cookie"}, | |
| 454 | |
| 455 {"ws://www.example.com", | |
| 456 "ws://www2.example.com", | |
| 457 "", | |
| 458 "Set-Cookie: test-cookie"}, | |
| 459 | |
| 460 {"ws://www.example.com", | |
| 461 "wss://www2.example.com", | |
| 462 "", | |
| 463 "Set-Cookie: test-cookie"}, | |
| 464 | |
| 465 // Non-matching cookies coming from wss | |
| 466 {"wss://www.example.com", | |
| 467 "http://www2.example.com", | |
| 468 "", | |
| 469 "Set-Cookie: test-cookie"}, | |
| 470 | |
| 471 {"wss://www.example.com", | |
| 472 "https://www2.example.com", | |
| 473 "", | |
| 474 "Set-Cookie: test-cookie"}, | |
| 475 | |
| 476 {"wss://www.example.com", | |
| 477 "ws://www2.example.com", | |
| 478 "", | |
| 479 "Set-Cookie: test-cookie"}, | |
| 480 | |
| 481 {"wss://www.example.com", | |
| 482 "wss://www2.example.com", | |
| 483 "", | |
| 484 "Set-Cookie: test-cookie"}, | |
| 485 }; | |
| 486 | |
| 487 INSTANTIATE_TEST_CASE_P(WebSocketStreamClientUseCookieTest, | |
| 488 WebSocketStreamClientUseCookieTest, | |
| 489 ValuesIn(kClientUseCookieParameters)); | |
|
Ryan Sleevi
2015/02/02 20:14:41
Move this to line 358 - keep your code & instantia
yhirano
2015/02/09 10:50:14
Done.
| |
| 490 | |
| 491 INSTANTIATE_TEST_CASE_P(WebSocketStreamServerSetCookieTest, | |
| 492 WebSocketStreamServerSetCookieTest, | |
| 493 ValuesIn(kServerSetCookieParameters)); | |
| 494 | |
| 495 } // namespace | |
| 496 } // namespace net | |
| OLD | NEW |