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

Side by Side Diff: net/spdy/spdy_framer_test.cc

Issue 12224019: Add SpdyFramerDebugVisitorInterface for later usage in stats collecting (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test failures, add OVERRIDE Created 7 years, 10 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
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <algorithm> 5 #include <algorithm>
6 #include <iostream> 6 #include <iostream>
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "net/spdy/spdy_framer.h" 10 #include "net/spdy/spdy_framer.h"
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 if (identical) return; 294 if (identical) return;
295 ADD_FAILURE() 295 ADD_FAILURE()
296 << "Description:\n" 296 << "Description:\n"
297 << description 297 << description
298 << "\n\nExpected:\n" 298 << "\n\nExpected:\n"
299 << HexDumpWithMarks(expected, expected_len, marks.get(), max_len) 299 << HexDumpWithMarks(expected, expected_len, marks.get(), max_len)
300 << "\nActual:\n" 300 << "\nActual:\n"
301 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len); 301 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
302 } 302 }
303 303
304 class TestSpdyVisitor : public SpdyFramerVisitorInterface { 304 class TestSpdyVisitor : public SpdyFramerVisitorInterface,
305 public SpdyFramerDebugVisitorInterface {
305 public: 306 public:
306 static const size_t kDefaultHeaderBufferSize = 16 * 1024; 307 static const size_t kDefaultHeaderBufferSize = 16 * 1024;
307 static const size_t kDefaultCredentialBufferSize = 16 * 1024; 308 static const size_t kDefaultCredentialBufferSize = 16 * 1024;
308 309
309 explicit TestSpdyVisitor(int version) 310 explicit TestSpdyVisitor(int version)
310 : framer_(version), 311 : framer_(version),
311 use_compression_(false), 312 use_compression_(false),
312 error_count_(0), 313 error_count_(0),
313 syn_frame_count_(0), 314 syn_frame_count_(0),
314 syn_reply_frame_count_(0), 315 syn_reply_frame_count_(0),
315 headers_frame_count_(0), 316 headers_frame_count_(0),
316 goaway_count_(0), 317 goaway_count_(0),
317 setting_count_(0), 318 setting_count_(0),
318 data_bytes_(0), 319 data_bytes_(0),
319 fin_frame_count_(0), 320 fin_frame_count_(0),
320 fin_flag_count_(0), 321 fin_flag_count_(0),
321 zero_length_data_frame_count_(0), 322 zero_length_data_frame_count_(0),
322 header_blocks_count_(0), 323 header_blocks_count_(0),
323 control_frame_header_data_count_(0), 324 control_frame_header_data_count_(0),
324 zero_length_control_frame_header_data_count_(0), 325 zero_length_control_frame_header_data_count_(0),
325 data_frame_count_(0), 326 data_frame_count_(0),
327 last_decompressed_size_(0),
328 last_compressed_size_(0),
326 header_buffer_(new char[kDefaultHeaderBufferSize]), 329 header_buffer_(new char[kDefaultHeaderBufferSize]),
327 header_buffer_length_(0), 330 header_buffer_length_(0),
328 header_buffer_size_(kDefaultHeaderBufferSize), 331 header_buffer_size_(kDefaultHeaderBufferSize),
329 header_stream_id_(-1), 332 header_stream_id_(-1),
330 header_control_type_(NUM_CONTROL_FRAME_TYPES), 333 header_control_type_(NUM_CONTROL_FRAME_TYPES),
331 header_buffer_valid_(false), 334 header_buffer_valid_(false),
332 credential_buffer_(new char[kDefaultCredentialBufferSize]), 335 credential_buffer_(new char[kDefaultCredentialBufferSize]),
333 credential_buffer_length_(0), 336 credential_buffer_length_(0),
334 credential_buffer_size_(kDefaultCredentialBufferSize) { 337 credential_buffer_size_(kDefaultCredentialBufferSize) {
335 } 338 }
336 339
337 void OnError(SpdyFramer* f) { 340 virtual void OnError(SpdyFramer* f) OVERRIDE {
338 LOG(INFO) << "SpdyFramer Error: " 341 LOG(INFO) << "SpdyFramer Error: "
339 << SpdyFramer::ErrorCodeToString(f->error_code()); 342 << SpdyFramer::ErrorCodeToString(f->error_code());
340 error_count_++; 343 error_count_++;
341 } 344 }
342 345
343 void OnDataFrameHeader(const SpdyDataFrame* frame) { 346 virtual void OnDataFrameHeader(const SpdyDataFrame* frame) OVERRIDE {
344 data_frame_count_++; 347 data_frame_count_++;
345 header_stream_id_ = frame->stream_id(); 348 header_stream_id_ = frame->stream_id();
346 } 349 }
347 350
348 void OnStreamFrameData(SpdyStreamId stream_id, 351 virtual void OnStreamFrameData(SpdyStreamId stream_id,
349 const char* data, 352 const char* data,
350 size_t len, 353 size_t len,
351 SpdyDataFlags flags) { 354 SpdyDataFlags flags) OVERRIDE {
352 EXPECT_EQ(header_stream_id_, stream_id); 355 EXPECT_EQ(header_stream_id_, stream_id);
353 if (len == 0) 356 if (len == 0)
354 ++zero_length_data_frame_count_; 357 ++zero_length_data_frame_count_;
355 358
356 data_bytes_ += len; 359 data_bytes_ += len;
357 std::cerr << "OnStreamFrameData(" << stream_id << ", \""; 360 std::cerr << "OnStreamFrameData(" << stream_id << ", \"";
358 if (len > 0) { 361 if (len > 0) {
359 for (size_t i = 0 ; i < len; ++i) { 362 for (size_t i = 0 ; i < len; ++i) {
360 std::cerr << std::hex << (0xFF & (unsigned int)data[i]) << std::dec; 363 std::cerr << std::hex << (0xFF & (unsigned int)data[i]) << std::dec;
361 } 364 }
362 } 365 }
363 std::cerr << "\", " << len << ")\n"; 366 std::cerr << "\", " << len << ")\n";
364 } 367 }
365 368
366 virtual void OnSynStream(SpdyStreamId stream_id, 369 virtual void OnSynStream(SpdyStreamId stream_id,
367 SpdyStreamId associated_stream_id, 370 SpdyStreamId associated_stream_id,
368 SpdyPriority priority, 371 SpdyPriority priority,
369 uint8 credential_slot, 372 uint8 credential_slot,
370 bool fin, 373 bool fin,
371 bool unidirectional) { 374 bool unidirectional) OVERRIDE {
372 syn_frame_count_++; 375 syn_frame_count_++;
373 InitHeaderStreaming(SYN_STREAM, stream_id); 376 InitHeaderStreaming(SYN_STREAM, stream_id);
374 if (fin) { 377 if (fin) {
375 fin_flag_count_++; 378 fin_flag_count_++;
376 } 379 }
377 } 380 }
378 381
379 virtual void OnSynReply(SpdyStreamId stream_id, bool fin) { 382 virtual void OnSynReply(SpdyStreamId stream_id, bool fin) OVERRIDE {
380 syn_reply_frame_count_++; 383 syn_reply_frame_count_++;
381 InitHeaderStreaming(HEADERS, stream_id); 384 InitHeaderStreaming(HEADERS, stream_id);
382 if (fin) { 385 if (fin) {
383 fin_flag_count_++; 386 fin_flag_count_++;
384 } 387 }
385 } 388 }
386 389
387 virtual void OnHeaders(SpdyStreamId stream_id, bool fin) { 390 virtual void OnHeaders(SpdyStreamId stream_id, bool fin) OVERRIDE {
388 headers_frame_count_++; 391 headers_frame_count_++;
389 InitHeaderStreaming(SYN_REPLY, stream_id); 392 InitHeaderStreaming(SYN_REPLY, stream_id);
390 if (fin) { 393 if (fin) {
391 fin_flag_count_++; 394 fin_flag_count_++;
392 } 395 }
393 } 396 }
394 397
395 virtual void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { 398 virtual void OnSetting(
399 SpdySettingsIds id, uint8 flags, uint32 value) OVERRIDE {
396 setting_count_++; 400 setting_count_++;
397 } 401 }
398 402
399 virtual void OnControlFrameCompressed( 403 virtual void OnControlFrameCompressed(
400 const SpdyControlFrame& uncompressed_frame, 404 const SpdyControlFrame& uncompressed_frame,
401 const SpdyControlFrame& compressed_frame) { 405 const SpdyControlFrame& compressed_frame) OVERRIDE {
402 } 406 }
403 407
404 virtual void OnPing(uint32 unique_id) { 408 virtual void OnPing(uint32 unique_id) OVERRIDE {
405 DLOG(FATAL); 409 DLOG(FATAL);
406 } 410 }
407 411
408 virtual void OnRstStream(SpdyStreamId stream_id, SpdyStatusCodes status) { 412 virtual void OnRstStream(SpdyStreamId stream_id,
413 SpdyStatusCodes status) OVERRIDE {
409 fin_frame_count_++; 414 fin_frame_count_++;
410 } 415 }
411 416
412 virtual void OnGoAway(SpdyStreamId last_accepted_stream_id, 417 virtual void OnGoAway(SpdyStreamId last_accepted_stream_id,
413 SpdyGoAwayStatus status) { 418 SpdyGoAwayStatus status) OVERRIDE {
414 goaway_count_++; 419 goaway_count_++;
415 } 420 }
416 421
417 virtual void OnWindowUpdate(SpdyStreamId stream_id, int delta_window_size) { 422 virtual void OnWindowUpdate(SpdyStreamId stream_id,
423 int delta_window_size) OVERRIDE {
418 last_window_update_stream_ = stream_id; 424 last_window_update_stream_ = stream_id;
419 last_window_update_delta_ = delta_window_size; 425 last_window_update_delta_ = delta_window_size;
420 } 426 }
421 427
422 bool OnControlFrameHeaderData(SpdyStreamId stream_id, 428 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id,
423 const char* header_data, 429 const char* header_data,
424 size_t len) { 430 size_t len) OVERRIDE {
425 ++control_frame_header_data_count_; 431 ++control_frame_header_data_count_;
426 CHECK_EQ(header_stream_id_, stream_id); 432 CHECK_EQ(header_stream_id_, stream_id);
427 if (len == 0) { 433 if (len == 0) {
428 ++zero_length_control_frame_header_data_count_; 434 ++zero_length_control_frame_header_data_count_;
429 // Indicates end-of-header-block. 435 // Indicates end-of-header-block.
430 CHECK(header_buffer_valid_); 436 CHECK(header_buffer_valid_);
431 size_t parsed_length = framer_.ParseHeaderBlockInBuffer( 437 size_t parsed_length = framer_.ParseHeaderBlockInBuffer(
432 header_buffer_.get(), header_buffer_length_, &headers_); 438 header_buffer_.get(), header_buffer_length_, &headers_);
433 DCHECK_EQ(header_buffer_length_, parsed_length); 439 DCHECK_EQ(header_buffer_length_, parsed_length);
434 return true; 440 return true;
435 } 441 }
436 const size_t available = header_buffer_size_ - header_buffer_length_; 442 const size_t available = header_buffer_size_ - header_buffer_length_;
437 if (len > available) { 443 if (len > available) {
438 header_buffer_valid_ = false; 444 header_buffer_valid_ = false;
439 return false; 445 return false;
440 } 446 }
441 memcpy(header_buffer_.get() + header_buffer_length_, header_data, len); 447 memcpy(header_buffer_.get() + header_buffer_length_, header_data, len);
442 header_buffer_length_ += len; 448 header_buffer_length_ += len;
443 return true; 449 return true;
444 } 450 }
445 451
446 bool OnCredentialFrameData(const char* credential_data, 452 virtual bool OnCredentialFrameData(const char* credential_data,
447 size_t len) { 453 size_t len) OVERRIDE {
448 if (len == 0) { 454 if (len == 0) {
449 if (!framer_.ParseCredentialData(credential_buffer_.get(), 455 if (!framer_.ParseCredentialData(credential_buffer_.get(),
450 credential_buffer_length_, 456 credential_buffer_length_,
451 &credential_)) { 457 &credential_)) {
452 ++error_count_; 458 ++error_count_;
453 } 459 }
454 return true; 460 return true;
455 } 461 }
456 const size_t available = 462 const size_t available =
457 credential_buffer_size_ - credential_buffer_length_; 463 credential_buffer_size_ - credential_buffer_length_;
458 if (len > available) { 464 if (len > available) {
459 return false; 465 return false;
460 } 466 }
461 memcpy(credential_buffer_.get() + credential_buffer_length_, 467 memcpy(credential_buffer_.get() + credential_buffer_length_,
462 credential_data, len); 468 credential_data, len);
463 credential_buffer_length_ += len; 469 credential_buffer_length_ += len;
464 return true; 470 return true;
465 } 471 }
466 472
473 virtual void OnCompressedHeaderBlock(size_t decompressed_size,
474 size_t compressed_size) OVERRIDE {
475 last_decompressed_size_ = decompressed_size;
476 last_compressed_size_ = compressed_size;
477 }
478
467 // Convenience function which runs a framer simulation with particular input. 479 // Convenience function which runs a framer simulation with particular input.
468 void SimulateInFramer(const unsigned char* input, size_t size) { 480 void SimulateInFramer(const unsigned char* input, size_t size) {
469 framer_.set_enable_compression(use_compression_); 481 framer_.set_enable_compression(use_compression_);
470 framer_.set_visitor(this); 482 framer_.set_visitor(this);
471 size_t input_remaining = size; 483 size_t input_remaining = size;
472 const char* input_ptr = reinterpret_cast<const char*>(input); 484 const char* input_ptr = reinterpret_cast<const char*>(input);
473 while (input_remaining > 0 && 485 while (input_remaining > 0 &&
474 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { 486 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) {
475 // To make the tests more interesting, we feed random (amd small) chunks 487 // To make the tests more interesting, we feed random (amd small) chunks
476 // into the framer. This simulates getting strange-sized reads from 488 // into the framer. This simulates getting strange-sized reads from
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 int last_window_update_delta_; 536 int last_window_update_delta_;
525 int data_bytes_; 537 int data_bytes_;
526 int fin_frame_count_; // The count of RST_STREAM type frames received. 538 int fin_frame_count_; // The count of RST_STREAM type frames received.
527 int fin_flag_count_; // The count of frames with the FIN flag set. 539 int fin_flag_count_; // The count of frames with the FIN flag set.
528 int zero_length_data_frame_count_; // The count of zero-length data frames. 540 int zero_length_data_frame_count_; // The count of zero-length data frames.
529 int header_blocks_count_; 541 int header_blocks_count_;
530 int control_frame_header_data_count_; // The count of chunks received. 542 int control_frame_header_data_count_; // The count of chunks received.
531 // The count of zero-length control frame header data chunks received. 543 // The count of zero-length control frame header data chunks received.
532 int zero_length_control_frame_header_data_count_; 544 int zero_length_control_frame_header_data_count_;
533 int data_frame_count_; 545 int data_frame_count_;
546 size_t last_decompressed_size_;
547 size_t last_compressed_size_;
534 548
535 // Header block streaming state: 549 // Header block streaming state:
536 scoped_array<char> header_buffer_; 550 scoped_array<char> header_buffer_;
537 size_t header_buffer_length_; 551 size_t header_buffer_length_;
538 size_t header_buffer_size_; 552 size_t header_buffer_size_;
539 SpdyStreamId header_stream_id_; 553 SpdyStreamId header_stream_id_;
540 SpdyControlType header_control_type_; 554 SpdyControlType header_control_type_;
541 bool header_buffer_valid_; 555 bool header_buffer_valid_;
542 SpdyHeaderBlock headers_; 556 SpdyHeaderBlock headers_;
543 557
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 899
886 TEST_P(SpdyFramerTest, BasicCompression) { 900 TEST_P(SpdyFramerTest, BasicCompression) {
887 SpdyHeaderBlock headers; 901 SpdyHeaderBlock headers;
888 headers["server"] = "SpdyServer 1.0"; 902 headers["server"] = "SpdyServer 1.0";
889 headers["date"] = "Mon 12 Jan 2009 12:12:12 PST"; 903 headers["date"] = "Mon 12 Jan 2009 12:12:12 PST";
890 headers["status"] = "200"; 904 headers["status"] = "200";
891 headers["version"] = "HTTP/1.1"; 905 headers["version"] = "HTTP/1.1";
892 headers["content-type"] = "text/html"; 906 headers["content-type"] = "text/html";
893 headers["content-length"] = "12"; 907 headers["content-length"] = "12";
894 908
909 TestSpdyVisitor visitor(spdy_version_);
895 SpdyFramer framer(spdy_version_); 910 SpdyFramer framer(spdy_version_);
911 framer.set_debug_visitor(&visitor);
896 framer.set_enable_compression(true); 912 framer.set_enable_compression(true);
897 scoped_ptr<SpdySynStreamControlFrame> frame1( 913 scoped_ptr<SpdySynStreamControlFrame> frame1(
898 framer.CreateSynStream(1, // stream id 914 framer.CreateSynStream(1, // stream id
899 0, // associated stream id 915 0, // associated stream id
900 1, // priority 916 1, // priority
901 0, // credential slot 917 0, // credential slot
902 CONTROL_FLAG_NONE, 918 CONTROL_FLAG_NONE,
903 true, // compress 919 true, // compress
904 &headers)); 920 &headers));
921 if (IsSpdy2()) {
922 EXPECT_EQ(139u, visitor.last_decompressed_size_);
923 EXPECT_EQ(
924 #if defined(USE_SYSTEM_ZLIB)
925 93u,
akalin 2013/02/06 00:25:07 I do it this way instead of just copying the line
akalin 2013/02/06 00:29:01 Oh. looks like only "decompressed" actually chang
Ryan Hamilton 2013/02/06 00:32:30 Either way is fine with me.
926 #else // !defined(USE_SYSTEM_ZLIB)
927 135u,
928 #endif // !defined(USE_SYSTEM_ZLIB)
929 visitor.last_compressed_size_);
930 EXPECT_EQ(135u, visitor.last_compressed_size_);
931 } else {
932 EXPECT_EQ(165u, visitor.last_decompressed_size_);
933 EXPECT_EQ(
934 #if defined(USE_SYSTEM_ZLIB)
935 72u,
936 #else // !defined(USE_SYSTEM_ZLIB)
937 117u,
938 #endif // !defined(USE_SYSTEM_ZLIB)
939 visitor.last_compressed_size_);
940 }
905 scoped_ptr<SpdySynStreamControlFrame> frame2( 941 scoped_ptr<SpdySynStreamControlFrame> frame2(
906 framer.CreateSynStream(1, // stream id 942 framer.CreateSynStream(1, // stream id
907 0, // associated stream id 943 0, // associated stream id
908 1, // priority 944 1, // priority
909 0, // credential slot 945 0, // credential slot
910 CONTROL_FLAG_NONE, 946 CONTROL_FLAG_NONE,
911 true, // compress 947 true, // compress
912 &headers)); 948 &headers));
913 949
914 // Expect the second frame to be more compact than the first. 950 // Expect the second frame to be more compact than the first.
(...skipping 2287 matching lines...) Expand 10 before | Expand all | Expand 10 after
3202 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); 3238 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304);
3203 3239
3204 SettingsFlagsAndId id_and_flags = 3240 SettingsFlagsAndId id_and_flags =
3205 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); 3241 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat);
3206 EXPECT_EQ(kId, id_and_flags.id()); 3242 EXPECT_EQ(kId, id_and_flags.id());
3207 EXPECT_EQ(kFlags, id_and_flags.flags()); 3243 EXPECT_EQ(kFlags, id_and_flags.flags());
3208 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); 3244 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_));
3209 } 3245 }
3210 3246
3211 } // namespace net 3247 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698