OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/websockets/websocket_frame_parser.h" | 5 #include "net/websockets/websocket_frame_parser.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 12 matching lines...) Expand all Loading... | |
23 const char kMaskedHelloFrame[] = | 23 const char kMaskedHelloFrame[] = |
24 "\x81\x8D\xDE\xAD\xBE\xEF" | 24 "\x81\x8D\xDE\xAD\xBE\xEF" |
25 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF"; | 25 "\x96\xC8\xD2\x83\xB1\x81\x9E\x98\xB1\xDF\xD2\x8B\xFF"; |
26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; | 26 const uint64 kMaskedHelloFrameLength = arraysize(kMaskedHelloFrame) - 1; |
27 | 27 |
28 struct FrameHeaderTestCase { | 28 struct FrameHeaderTestCase { |
29 const char* frame_header; | 29 const char* frame_header; |
30 size_t frame_header_length; | 30 size_t frame_header_length; |
31 uint64 frame_length; | 31 uint64 frame_length; |
32 bool failed; | 32 bool failed; |
33 net::WebSocketError error_code; | |
33 }; | 34 }; |
34 | 35 |
35 // TODO(toyoshim): Provide error code and check if the reason is correct. | |
36 const FrameHeaderTestCase kFrameHeaderTests[] = { | 36 const FrameHeaderTestCase kFrameHeaderTests[] = { |
37 { "\x81\x00", 2, GG_UINT64_C(0), false }, | 37 { "\x81\x00", 2, GG_UINT64_C(0), false, net::WS_OK }, |
38 { "\x81\x7D", 2, GG_UINT64_C(125), false }, | 38 { "\x81\x7D", 2, GG_UINT64_C(125), false, net::WS_OK }, |
39 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false }, | 39 { "\x81\x7E\x00\x7E", 4, GG_UINT64_C(126), false, net::WS_OK }, |
40 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false }, | 40 { "\x81\x7E\xFF\xFF", 4, GG_UINT64_C(0xFFFF), false, net::WS_OK }, |
41 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000), | 41 { "\x81\x7F\x00\x00\x00\x00\x00\x01\x00\x00", 10, GG_UINT64_C(0x10000), |
42 false }, | 42 false, net::WS_OK }, |
43 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF), | 43 { "\x81\x7F\x00\x00\x00\x00\x7F\xFF\xFF\xFF", 10, GG_UINT64_C(0x7FFFFFFF), |
44 false }, | 44 false, net::WS_OK }, |
45 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000), | 45 { "\x81\x7F\x00\x00\x00\x00\x80\x00\x00\x00", 10, GG_UINT64_C(0x80000000), |
46 true }, | 46 true, net::WS_ERR_MESSAGE_TOO_BIG }, |
47 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, | 47 { "\x81\x7F\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 10, |
48 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true } | 48 GG_UINT64_C(0x7FFFFFFFFFFFFFFF), true, net::WS_ERR_MESSAGE_TOO_BIG } |
mmenke
2012/08/01 14:44:59
How about just moving this unnamed namespace into
Takashi Toyoshima
2012/08/02 08:11:35
Done.
| |
49 }; | 49 }; |
50 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); | 50 const int kNumFrameHeaderTests = arraysize(kFrameHeaderTests); |
51 | 51 |
52 } // Unnamed namespace | 52 } // Unnamed namespace |
53 | 53 |
54 namespace net { | 54 namespace net { |
55 | 55 |
56 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { | 56 TEST(WebSocketFrameParserTest, DecodeNormalFrame) { |
57 WebSocketFrameParser parser; | 57 WebSocketFrameParser parser; |
58 | 58 |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
323 static const uint64 kMaxPayloadSize = 200; | 323 static const uint64 kMaxPayloadSize = 200; |
324 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); | 324 uint64 input_payload_size = std::min(frame_length, kMaxPayloadSize); |
325 input.insert(input.end(), input_payload_size, 'a'); | 325 input.insert(input.end(), input_payload_size, 'a'); |
326 | 326 |
327 WebSocketFrameParser parser; | 327 WebSocketFrameParser parser; |
328 | 328 |
329 ScopedVector<WebSocketFrameChunk> frames; | 329 ScopedVector<WebSocketFrameChunk> frames; |
330 EXPECT_EQ(!kFrameHeaderTests[i].failed, | 330 EXPECT_EQ(!kFrameHeaderTests[i].failed, |
331 parser.Decode(&input.front(), input.size(), &frames)); | 331 parser.Decode(&input.front(), input.size(), &frames)); |
332 EXPECT_EQ(kFrameHeaderTests[i].failed, parser.failed()); | 332 EXPECT_EQ(kFrameHeaderTests[i].failed, parser.failed()); |
333 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.error_code()); | |
333 if (kFrameHeaderTests[i].failed) { | 334 if (kFrameHeaderTests[i].failed) { |
334 EXPECT_EQ(0u, frames.size()); | 335 EXPECT_EQ(0u, frames.size()); |
335 } else { | 336 } else { |
336 EXPECT_EQ(1u, frames.size()); | 337 EXPECT_EQ(1u, frames.size()); |
337 } | 338 } |
338 if (frames.size() != 1u) | 339 if (frames.size() != 1u) |
339 continue; | 340 continue; |
340 WebSocketFrameChunk* frame = frames[0]; | 341 WebSocketFrameChunk* frame = frames[0]; |
341 EXPECT_TRUE(frame != NULL); | 342 EXPECT_TRUE(frame != NULL); |
342 if (!frame) | 343 if (!frame) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
380 WebSocketFrameParser parser; | 381 WebSocketFrameParser parser; |
381 | 382 |
382 ScopedVector<WebSocketFrameChunk> frames; | 383 ScopedVector<WebSocketFrameChunk> frames; |
383 // Feed each byte to the parser to see if the parser behaves correctly | 384 // Feed each byte to the parser to see if the parser behaves correctly |
384 // when it receives partial frame header. | 385 // when it receives partial frame header. |
385 size_t last_byte_offset = frame_header_length - 1; | 386 size_t last_byte_offset = frame_header_length - 1; |
386 for (size_t j = 0; j < frame_header_length; ++j) { | 387 for (size_t j = 0; j < frame_header_length; ++j) { |
387 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset; | 388 bool failed = kFrameHeaderTests[i].failed && j == last_byte_offset; |
388 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); | 389 EXPECT_EQ(!failed, parser.Decode(frame_header + j, 1, &frames)); |
389 EXPECT_EQ(failed, parser.failed()); | 390 EXPECT_EQ(failed, parser.failed()); |
391 if (failed) | |
392 EXPECT_EQ(kFrameHeaderTests[i].error_code, parser.error_code()); | |
393 else | |
394 EXPECT_EQ(net::WS_OK, parser.error_code()); | |
mmenke
2012/08/01 14:44:59
nit: Use braces here (And please add them just be
Takashi Toyoshima
2012/08/02 08:11:35
Done.
| |
390 if (!kFrameHeaderTests[i].failed && j == last_byte_offset) | 395 if (!kFrameHeaderTests[i].failed && j == last_byte_offset) |
391 EXPECT_EQ(1u, frames.size()); | 396 EXPECT_EQ(1u, frames.size()); |
392 else | 397 else |
393 EXPECT_EQ(0u, frames.size()); | 398 EXPECT_EQ(0u, frames.size()); |
394 } | 399 } |
395 if (frames.size() != 1u) | 400 if (frames.size() != 1u) |
396 continue; | 401 continue; |
397 WebSocketFrameChunk* frame = frames[0]; | 402 WebSocketFrameChunk* frame = frames[0]; |
398 EXPECT_TRUE(frame != NULL); | 403 EXPECT_TRUE(frame != NULL); |
399 if (!frame) | 404 if (!frame) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 for (int i = 0; i < kNumTests; ++i) { | 443 for (int i = 0; i < kNumTests; ++i) { |
439 const char* frame_header = kTests[i].frame_header; | 444 const char* frame_header = kTests[i].frame_header; |
440 size_t frame_header_length = kTests[i].frame_header_length; | 445 size_t frame_header_length = kTests[i].frame_header_length; |
441 | 446 |
442 WebSocketFrameParser parser; | 447 WebSocketFrameParser parser; |
443 | 448 |
444 ScopedVector<WebSocketFrameChunk> frames; | 449 ScopedVector<WebSocketFrameChunk> frames; |
445 EXPECT_FALSE(parser.failed()); | 450 EXPECT_FALSE(parser.failed()); |
446 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); | 451 EXPECT_FALSE(parser.Decode(frame_header, frame_header_length, &frames)); |
447 EXPECT_TRUE(parser.failed()); | 452 EXPECT_TRUE(parser.failed()); |
453 EXPECT_EQ(net::WS_ERR_PROTOCOL_ERROR, parser.error_code()); | |
448 EXPECT_EQ(0u, frames.size()); | 454 EXPECT_EQ(0u, frames.size()); |
449 | 455 |
450 // Once the parser has failed, it no longer accepts any input (even if | 456 // Once the parser has failed, it no longer accepts any input (even if |
451 // the input is empty). | 457 // the input is empty). |
452 EXPECT_FALSE(parser.Decode("", 0, &frames)); | 458 EXPECT_FALSE(parser.Decode("", 0, &frames)); |
453 EXPECT_TRUE(parser.failed()); | 459 EXPECT_TRUE(parser.failed()); |
460 EXPECT_EQ(net::WS_ERR_PROTOCOL_ERROR, parser.error_code()); | |
454 EXPECT_EQ(0u, frames.size()); | 461 EXPECT_EQ(0u, frames.size()); |
455 } | 462 } |
456 } | 463 } |
457 | 464 |
458 TEST(WebSocketFrameParserTest, FrameTypes) { | 465 TEST(WebSocketFrameParserTest, FrameTypes) { |
459 struct TestCase { | 466 struct TestCase { |
460 const char* frame_header; | 467 const char* frame_header; |
461 size_t frame_header_length; | 468 size_t frame_header_length; |
462 WebSocketFrameHeader::OpCode opcode; | 469 WebSocketFrameHeader::OpCode opcode; |
463 }; | 470 }; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
566 EXPECT_EQ(reserved1, header->reserved1); | 573 EXPECT_EQ(reserved1, header->reserved1); |
567 EXPECT_EQ(reserved2, header->reserved2); | 574 EXPECT_EQ(reserved2, header->reserved2); |
568 EXPECT_EQ(reserved3, header->reserved3); | 575 EXPECT_EQ(reserved3, header->reserved3); |
569 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); | 576 EXPECT_EQ(WebSocketFrameHeader::kOpCodeText, header->opcode); |
570 EXPECT_FALSE(header->masked); | 577 EXPECT_FALSE(header->masked); |
571 EXPECT_EQ(0u, header->payload_length); | 578 EXPECT_EQ(0u, header->payload_length); |
572 } | 579 } |
573 } | 580 } |
574 | 581 |
575 } // namespace net | 582 } // namespace net |
OLD | NEW |