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 |