Chromium Code Reviews| 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 <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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |