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

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

Issue 10824081: Add WebSocketError to indicate decoding failure reason (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW
« net/websockets/websocket_frame_parser.cc ('K') | « net/websockets/websocket_frame_parser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698