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 | 8 |
| 8 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 9 #include "net/spdy/spdy_framer.h" | 10 #include "net/spdy/spdy_framer.h" |
| 10 #include "net/spdy/spdy_protocol.h" | 11 #include "net/spdy/spdy_protocol.h" |
| 11 #include "net/spdy/spdy_frame_builder.h" | 12 #include "net/spdy/spdy_frame_builder.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/platform_test.h" | 14 #include "testing/platform_test.h" |
| 14 | 15 |
| 16 using std::string; | |
| 17 using std::max; | |
| 18 using std::min; | |
| 19 using std::numeric_limits; | |
| 15 using testing::_; | 20 using testing::_; |
| 16 | 21 |
| 17 namespace net { | 22 namespace net { |
| 18 | 23 |
| 19 namespace test { | 24 namespace test { |
| 20 | 25 |
| 21 static const size_t kMaxDecompressedSize = 1024; | 26 static const size_t kMaxDecompressedSize = 1024; |
| 22 | 27 |
| 23 class MockVisitor : public SpdyFramerVisitorInterface { | 28 class MockVisitor : public SpdyFramerVisitorInterface { |
| 24 public: | 29 public: |
| 25 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); | 30 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); |
| 26 MOCK_METHOD1(OnControl, void(const SpdyControlFrame* frame)); | 31 MOCK_METHOD1(OnControl, void(const SpdyControlFrame* frame)); |
| 27 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, | 32 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, |
| 28 const char* header_data, | 33 const char* header_data, |
| 29 size_t len)); | 34 size_t len)); |
| 30 MOCK_METHOD2(OnCredentialFrameData, bool(const char* header_data, | 35 MOCK_METHOD2(OnCredentialFrameData, bool(const char* header_data, |
| 31 size_t len)); | 36 size_t len)); |
| 32 MOCK_METHOD1(OnDataFrameHeader, void(const SpdyDataFrame* frame)); | 37 MOCK_METHOD1(OnDataFrameHeader, void(const SpdyDataFrame* frame)); |
| 33 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId stream_id, | 38 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId stream_id, |
| 34 const char* data, | 39 const char* data, |
| 35 size_t len)); | 40 size_t len)); |
| 36 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); | 41 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); |
| 37 }; | 42 }; |
| 38 | 43 |
| 39 class SpdyFramerTestUtil { | 44 class SpdyFramerTestUtil { |
| 40 public: | 45 public: |
| 41 // Decompress a single frame using the decompression context held by | 46 // Decompress a single frame using the decompression context held by |
| 42 // the SpdyFramer. The implemention will CHECK fail if the input is anything | 47 // the SpdyFramer. The implemention is meant for use only in tests |
|
ramant (doing other things)
2012/04/24 20:53:37
nit: two spaces after period. As you are cleaning
| |
| 43 // other than a single, well-formed compressed frame. | 48 // and will CHECK fail if the input is anything other than a single, |
| 49 // well-formed compressed frame. | |
| 44 // | 50 // |
| 45 // Returns a new decompressed SpdyFrame. | 51 // Returns a new decompressed SpdyFrame. |
| 46 template<class SpdyFrameType> static SpdyFrame* DecompressFrame( | 52 template<class SpdyFrameType> static SpdyFrame* DecompressFrame( |
| 47 SpdyFramer* framer, const SpdyFrameType& frame) { | 53 SpdyFramer* framer, const SpdyFrameType& frame) { |
| 48 DecompressionVisitor visitor; | 54 DecompressionVisitor visitor; |
| 49 framer->set_visitor(&visitor); | 55 framer->set_visitor(&visitor); |
| 50 size_t input_size = frame.length() + SpdyFrame::kHeaderSize; | 56 size_t input_size = frame.length() + SpdyFrame::kHeaderSize; |
| 51 CHECK_EQ(input_size, framer->ProcessInput(frame.data(), input_size)); | 57 CHECK_EQ(input_size, framer->ProcessInput(frame.data(), input_size)); |
| 52 CHECK_EQ(SpdyFramer::SPDY_RESET, framer->state()); | 58 CHECK_EQ(SpdyFramer::SPDY_RESET, framer->state()); |
| 53 framer->set_visitor(NULL); | 59 framer->set_visitor(NULL); |
| 54 | 60 |
| 55 char* buffer = visitor.ReleaseBuffer(); | 61 char* buffer = visitor.ReleaseBuffer(); |
| 56 CHECK(buffer); | 62 CHECK(buffer != NULL); |
| 57 SpdyFrame* decompressed_frame = new SpdyFrame(buffer, true); | 63 SpdyFrame* decompressed_frame = new SpdyFrame(buffer, true); |
| 58 decompressed_frame->set_length(visitor.size() - SpdyFrame::kHeaderSize); | 64 decompressed_frame->set_length(visitor.size() - SpdyFrame::kHeaderSize); |
| 59 return decompressed_frame; | 65 return decompressed_frame; |
| 60 } | 66 } |
| 61 | 67 |
| 62 class DecompressionVisitor : public SpdyFramerVisitorInterface { | 68 class DecompressionVisitor : public SpdyFramerVisitorInterface { |
| 63 public: | 69 public: |
| 64 DecompressionVisitor() | 70 DecompressionVisitor() |
| 65 : buffer_(NULL), size_(0), finished_(false) { | 71 : buffer_(NULL), size_(0), finished_(false) { |
| 66 } | 72 } |
| 67 | 73 |
| 68 virtual void OnControl(const SpdyControlFrame* frame) { | 74 virtual void OnControl(const SpdyControlFrame* frame) { |
| 69 CHECK(frame->has_header_block()); | 75 CHECK(frame->has_header_block()); |
| 70 CHECK(!buffer_.get()); | 76 CHECK(buffer_.get() == NULL); |
| 71 CHECK_EQ(size_, 0u); | 77 CHECK_EQ(0u, size_); |
| 72 CHECK(!finished_); | 78 CHECK(!finished_); |
| 73 | 79 |
| 74 int32 control_frame_header_size = 0; | 80 int32 control_frame_header_size = 0; |
| 75 switch (frame->type()) { | 81 switch (frame->type()) { |
| 76 case SYN_STREAM: | 82 case SYN_STREAM: |
| 77 control_frame_header_size = SpdySynStreamControlFrame::size(); | 83 control_frame_header_size = SpdySynStreamControlFrame::size(); |
| 78 break; | 84 break; |
| 79 case SYN_REPLY: | 85 case SYN_REPLY: |
| 80 control_frame_header_size = SpdySynReplyControlFrame::size(); | 86 control_frame_header_size = SpdySynReplyControlFrame::size(); |
| 81 break; | 87 break; |
| 82 case HEADERS: | 88 case HEADERS: |
| 83 control_frame_header_size = SpdyHeadersControlFrame::size(); | 89 control_frame_header_size = SpdyHeadersControlFrame::size(); |
| 84 break; | 90 break; |
| 85 default: | 91 default: |
| 86 LOG(FATAL); | 92 LOG(FATAL); |
| 87 return; | |
| 88 } | 93 } |
| 89 | 94 |
| 90 // Allocate space for the frame, and the copy header over. | 95 // Allocate space for the frame, and the copy header over. |
| 91 buffer_.reset(new char[kMaxDecompressedSize]); | 96 buffer_.reset(new char[kMaxDecompressedSize]); |
| 92 memcpy(buffer_.get(), frame->data(), control_frame_header_size); | 97 memcpy(buffer_.get(), frame->data(), control_frame_header_size); |
| 93 size_ += control_frame_header_size; | 98 size_ += control_frame_header_size; |
| 94 } | 99 } |
| 95 | 100 |
| 96 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id, | 101 virtual bool OnControlFrameHeaderData(SpdyStreamId stream_id, |
| 97 const char* header_data, | 102 const char* header_data, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 scoped_array<char> buffer_; | 147 scoped_array<char> buffer_; |
| 143 size_t size_; | 148 size_t size_; |
| 144 bool finished_; | 149 bool finished_; |
| 145 | 150 |
| 146 DISALLOW_COPY_AND_ASSIGN(DecompressionVisitor); | 151 DISALLOW_COPY_AND_ASSIGN(DecompressionVisitor); |
| 147 }; | 152 }; |
| 148 | 153 |
| 149 DISALLOW_COPY_AND_ASSIGN(SpdyFramerTestUtil); | 154 DISALLOW_COPY_AND_ASSIGN(SpdyFramerTestUtil); |
| 150 }; | 155 }; |
| 151 | 156 |
| 152 std::string HexDumpWithMarks(const unsigned char* data, int length, | 157 string HexDumpWithMarks(const unsigned char* data, int length, |
| 153 const bool* marks, int mark_length) { | 158 const bool* marks, int mark_length) { |
| 154 static const char kHexChars[] = "0123456789abcdef"; | 159 static const char kHexChars[] = "0123456789abcdef"; |
| 155 static const int kColumns = 4; | 160 static const int kColumns = 4; |
| 156 | 161 |
| 157 const int kSizeLimit = 1024; | 162 const int kSizeLimit = 1024; |
| 158 if (length > kSizeLimit || mark_length > kSizeLimit) { | 163 if (length > kSizeLimit || mark_length > kSizeLimit) { |
| 159 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes."; | 164 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes."; |
| 160 length = std::min(length, kSizeLimit); | 165 length = min(length, kSizeLimit); |
| 161 mark_length = std::min(mark_length, kSizeLimit); | 166 mark_length = min(mark_length, kSizeLimit); |
| 162 } | 167 } |
| 163 | 168 |
| 164 std::string hex; | 169 string hex; |
| 165 for (const unsigned char* row = data; length > 0; | 170 for (const unsigned char* row = data; length > 0; |
| 166 row += kColumns, length -= kColumns) { | 171 row += kColumns, length -= kColumns) { |
| 167 for (const unsigned char *p = row; p < row + 4; ++p) { | 172 for (const unsigned char *p = row; p < row + 4; ++p) { |
| 168 if (p < row + length) { | 173 if (p < row + length) { |
| 169 const bool mark = | 174 const bool mark = |
| 170 (marks && (p - data) < mark_length && marks[p - data]); | 175 (marks && (p - data) < mark_length && marks[p - data]); |
| 171 hex += mark ? '*' : ' '; | 176 hex += mark ? '*' : ' '; |
| 172 hex += kHexChars[(*p & 0xf0) >> 4]; | 177 hex += kHexChars[(*p & 0xf0) >> 4]; |
| 173 hex += kHexChars[*p & 0x0f]; | 178 hex += kHexChars[*p & 0x0f]; |
| 174 hex += mark ? '*' : ' '; | 179 hex += mark ? '*' : ' '; |
| 175 } else { | 180 } else { |
| 176 hex += " "; | 181 hex += " "; |
| 177 } | 182 } |
| 178 } | 183 } |
| 179 hex = hex + " "; | 184 hex = hex + " "; |
| 180 | 185 |
| 181 for (const unsigned char *p = row; p < row + 4 && p < row + length; ++p) | 186 for (const unsigned char *p = row; p < row + 4 && p < row + length; ++p) |
| 182 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.'; | 187 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.'; |
| 183 | 188 |
| 184 hex = hex + '\n'; | 189 hex = hex + '\n'; |
| 185 } | 190 } |
| 186 return hex; | 191 return hex; |
| 187 } | 192 } |
| 188 | 193 |
| 189 void CompareCharArraysWithHexError( | 194 void CompareCharArraysWithHexError( |
| 190 const std::string& description, | 195 const string& description, |
| 191 const unsigned char* actual, | 196 const unsigned char* actual, |
| 192 const int actual_len, | 197 const int actual_len, |
| 193 const unsigned char* expected, | 198 const unsigned char* expected, |
| 194 const int expected_len) { | 199 const int expected_len) { |
| 195 const int min_len = std::min(actual_len, expected_len); | 200 const int min_len = min(actual_len, expected_len); |
| 196 const int max_len = std::max(actual_len, expected_len); | 201 const int max_len = max(actual_len, expected_len); |
| 197 scoped_array<bool> marks(new bool[max_len]); | 202 scoped_array<bool> marks(new bool[max_len]); |
| 198 bool identical = (actual_len == expected_len); | 203 bool identical = (actual_len == expected_len); |
| 199 for (int i = 0; i < min_len; ++i) { | 204 for (int i = 0; i < min_len; ++i) { |
| 200 if (actual[i] != expected[i]) { | 205 if (actual[i] != expected[i]) { |
| 201 marks[i] = true; | 206 marks[i] = true; |
| 202 identical = false; | 207 identical = false; |
| 203 } else { | 208 } else { |
| 204 marks[i] = false; | 209 marks[i] = false; |
| 205 } | 210 } |
| 206 } | 211 } |
| 207 for (int i = min_len; i < max_len; ++i) { | 212 for (int i = min_len; i < max_len; ++i) { |
| 208 marks[i] = true; | 213 marks[i] = true; |
| 209 } | 214 } |
| 210 if (identical) return; | 215 if (identical) return; |
| 211 ADD_FAILURE() | 216 ADD_FAILURE() |
| 212 << "Description:\n" | 217 << "Description:\n" |
| 213 << description | 218 << description |
| 214 << "\n\nExpected:\n" | 219 << "\n\nExpected:\n" |
| 215 << HexDumpWithMarks(expected, expected_len, marks.get(), max_len) | 220 << HexDumpWithMarks(expected, expected_len, marks.get(), max_len) |
| 216 << "\nActual:\n" | 221 << "\nActual:\n" |
| 217 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len); | 222 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len); |
| 218 } | 223 } |
| 219 | 224 |
| 220 class TestSpdyVisitor : public SpdyFramerVisitorInterface { | 225 class TestSpdyVisitor : public SpdyFramerVisitorInterface { |
| 221 public: | 226 public: |
| 222 static const size_t kDefaultHeaderBufferSize = 64 * 1024; | 227 static const size_t kDefaultHeaderBufferSize = 16 * 1024; |
| 223 static const size_t kDefaultCredentialBufferSize = 16 * 1024; | 228 static const size_t kDefaultCredentialBufferSize = 16 * 1024; |
| 224 | 229 |
| 225 TestSpdyVisitor(int version) | 230 explicit TestSpdyVisitor(int version) |
| 226 : framer_(version), | 231 : framer_(version), |
| 227 use_compression_(false), | 232 use_compression_(false), |
| 228 error_count_(0), | 233 error_count_(0), |
| 229 syn_frame_count_(0), | 234 syn_frame_count_(0), |
| 230 syn_reply_frame_count_(0), | 235 syn_reply_frame_count_(0), |
| 231 headers_frame_count_(0), | 236 headers_frame_count_(0), |
| 232 goaway_count_(0), | 237 goaway_count_(0), |
| 233 credential_count_(0), | 238 credential_count_(0), |
| 234 settings_frame_count_(0), | 239 settings_frame_count_(0), |
| 235 setting_count_(0), | 240 setting_count_(0), |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 framer_.set_visitor(this); | 373 framer_.set_visitor(this); |
| 369 size_t input_remaining = size; | 374 size_t input_remaining = size; |
| 370 const char* input_ptr = reinterpret_cast<const char*>(input); | 375 const char* input_ptr = reinterpret_cast<const char*>(input); |
| 371 while (input_remaining > 0 && | 376 while (input_remaining > 0 && |
| 372 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { | 377 framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { |
| 373 // To make the tests more interesting, we feed random (amd small) chunks | 378 // To make the tests more interesting, we feed random (amd small) chunks |
| 374 // into the framer. This simulates getting strange-sized reads from | 379 // into the framer. This simulates getting strange-sized reads from |
| 375 // the socket. | 380 // the socket. |
| 376 const size_t kMaxReadSize = 32; | 381 const size_t kMaxReadSize = 32; |
| 377 size_t bytes_read = | 382 size_t bytes_read = |
| 378 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; | 383 (rand() % min(input_remaining, kMaxReadSize)) + 1; |
| 379 size_t bytes_processed = framer_.ProcessInput(input_ptr, bytes_read); | 384 size_t bytes_processed = framer_.ProcessInput(input_ptr, bytes_read); |
| 380 input_remaining -= bytes_processed; | 385 input_remaining -= bytes_processed; |
| 381 input_ptr += bytes_processed; | 386 input_ptr += bytes_processed; |
| 382 if (framer_.state() == SpdyFramer::SPDY_DONE) | 387 if (framer_.state() == SpdyFramer::SPDY_DONE) |
| 383 framer_.Reset(); | 388 framer_.Reset(); |
| 384 } | 389 } |
| 385 } | 390 } |
| 386 | 391 |
| 387 void InitHeaderStreaming(const SpdyControlFrame* frame) { | 392 void InitHeaderStreaming(const SpdyControlFrame* frame) { |
| 388 memset(header_buffer_.get(), 0, header_buffer_size_); | 393 memset(header_buffer_.get(), 0, header_buffer_size_); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 SpdyControlType header_control_type_; | 442 SpdyControlType header_control_type_; |
| 438 bool header_buffer_valid_; | 443 bool header_buffer_valid_; |
| 439 SpdyHeaderBlock headers_; | 444 SpdyHeaderBlock headers_; |
| 440 | 445 |
| 441 scoped_array<char> credential_buffer_; | 446 scoped_array<char> credential_buffer_; |
| 442 size_t credential_buffer_length_; | 447 size_t credential_buffer_length_; |
| 443 size_t credential_buffer_size_; | 448 size_t credential_buffer_size_; |
| 444 SpdyCredential credential_; | 449 SpdyCredential credential_; |
| 445 }; | 450 }; |
| 446 | 451 |
| 447 } // namespace test | 452 } // namespace net |
| 448 | 453 |
| 449 using test::CompareCharArraysWithHexError; | 454 using test::CompareCharArraysWithHexError; |
| 450 using test::SpdyFramerTestUtil; | 455 using test::SpdyFramerTestUtil; |
| 451 using test::TestSpdyVisitor; | 456 using test::TestSpdyVisitor; |
| 452 | 457 |
| 453 TEST(SpdyFrameBuilderTest, WriteLimits) { | 458 TEST(SpdyFrameBuilderTest, WriteLimits) { |
| 454 SpdyFrameBuilder builder(1, DATA_FLAG_NONE, kLengthMask + 8); | 459 SpdyFrameBuilder builder(1, DATA_FLAG_NONE, kLengthMask + 8); |
| 455 // Data frame header is 8 bytes | 460 // Data frame header is 8 bytes |
| 456 EXPECT_EQ(8u, builder.length()); | 461 EXPECT_EQ(8u, builder.length()); |
| 457 const std::string kLargeData(kLengthMask, 'A'); | 462 const string kLargeData(kLengthMask, 'A'); |
| 458 builder.WriteUInt32(kLengthMask); | 463 builder.WriteUInt32(kLengthMask); |
| 459 EXPECT_EQ(12u, builder.length()); | 464 EXPECT_EQ(12u, builder.length()); |
| 460 EXPECT_TRUE(builder.WriteBytes(kLargeData.data(), kLengthMask - 4)); | 465 EXPECT_TRUE(builder.WriteBytes(kLargeData.data(), kLengthMask - 4)); |
| 461 EXPECT_EQ(kLengthMask + 8, builder.length()); | 466 EXPECT_EQ(kLengthMask + 8u, builder.length()); |
| 462 } | 467 } |
| 463 | 468 |
| 464 enum SpdyFramerTestTypes { | 469 enum SpdyFramerTestTypes { |
| 465 SPDY2, | 470 SPDY2 = 2, |
| 466 SPDY3, | 471 SPDY3 = 3, |
| 467 }; | 472 }; |
| 468 | 473 |
| 469 class SpdyFramerTest | 474 class SpdyFramerTest |
| 470 : public ::testing::TestWithParam<SpdyFramerTestTypes> { | 475 : public ::testing::TestWithParam<SpdyFramerTestTypes> { |
| 471 protected: | 476 protected: |
| 472 virtual void SetUp() { | 477 virtual void SetUp() { |
| 473 spdy_version_ = (GetParam() == SPDY2) ? 2 : 3; | 478 spdy_version_ = GetParam(); |
| 474 } | 479 } |
| 475 | 480 |
| 476 virtual void TearDown() {} | 481 void CompareFrame(const string& description, |
| 477 | |
| 478 void CompareFrame(const std::string& description, | |
| 479 const SpdyFrame& actual_frame, | 482 const SpdyFrame& actual_frame, |
| 480 const unsigned char* expected, | 483 const unsigned char* expected, |
| 481 const int expected_len) { | 484 const int expected_len) { |
| 482 const unsigned char* actual = | 485 const unsigned char* actual = |
| 483 reinterpret_cast<const unsigned char*>(actual_frame.data()); | 486 reinterpret_cast<const unsigned char*>(actual_frame.data()); |
| 484 int actual_len = actual_frame.length() + SpdyFrame::kHeaderSize; | 487 int actual_len = actual_frame.length() + SpdyFrame::kHeaderSize; |
| 485 CompareCharArraysWithHexError( | 488 CompareCharArraysWithHexError( |
| 486 description, actual, actual_len, expected, expected_len); | 489 description, actual, actual_len, expected, expected_len); |
| 487 } | 490 } |
| 488 | 491 |
| 489 // Returns true if the two header blocks have equivalent content. | 492 // Returns true if the two header blocks have equivalent content. |
| 490 bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, | 493 bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, |
| 491 const SpdyHeaderBlock* actual) { | 494 const SpdyHeaderBlock* actual) { |
| 492 if (expected->size() != actual->size()) { | 495 if (expected->size() != actual->size()) { |
| 493 LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " | 496 LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " |
| 494 << actual->size() << "." << std::endl; | 497 << actual->size() << "."; |
| 495 return false; | 498 return false; |
| 496 } | 499 } |
| 497 for (SpdyHeaderBlock::const_iterator it = expected->begin(); | 500 for (SpdyHeaderBlock::const_iterator it = expected->begin(); |
| 498 it != expected->end(); | 501 it != expected->end(); |
| 499 ++it) { | 502 ++it) { |
| 500 SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); | 503 SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); |
| 501 if (it2 == actual->end()) { | 504 if (it2 == actual->end()) { |
| 502 LOG(ERROR) << "Expected header name '" << it->first << "'." | 505 LOG(ERROR) << "Expected header name '" << it->first << "'."; |
| 503 << std::endl; | |
| 504 return false; | 506 return false; |
| 505 } | 507 } |
| 506 if (it->second.compare(it2->second) != 0) { | 508 if (it->second.compare(it2->second) != 0) { |
| 507 LOG(ERROR) << "Expected header named '" << it->first | 509 LOG(ERROR) << "Expected header named '" << it->first |
| 508 << "' to have a value of '" << it->second | 510 << "' to have a value of '" << it->second |
| 509 << "'. The actual value received was '" << it2->second | 511 << "'. The actual value received was '" << it2->second |
| 510 << "'." << std::endl; | 512 << "'."; |
| 511 return false; | 513 return false; |
| 512 } | 514 } |
| 513 } | 515 } |
| 514 return true; | 516 return true; |
| 515 } | 517 } |
| 516 | 518 |
| 517 void AddSpdySettingFromWireFormat(SettingsMap* settings, | 519 void AddSpdySettingFromWireFormat(SettingsMap* settings, |
| 518 uint32 key, | 520 uint32 key, |
| 519 uint32 value) { | 521 uint32 value) { |
| 520 SettingsFlagsAndId flags_and_id = | 522 SettingsFlagsAndId flags_and_id = |
| 521 SettingsFlagsAndId::FromWireFormat(spdy_version_, key); | 523 SettingsFlagsAndId::FromWireFormat(spdy_version_, key); |
| 522 SpdySettingsIds id = static_cast<SpdySettingsIds>(flags_and_id.id()); | 524 SpdySettingsIds id = static_cast<SpdySettingsIds>(flags_and_id.id()); |
| 523 SpdySettingsFlags flags = | 525 SpdySettingsFlags flags = |
| 524 static_cast<SpdySettingsFlags>(flags_and_id.flags()); | 526 static_cast<SpdySettingsFlags>(flags_and_id.flags()); |
| 525 settings->insert(std::make_pair(id, SettingsFlagsAndValue(flags, value))); | 527 settings->insert(std::make_pair(id, SettingsFlagsAndValue(flags, value))); |
| 526 } | 528 } |
| 527 | 529 |
| 528 bool IsSpdy2() { return spdy_version_ < 3; } | 530 bool IsSpdy2() { return spdy_version_ == SPDY2; } |
| 529 | 531 |
| 530 // Version of SPDY protocol to be used. | 532 // Version of SPDY protocol to be used. |
| 531 int spdy_version_; | 533 unsigned char spdy_version_; |
| 532 }; | 534 }; |
| 533 | 535 |
| 534 | |
| 535 //----------------------------------------------------------------------------- | |
| 536 // All tests are run with two different SPDY versions: SPDY/2 and SPDY/3. | 536 // All tests are run with two different SPDY versions: SPDY/2 and SPDY/3. |
| 537 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, | 537 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, |
| 538 SpdyFramerTest, | 538 SpdyFramerTest, |
| 539 ::testing::Values(SPDY2, SPDY3)); | 539 ::testing::Values(SPDY2, SPDY3)); |
| 540 | 540 |
| 541 TEST_P(SpdyFramerTest, IsCompressible) { | 541 TEST_P(SpdyFramerTest, IsCompressible) { |
| 542 SpdyFramer framer(spdy_version_); | 542 SpdyFramer framer(spdy_version_); |
| 543 for (SpdyControlType type = SYN_STREAM; | 543 for (SpdyControlType type = SYN_STREAM; |
| 544 type < NUM_CONTROL_FRAME_TYPES; | 544 type < NUM_CONTROL_FRAME_TYPES; |
| 545 type = static_cast<SpdyControlType>(type + 1)) { | 545 type = static_cast<SpdyControlType>(type + 1)) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 562 // Encode the header block into a SynStream frame. | 562 // Encode the header block into a SynStream frame. |
| 563 scoped_ptr<SpdySynStreamControlFrame> frame( | 563 scoped_ptr<SpdySynStreamControlFrame> frame( |
| 564 framer.CreateSynStream(1, // stream id | 564 framer.CreateSynStream(1, // stream id |
| 565 0, // associated stream id | 565 0, // associated stream id |
| 566 1, // priority | 566 1, // priority |
| 567 0, // credential slot | 567 0, // credential slot |
| 568 CONTROL_FLAG_NONE, | 568 CONTROL_FLAG_NONE, |
| 569 false, // compress | 569 false, // compress |
| 570 &headers)); | 570 &headers)); |
| 571 EXPECT_TRUE(frame.get() != NULL); | 571 EXPECT_TRUE(frame.get() != NULL); |
| 572 std::string serialized_headers(frame->header_block(), | 572 string serialized_headers(frame->header_block(), frame->header_block_len()); |
| 573 frame->header_block_len()); | |
| 574 SpdyHeaderBlock new_headers; | 573 SpdyHeaderBlock new_headers; |
| 575 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), | 574 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), |
| 576 serialized_headers.size(), | 575 serialized_headers.size(), |
| 577 &new_headers)); | 576 &new_headers)); |
| 578 | 577 |
| 579 EXPECT_EQ(headers.size(), new_headers.size()); | 578 EXPECT_EQ(headers.size(), new_headers.size()); |
| 580 EXPECT_EQ(headers["alpha"], new_headers["alpha"]); | 579 EXPECT_EQ(headers["alpha"], new_headers["alpha"]); |
| 581 EXPECT_EQ(headers["gamma"], new_headers["gamma"]); | 580 EXPECT_EQ(headers["gamma"], new_headers["gamma"]); |
| 582 } | 581 } |
| 583 | 582 |
| 584 // Test that if there's not a full frame, we fail to parse it. | 583 // Test that if there's not a full frame, we fail to parse it. |
| 585 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { | 584 TEST_P(SpdyFramerTest, UndersizedHeaderBlockInBuffer) { |
| 586 SpdyHeaderBlock headers; | 585 SpdyHeaderBlock headers; |
| 587 headers["alpha"] = "beta"; | 586 headers["alpha"] = "beta"; |
| 588 headers["gamma"] = "charlie"; | 587 headers["gamma"] = "charlie"; |
| 589 SpdyFramer framer(spdy_version_); | 588 SpdyFramer framer(spdy_version_); |
| 590 | 589 |
| 591 // Encode the header block into a SynStream frame. | 590 // Encode the header block into a SynStream frame. |
| 592 scoped_ptr<SpdySynStreamControlFrame> frame( | 591 scoped_ptr<SpdySynStreamControlFrame> frame( |
| 593 framer.CreateSynStream(1, // stream id | 592 framer.CreateSynStream(1, // stream id |
| 594 0, // associated stream id | 593 0, // associated stream id |
| 595 1, // priority | 594 1, // priority |
| 596 0, // credential slot | 595 0, // credential slot |
| 597 CONTROL_FLAG_NONE, | 596 CONTROL_FLAG_NONE, |
| 598 false, // compress | 597 false, // compress |
| 599 &headers)); | 598 &headers)); |
| 600 EXPECT_TRUE(frame.get() != NULL); | 599 EXPECT_TRUE(frame.get() != NULL); |
| 601 | 600 |
| 602 std::string serialized_headers(frame->header_block(), | 601 string serialized_headers(frame->header_block(), frame->header_block_len()); |
| 603 frame->header_block_len()); | |
| 604 SpdyHeaderBlock new_headers; | 602 SpdyHeaderBlock new_headers; |
| 605 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), | 603 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), |
| 606 serialized_headers.size() - 2, | 604 serialized_headers.size() - 2, |
| 607 &new_headers)); | 605 &new_headers)); |
| 608 } | 606 } |
| 609 | 607 |
| 610 TEST_P(SpdyFramerTest, OutOfOrderHeaders) { | 608 TEST_P(SpdyFramerTest, OutOfOrderHeaders) { |
| 611 // Frame builder with plentiful buffer size. | 609 // Frame builder with plentiful buffer size. |
| 612 SpdyFrameBuilder frame(SYN_STREAM, CONTROL_FLAG_NONE, 1, 1024); | 610 SpdyFrameBuilder frame(SYN_STREAM, CONTROL_FLAG_NONE, 1, 1024); |
| 613 | 611 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 627 frame.WriteStringPiece32("gamma"); | 625 frame.WriteStringPiece32("gamma"); |
| 628 frame.WriteStringPiece32("alpha"); | 626 frame.WriteStringPiece32("alpha"); |
| 629 frame.WriteStringPiece32("alpha"); | 627 frame.WriteStringPiece32("alpha"); |
| 630 } | 628 } |
| 631 // write the length | 629 // write the length |
| 632 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); | 630 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); |
| 633 | 631 |
| 634 SpdyHeaderBlock new_headers; | 632 SpdyHeaderBlock new_headers; |
| 635 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 633 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
| 636 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); | 634 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); |
| 637 std::string serialized_headers(syn_frame.header_block(), | 635 string serialized_headers(syn_frame.header_block(), |
| 638 syn_frame.header_block_len()); | 636 syn_frame.header_block_len()); |
| 639 SpdyFramer framer(spdy_version_); | 637 SpdyFramer framer(spdy_version_); |
| 640 framer.set_enable_compression(false); | 638 framer.set_enable_compression(false); |
| 641 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), | 639 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), |
| 642 serialized_headers.size(), | 640 serialized_headers.size(), |
| 643 &new_headers)); | 641 &new_headers)); |
| 644 } | 642 } |
| 645 | 643 |
| 646 TEST_P(SpdyFramerTest, CreateCredential) { | 644 TEST_P(SpdyFramerTest, CreateCredential) { |
| 647 SpdyFramer framer(spdy_version_); | 645 SpdyFramer framer(spdy_version_); |
| 648 | 646 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 734 frame.WriteStringPiece32("value1"); | 732 frame.WriteStringPiece32("value1"); |
| 735 frame.WriteStringPiece32("name"); | 733 frame.WriteStringPiece32("name"); |
| 736 frame.WriteStringPiece32("value2"); | 734 frame.WriteStringPiece32("value2"); |
| 737 } | 735 } |
| 738 // write the length | 736 // write the length |
| 739 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); | 737 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); |
| 740 | 738 |
| 741 SpdyHeaderBlock new_headers; | 739 SpdyHeaderBlock new_headers; |
| 742 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 740 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
| 743 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); | 741 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); |
| 744 std::string serialized_headers(syn_frame.header_block(), | 742 string serialized_headers(syn_frame.header_block(), |
| 745 syn_frame.header_block_len()); | 743 syn_frame.header_block_len()); |
| 746 SpdyFramer framer(spdy_version_); | 744 SpdyFramer framer(spdy_version_); |
| 747 framer.set_enable_compression(false); | 745 framer.set_enable_compression(false); |
| 748 // This should fail because duplicate headers are verboten by the spec. | 746 // This should fail because duplicate headers are verboten by the spec. |
| 749 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), | 747 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), |
| 750 serialized_headers.size(), | 748 serialized_headers.size(), |
| 751 &new_headers)); | 749 &new_headers)); |
| 752 } | 750 } |
| 753 | 751 |
| 754 TEST_P(SpdyFramerTest, MultiValueHeader) { | 752 TEST_P(SpdyFramerTest, MultiValueHeader) { |
| 755 // Frame builder with plentiful buffer size. | 753 // Frame builder with plentiful buffer size. |
| 756 SpdyFrameBuilder frame(SYN_STREAM, CONTROL_FLAG_NONE, 1, 1024); | 754 SpdyFrameBuilder frame(SYN_STREAM, CONTROL_FLAG_NONE, 1, 1024); |
| 757 | 755 |
| 758 frame.WriteUInt32(3); // stream_id | 756 frame.WriteUInt32(3); // stream_id |
| 759 frame.WriteUInt32(0); // associated stream id | 757 frame.WriteUInt32(0); // associated stream id |
| 760 frame.WriteUInt16(0); // Priority. | 758 frame.WriteUInt16(0); // Priority. |
| 761 | 759 |
| 762 std::string value("value1\0value2"); | 760 string value("value1\0value2"); |
| 763 if (IsSpdy2()) { | 761 if (IsSpdy2()) { |
| 764 frame.WriteUInt16(1); // Number of headers. | 762 frame.WriteUInt16(1); // Number of headers. |
| 765 frame.WriteString("name"); | 763 frame.WriteString("name"); |
| 766 frame.WriteString(value); | 764 frame.WriteString(value); |
| 767 } else { | 765 } else { |
| 768 frame.WriteUInt32(1); // Number of headers. | 766 frame.WriteUInt32(1); // Number of headers. |
| 769 frame.WriteStringPiece32("name"); | 767 frame.WriteStringPiece32("name"); |
| 770 frame.WriteStringPiece32(value); | 768 frame.WriteStringPiece32(value); |
| 771 } | 769 } |
| 772 // write the length | 770 // write the length |
| 773 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); | 771 frame.WriteUInt32ToOffset(4, frame.length() - SpdyFrame::kHeaderSize); |
| 774 | 772 |
| 775 SpdyHeaderBlock new_headers; | 773 SpdyHeaderBlock new_headers; |
| 776 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 774 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
| 777 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); | 775 SpdySynStreamControlFrame syn_frame(control_frame->data(), false); |
| 778 std::string serialized_headers(syn_frame.header_block(), | 776 string serialized_headers(syn_frame.header_block(), |
| 779 syn_frame.header_block_len()); | 777 syn_frame.header_block_len()); |
| 780 SpdyFramer framer(spdy_version_); | 778 SpdyFramer framer(spdy_version_); |
| 781 framer.set_enable_compression(false); | 779 framer.set_enable_compression(false); |
| 782 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), | 780 EXPECT_TRUE(framer.ParseHeaderBlockInBuffer(serialized_headers.c_str(), |
| 783 serialized_headers.size(), | 781 serialized_headers.size(), |
| 784 &new_headers)); | 782 &new_headers)); |
| 785 EXPECT_TRUE(new_headers.find("name") != new_headers.end()); | 783 EXPECT_TRUE(new_headers.find("name") != new_headers.end()); |
| 786 EXPECT_EQ(value, new_headers.find("name")->second); | 784 EXPECT_EQ(value, new_headers.find("name")->second); |
| 787 } | 785 } |
| 788 | 786 |
| 789 TEST_P(SpdyFramerTest, BasicCompression) { | 787 TEST_P(SpdyFramerTest, BasicCompression) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 842 false, // compress | 840 false, // compress |
| 843 &headers)); | 841 &headers)); |
| 844 EXPECT_EQ(frame3->length(), uncompressed_frame->length()); | 842 EXPECT_EQ(frame3->length(), uncompressed_frame->length()); |
| 845 EXPECT_EQ(0, | 843 EXPECT_EQ(0, |
| 846 memcmp(frame3->data(), uncompressed_frame->data(), | 844 memcmp(frame3->data(), uncompressed_frame->data(), |
| 847 SpdyFrame::kHeaderSize + uncompressed_frame->length())); | 845 SpdyFrame::kHeaderSize + uncompressed_frame->length())); |
| 848 } | 846 } |
| 849 | 847 |
| 850 TEST_P(SpdyFramerTest, Basic) { | 848 TEST_P(SpdyFramerTest, Basic) { |
| 851 const unsigned char kV2Input[] = { | 849 const unsigned char kV2Input[] = { |
| 852 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 850 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 853 0x00, 0x00, 0x00, 0x14, | 851 0x00, 0x00, 0x00, 0x14, |
| 854 0x00, 0x00, 0x00, 0x01, | 852 0x00, 0x00, 0x00, 0x01, |
| 855 0x00, 0x00, 0x00, 0x00, | 853 0x00, 0x00, 0x00, 0x00, |
| 856 0x00, 0x00, 0x00, 0x01, | 854 0x00, 0x00, 0x00, 0x01, |
| 857 0x00, 0x02, 'h', 'h', | 855 0x00, 0x02, 'h', 'h', |
| 858 0x00, 0x02, 'v', 'v', | 856 0x00, 0x02, 'v', 'v', |
| 859 | 857 |
| 860 0x80, spdy_version_, 0x00, 0x08, // HEADERS on Stream #1 | 858 0x80, spdy_version_, 0x00, 0x08, // HEADERS on Stream #1 |
| 861 0x00, 0x00, 0x00, 0x18, | 859 0x00, 0x00, 0x00, 0x18, |
| 862 0x00, 0x00, 0x00, 0x01, | 860 0x00, 0x00, 0x00, 0x01, |
| 863 0x00, 0x00, 0x00, 0x02, | 861 0x00, 0x00, 0x00, 0x02, |
| 864 0x00, 0x02, 'h', '2', | 862 0x00, 0x02, 'h', '2', |
| 865 0x00, 0x02, 'v', '2', | 863 0x00, 0x02, 'v', '2', |
| 866 0x00, 0x02, 'h', '3', | 864 0x00, 0x02, 'h', '3', |
| 867 0x00, 0x02, 'v', '3', | 865 0x00, 0x02, 'v', '3', |
| 868 | 866 |
| 869 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 867 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 870 0x00, 0x00, 0x00, 0x0c, | 868 0x00, 0x00, 0x00, 0x0c, |
| 871 0xde, 0xad, 0xbe, 0xef, | 869 0xde, 0xad, 0xbe, 0xef, |
| 872 0xde, 0xad, 0xbe, 0xef, | 870 0xde, 0xad, 0xbe, 0xef, |
| 873 0xde, 0xad, 0xbe, 0xef, | 871 0xde, 0xad, 0xbe, 0xef, |
| 874 | 872 |
| 875 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #3 | 873 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #3 |
| 876 0x00, 0x00, 0x00, 0x0c, | 874 0x00, 0x00, 0x00, 0x0c, |
| 877 0x00, 0x00, 0x00, 0x03, | 875 0x00, 0x00, 0x00, 0x03, |
| 878 0x00, 0x00, 0x00, 0x00, | 876 0x00, 0x00, 0x00, 0x00, |
| 879 0x00, 0x00, 0x00, 0x00, | 877 0x00, 0x00, 0x00, 0x00, |
| 880 | 878 |
| 881 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | 879 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 |
| 882 0x00, 0x00, 0x00, 0x08, | 880 0x00, 0x00, 0x00, 0x08, |
| 883 0xde, 0xad, 0xbe, 0xef, | 881 0xde, 0xad, 0xbe, 0xef, |
| 884 0xde, 0xad, 0xbe, 0xef, | 882 0xde, 0xad, 0xbe, 0xef, |
| 885 | 883 |
| 886 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 884 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 887 0x00, 0x00, 0x00, 0x04, | 885 0x00, 0x00, 0x00, 0x04, |
| 888 0xde, 0xad, 0xbe, 0xef, | 886 0xde, 0xad, 0xbe, 0xef, |
| 889 | 887 |
| 890 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #1 | 888 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #1 |
| 891 0x00, 0x00, 0x00, 0x08, | 889 0x00, 0x00, 0x00, 0x08, |
| 892 0x00, 0x00, 0x00, 0x01, | 890 0x00, 0x00, 0x00, 0x01, |
| 893 0x00, 0x00, 0x00, 0x00, | 891 0x00, 0x00, 0x00, 0x00, |
| 894 | 892 |
| 895 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | 893 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 |
| 896 0x00, 0x00, 0x00, 0x00, | 894 0x00, 0x00, 0x00, 0x00, |
| 897 | 895 |
| 898 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #3 | 896 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #3 |
| 899 0x00, 0x00, 0x00, 0x08, | 897 0x00, 0x00, 0x00, 0x08, |
| 900 0x00, 0x00, 0x00, 0x03, | 898 0x00, 0x00, 0x00, 0x03, |
| 901 0x00, 0x00, 0x00, 0x00, | 899 0x00, 0x00, 0x00, 0x00, |
| 902 }; | 900 }; |
| 903 | 901 |
| 904 const unsigned char kV3Input[] = { | 902 const unsigned char kV3Input[] = { |
| 905 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 903 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 906 0x00, 0x00, 0x00, 0x1a, | 904 0x00, 0x00, 0x00, 0x1a, |
| 907 0x00, 0x00, 0x00, 0x01, | 905 0x00, 0x00, 0x00, 0x01, |
| 908 0x00, 0x00, 0x00, 0x00, | 906 0x00, 0x00, 0x00, 0x00, |
| 909 0x00, 0x00, 0x00, 0x00, | 907 0x00, 0x00, 0x00, 0x00, |
| 910 0x00, 0x01, 0x00, 0x00, | 908 0x00, 0x01, 0x00, 0x00, |
| 911 0x00, 0x02, 'h', 'h', | 909 0x00, 0x02, 'h', 'h', |
| 912 0x00, 0x00, 0x00, 0x02, | 910 0x00, 0x00, 0x00, 0x02, |
| 913 'v', 'v', | 911 'v', 'v', |
| 914 | 912 |
| 915 0x80, spdy_version_, 0x00, 0x08, // HEADERS on Stream #1 | 913 0x80, spdy_version_, 0x00, 0x08, // HEADERS on Stream #1 |
| 916 0x00, 0x00, 0x00, 0x22, | 914 0x00, 0x00, 0x00, 0x22, |
| 917 0x00, 0x00, 0x00, 0x01, | 915 0x00, 0x00, 0x00, 0x01, |
| 918 0x00, 0x00, 0x00, 0x00, | 916 0x00, 0x00, 0x00, 0x00, |
| 919 0x00, 0x02, 0x00, 0x00, | 917 0x00, 0x02, 0x00, 0x00, |
| 920 0x00, 0x02, 'h', '2', | 918 0x00, 0x02, 'h', '2', |
| 921 0x00, 0x00, 0x00, 0x02, | 919 0x00, 0x00, 0x00, 0x02, |
| 922 'v', '2', 0x00, 0x00, | 920 'v', '2', 0x00, 0x00, |
| 923 0x00, 0x02, 'h', '3', | 921 0x00, 0x02, 'h', '3', |
| 924 0x00, 0x00, 0x00, 0x02, | 922 0x00, 0x00, 0x00, 0x02, |
| 925 'v', '3', | 923 'v', '3', |
| 926 | 924 |
| 927 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 925 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 928 0x00, 0x00, 0x00, 0x0c, | 926 0x00, 0x00, 0x00, 0x0c, |
| 929 0xde, 0xad, 0xbe, 0xef, | 927 0xde, 0xad, 0xbe, 0xef, |
| 930 0xde, 0xad, 0xbe, 0xef, | 928 0xde, 0xad, 0xbe, 0xef, |
| 931 0xde, 0xad, 0xbe, 0xef, | 929 0xde, 0xad, 0xbe, 0xef, |
| 932 | 930 |
| 933 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #3 | 931 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #3 |
| 934 0x00, 0x00, 0x00, 0x0e, | 932 0x00, 0x00, 0x00, 0x0e, |
| 935 0x00, 0x00, 0x00, 0x03, | 933 0x00, 0x00, 0x00, 0x03, |
| 936 0x00, 0x00, 0x00, 0x00, | 934 0x00, 0x00, 0x00, 0x00, |
| 937 0x00, 0x00, 0x00, 0x00, | 935 0x00, 0x00, 0x00, 0x00, |
| 938 0x00, 0x00, | 936 0x00, 0x00, |
| 939 | 937 |
| 940 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | 938 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 |
| 941 0x00, 0x00, 0x00, 0x08, | 939 0x00, 0x00, 0x00, 0x08, |
| 942 0xde, 0xad, 0xbe, 0xef, | 940 0xde, 0xad, 0xbe, 0xef, |
| 943 0xde, 0xad, 0xbe, 0xef, | 941 0xde, 0xad, 0xbe, 0xef, |
| 944 | 942 |
| 945 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 943 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 946 0x00, 0x00, 0x00, 0x04, | 944 0x00, 0x00, 0x00, 0x04, |
| 947 0xde, 0xad, 0xbe, 0xef, | 945 0xde, 0xad, 0xbe, 0xef, |
| 948 | 946 |
| 949 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #1 | 947 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #1 |
| 950 0x00, 0x00, 0x00, 0x08, | 948 0x00, 0x00, 0x00, 0x08, |
| 951 0x00, 0x00, 0x00, 0x01, | 949 0x00, 0x00, 0x00, 0x01, |
| 952 0x00, 0x00, 0x00, 0x00, | 950 0x00, 0x00, 0x00, 0x00, |
| 953 | 951 |
| 954 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | 952 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 |
| 955 0x00, 0x00, 0x00, 0x00, | 953 0x00, 0x00, 0x00, 0x00, |
| 956 | 954 |
| 957 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #3 | 955 0x80, spdy_version_, 0x00, 0x03, // RST_STREAM on Stream #3 |
| 958 0x00, 0x00, 0x00, 0x08, | 956 0x00, 0x00, 0x00, 0x08, |
| 959 0x00, 0x00, 0x00, 0x03, | 957 0x00, 0x00, 0x00, 0x03, |
| 960 0x00, 0x00, 0x00, 0x00, | 958 0x00, 0x00, 0x00, 0x00, |
| 961 }; | 959 }; |
| 962 | 960 |
| 963 TestSpdyVisitor visitor(spdy_version_); | 961 TestSpdyVisitor visitor(spdy_version_); |
| 964 if (IsSpdy2()) { | 962 if (IsSpdy2()) { |
| 965 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 963 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
| 966 } else { | 964 } else { |
| 967 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 965 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
| 968 } | 966 } |
| 969 | 967 |
| 970 EXPECT_EQ(0, visitor.error_count_); | 968 EXPECT_EQ(0, visitor.error_count_); |
| 971 EXPECT_EQ(2, visitor.syn_frame_count_); | 969 EXPECT_EQ(2, visitor.syn_frame_count_); |
| 972 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 970 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 973 EXPECT_EQ(1, visitor.headers_frame_count_); | 971 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 974 EXPECT_EQ(24, visitor.data_bytes_); | 972 EXPECT_EQ(24, visitor.data_bytes_); |
| 975 EXPECT_EQ(2, visitor.fin_frame_count_); | 973 EXPECT_EQ(2, visitor.fin_frame_count_); |
| 976 EXPECT_EQ(0, visitor.fin_flag_count_); | 974 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 977 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 975 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
| 978 EXPECT_EQ(4, visitor.data_frame_count_); | 976 EXPECT_EQ(4, visitor.data_frame_count_); |
| 979 } | 977 } |
| 980 | 978 |
| 981 // Test that the FIN flag on a data frame signifies EOF. | 979 // Test that the FIN flag on a data frame signifies EOF. |
| 982 TEST_P(SpdyFramerTest, FinOnDataFrame) { | 980 TEST_P(SpdyFramerTest, FinOnDataFrame) { |
| 983 const unsigned char kV2Input[] = { | 981 const unsigned char kV2Input[] = { |
| 984 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 982 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 985 0x00, 0x00, 0x00, 0x14, | 983 0x00, 0x00, 0x00, 0x14, |
| 986 0x00, 0x00, 0x00, 0x01, | 984 0x00, 0x00, 0x00, 0x01, |
| 987 0x00, 0x00, 0x00, 0x00, | 985 0x00, 0x00, 0x00, 0x00, |
| 988 0x00, 0x00, 0x00, 0x01, | 986 0x00, 0x00, 0x00, 0x01, |
| 989 0x00, 0x02, 'h', 'h', | 987 0x00, 0x02, 'h', 'h', |
| 990 0x00, 0x02, 'v', 'v', | 988 0x00, 0x02, 'v', 'v', |
| 991 | 989 |
| 992 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 | 990 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 |
| 993 0x00, 0x00, 0x00, 0x10, | 991 0x00, 0x00, 0x00, 0x10, |
| 994 0x00, 0x00, 0x00, 0x01, | 992 0x00, 0x00, 0x00, 0x01, |
| 995 0x00, 0x00, 0x00, 0x01, | 993 0x00, 0x00, 0x00, 0x01, |
| 996 0x00, 0x02, 'a', 'a', | 994 0x00, 0x02, 'a', 'a', |
| 997 0x00, 0x02, 'b', 'b', | 995 0x00, 0x02, 'b', 'b', |
| 998 | 996 |
| 999 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 997 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 1000 0x00, 0x00, 0x00, 0x0c, | 998 0x00, 0x00, 0x00, 0x0c, |
| 1001 0xde, 0xad, 0xbe, 0xef, | 999 0xde, 0xad, 0xbe, 0xef, |
| 1002 0xde, 0xad, 0xbe, 0xef, | 1000 0xde, 0xad, 0xbe, 0xef, |
| 1003 0xde, 0xad, 0xbe, 0xef, | 1001 0xde, 0xad, 0xbe, 0xef, |
| 1004 | 1002 |
| 1005 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF | 1003 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF |
| 1006 0x01, 0x00, 0x00, 0x04, | 1004 0x01, 0x00, 0x00, 0x04, |
| 1007 0xde, 0xad, 0xbe, 0xef, | 1005 0xde, 0xad, 0xbe, 0xef, |
| 1008 }; | 1006 }; |
| 1009 const unsigned char kV3Input[] = { | 1007 const unsigned char kV3Input[] = { |
| 1010 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 1008 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 1011 0x00, 0x00, 0x00, 0x1a, | 1009 0x00, 0x00, 0x00, 0x1a, |
| 1012 0x00, 0x00, 0x00, 0x01, | 1010 0x00, 0x00, 0x00, 0x01, |
| 1013 0x00, 0x00, 0x00, 0x00, | 1011 0x00, 0x00, 0x00, 0x00, |
| 1014 0x00, 0x00, 0x00, 0x00, | 1012 0x00, 0x00, 0x00, 0x00, |
| 1015 0x00, 0x01, 0x00, 0x00, | 1013 0x00, 0x01, 0x00, 0x00, |
| 1016 0x00, 0x02, 'h', 'h', | 1014 0x00, 0x02, 'h', 'h', |
| 1017 0x00, 0x00, 0x00, 0x02, | 1015 0x00, 0x00, 0x00, 0x02, |
| 1018 'v', 'v', | 1016 'v', 'v', |
| 1019 | 1017 |
| 1020 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 | 1018 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 |
| 1021 0x00, 0x00, 0x00, 0x16, | 1019 0x00, 0x00, 0x00, 0x16, |
| 1022 0x00, 0x00, 0x00, 0x01, | 1020 0x00, 0x00, 0x00, 0x01, |
| 1023 0x00, 0x00, 0x00, 0x00, | 1021 0x00, 0x00, 0x00, 0x00, |
| 1024 0x00, 0x01, 0x00, 0x00, | 1022 0x00, 0x01, 0x00, 0x00, |
| 1025 0x00, 0x02, 'a', 'a', | 1023 0x00, 0x02, 'a', 'a', |
| 1026 0x00, 0x00, 0x00, 0x02, | 1024 0x00, 0x00, 0x00, 0x02, |
| 1027 'b', 'b', | 1025 'b', 'b', |
| 1028 | 1026 |
| 1029 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 1027 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
| 1030 0x00, 0x00, 0x00, 0x0c, | 1028 0x00, 0x00, 0x00, 0x0c, |
| 1031 0xde, 0xad, 0xbe, 0xef, | 1029 0xde, 0xad, 0xbe, 0xef, |
| 1032 0xde, 0xad, 0xbe, 0xef, | 1030 0xde, 0xad, 0xbe, 0xef, |
| 1033 0xde, 0xad, 0xbe, 0xef, | 1031 0xde, 0xad, 0xbe, 0xef, |
| 1034 | 1032 |
| 1035 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF | 1033 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF |
| 1036 0x01, 0x00, 0x00, 0x04, | 1034 0x01, 0x00, 0x00, 0x04, |
| 1037 0xde, 0xad, 0xbe, 0xef, | 1035 0xde, 0xad, 0xbe, 0xef, |
| 1038 }; | 1036 }; |
| 1039 | 1037 |
| 1040 TestSpdyVisitor visitor(spdy_version_); | 1038 TestSpdyVisitor visitor(spdy_version_); |
| 1041 if (IsSpdy2()) { | 1039 if (IsSpdy2()) { |
| 1042 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1040 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
| 1043 } else { | 1041 } else { |
| 1044 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1042 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
| 1045 } | 1043 } |
| 1046 | 1044 |
| 1047 EXPECT_EQ(0, visitor.error_count_); | 1045 EXPECT_EQ(0, visitor.error_count_); |
| 1048 EXPECT_EQ(1, visitor.syn_frame_count_); | 1046 EXPECT_EQ(1, visitor.syn_frame_count_); |
| 1049 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 1047 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
| 1050 EXPECT_EQ(0, visitor.headers_frame_count_); | 1048 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 1051 EXPECT_EQ(16, visitor.data_bytes_); | 1049 EXPECT_EQ(16, visitor.data_bytes_); |
| 1052 EXPECT_EQ(0, visitor.fin_frame_count_); | 1050 EXPECT_EQ(0, visitor.fin_frame_count_); |
| 1053 EXPECT_EQ(0, visitor.fin_flag_count_); | 1051 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 1054 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 1052 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
| 1055 EXPECT_EQ(2, visitor.data_frame_count_); | 1053 EXPECT_EQ(2, visitor.data_frame_count_); |
| 1056 } | 1054 } |
| 1057 | 1055 |
| 1058 // Test that the FIN flag on a SYN reply frame signifies EOF. | 1056 // Test that the FIN flag on a SYN reply frame signifies EOF. |
| 1059 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { | 1057 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
| 1060 const unsigned char kV2Input[] = { | 1058 const unsigned char kV2Input[] = { |
| 1061 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 1059 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 1062 0x00, 0x00, 0x00, 0x14, | 1060 0x00, 0x00, 0x00, 0x14, |
| 1063 0x00, 0x00, 0x00, 0x01, | 1061 0x00, 0x00, 0x00, 0x01, |
| 1064 0x00, 0x00, 0x00, 0x00, | 1062 0x00, 0x00, 0x00, 0x00, |
| 1065 0x00, 0x00, 0x00, 0x01, | 1063 0x00, 0x00, 0x00, 0x01, |
| 1066 0x00, 0x02, 'h', 'h', | 1064 0x00, 0x02, 'h', 'h', |
| 1067 0x00, 0x02, 'v', 'v', | 1065 0x00, 0x02, 'v', 'v', |
| 1068 | 1066 |
| 1069 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 | 1067 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 |
| 1070 0x01, 0x00, 0x00, 0x14, | 1068 0x01, 0x00, 0x00, 0x14, |
| 1071 0x00, 0x00, 0x00, 0x01, | 1069 0x00, 0x00, 0x00, 0x01, |
| 1072 0x00, 0x00, 0x00, 0x00, | 1070 0x00, 0x00, 0x00, 0x00, |
| 1073 0x00, 0x00, 0x00, 0x01, | 1071 0x00, 0x00, 0x00, 0x01, |
| 1074 0x00, 0x02, 'a', 'a', | 1072 0x00, 0x02, 'a', 'a', |
| 1075 0x00, 0x02, 'b', 'b', | 1073 0x00, 0x02, 'b', 'b', |
| 1076 }; | 1074 }; |
| 1077 const unsigned char kV3Input[] = { | 1075 const unsigned char kV3Input[] = { |
| 1078 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 | 1076 0x80, spdy_version_, 0x00, 0x01, // SYN Stream #1 |
| 1079 0x00, 0x00, 0x00, 0x1a, | 1077 0x00, 0x00, 0x00, 0x1a, |
| 1080 0x00, 0x00, 0x00, 0x01, | 1078 0x00, 0x00, 0x00, 0x01, |
| 1081 0x00, 0x00, 0x00, 0x00, | 1079 0x00, 0x00, 0x00, 0x00, |
| 1082 0x00, 0x00, 0x00, 0x00, | 1080 0x00, 0x00, 0x00, 0x00, |
| 1083 0x00, 0x01, 0x00, 0x00, | 1081 0x00, 0x01, 0x00, 0x00, |
| 1084 0x00, 0x02, 'h', 'h', | 1082 0x00, 0x02, 'h', 'h', |
| 1085 0x00, 0x00, 0x00, 0x02, | 1083 0x00, 0x00, 0x00, 0x02, |
| 1086 'v', 'v', | 1084 'v', 'v', |
| 1087 | 1085 |
| 1088 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 | 1086 0x80, spdy_version_, 0x00, 0x02, // SYN REPLY Stream #1 |
| 1089 0x01, 0x00, 0x00, 0x1a, | 1087 0x01, 0x00, 0x00, 0x1a, |
| 1090 0x00, 0x00, 0x00, 0x01, | 1088 0x00, 0x00, 0x00, 0x01, |
| 1091 0x00, 0x00, 0x00, 0x00, | 1089 0x00, 0x00, 0x00, 0x00, |
| 1092 0x00, 0x00, 0x00, 0x00, | 1090 0x00, 0x00, 0x00, 0x00, |
| 1093 0x00, 0x01, 0x00, 0x00, | 1091 0x00, 0x01, 0x00, 0x00, |
| 1094 0x00, 0x02, 'a', 'a', | 1092 0x00, 0x02, 'a', 'a', |
| 1095 0x00, 0x00, 0x00, 0x02, | 1093 0x00, 0x00, 0x00, 0x02, |
| 1096 'b', 'b', | 1094 'b', 'b', |
| 1097 }; | 1095 }; |
| 1098 | 1096 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1151 0, // priority | 1149 0, // priority |
| 1152 0, // credential slot | 1150 0, // credential slot |
| 1153 flags, | 1151 flags, |
| 1154 true, // compress | 1152 true, // compress |
| 1155 &block)); | 1153 &block)); |
| 1156 EXPECT_TRUE(syn_frame_2.get() != NULL); | 1154 EXPECT_TRUE(syn_frame_2.get() != NULL); |
| 1157 | 1155 |
| 1158 // Now start decompressing | 1156 // Now start decompressing |
| 1159 scoped_ptr<SpdyFrame> decompressed; | 1157 scoped_ptr<SpdyFrame> decompressed; |
| 1160 scoped_ptr<SpdySynStreamControlFrame> syn_frame; | 1158 scoped_ptr<SpdySynStreamControlFrame> syn_frame; |
| 1161 scoped_ptr<std::string> serialized_headers; | 1159 scoped_ptr<string> serialized_headers; |
| 1162 SpdyHeaderBlock decompressed_headers; | 1160 SpdyHeaderBlock decompressed_headers; |
| 1163 | 1161 |
| 1164 // Decompress SYN_STREAM #1 | 1162 // Decompress SYN_STREAM #1 |
| 1165 decompressed.reset(SpdyFramerTestUtil::DecompressFrame( | 1163 decompressed.reset(SpdyFramerTestUtil::DecompressFrame( |
| 1166 &recv_framer, *syn_frame_1.get())); | 1164 &recv_framer, *syn_frame_1.get())); |
| 1167 EXPECT_TRUE(decompressed.get() != NULL); | 1165 EXPECT_TRUE(decompressed.get() != NULL); |
| 1168 EXPECT_TRUE(decompressed->is_control_frame()); | 1166 EXPECT_TRUE(decompressed->is_control_frame()); |
| 1169 EXPECT_EQ(SYN_STREAM, | 1167 EXPECT_EQ(SYN_STREAM, |
| 1170 reinterpret_cast<SpdyControlFrame*>(decompressed.get())->type()); | 1168 reinterpret_cast<SpdyControlFrame*>(decompressed.get())->type()); |
| 1171 syn_frame.reset(new SpdySynStreamControlFrame(decompressed->data(), false)); | 1169 syn_frame.reset(new SpdySynStreamControlFrame(decompressed->data(), false)); |
| 1172 serialized_headers.reset(new std::string(syn_frame->header_block(), | 1170 serialized_headers.reset(new string(syn_frame->header_block(), |
| 1173 syn_frame->header_block_len())); | 1171 syn_frame->header_block_len())); |
| 1174 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers->c_str(), | 1172 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers->c_str(), |
| 1175 serialized_headers->size(), | 1173 serialized_headers->size(), |
| 1176 &decompressed_headers)); | 1174 &decompressed_headers)); |
| 1177 EXPECT_EQ(2u, decompressed_headers.size()); | 1175 EXPECT_EQ(2u, decompressed_headers.size()); |
| 1178 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); | 1176 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); |
| 1179 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); | 1177 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); |
| 1180 | 1178 |
| 1181 // Decompress SYN_STREAM #2 | 1179 // Decompress SYN_STREAM #2 |
| 1182 decompressed.reset(SpdyFramerTestUtil::DecompressFrame( | 1180 decompressed.reset(SpdyFramerTestUtil::DecompressFrame( |
| 1183 &recv_framer, *syn_frame_2.get())); | 1181 &recv_framer, *syn_frame_2.get())); |
| 1184 EXPECT_TRUE(decompressed.get() != NULL); | 1182 EXPECT_TRUE(decompressed.get() != NULL); |
| 1185 EXPECT_TRUE(decompressed->is_control_frame()); | 1183 EXPECT_TRUE(decompressed->is_control_frame()); |
| 1186 EXPECT_EQ(SYN_STREAM, | 1184 EXPECT_EQ(SYN_STREAM, |
| 1187 reinterpret_cast<SpdyControlFrame*>(decompressed.get())->type()); | 1185 reinterpret_cast<SpdyControlFrame*>(decompressed.get())->type()); |
| 1188 syn_frame.reset(new SpdySynStreamControlFrame(decompressed->data(), false)); | 1186 syn_frame.reset(new SpdySynStreamControlFrame(decompressed->data(), false)); |
| 1189 serialized_headers.reset(new std::string(syn_frame->header_block(), | 1187 serialized_headers.reset(new string(syn_frame->header_block(), |
| 1190 syn_frame->header_block_len())); | 1188 syn_frame->header_block_len())); |
| 1191 decompressed_headers.clear(); | 1189 decompressed_headers.clear(); |
| 1192 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers->c_str(), | 1190 EXPECT_TRUE(recv_framer.ParseHeaderBlockInBuffer(serialized_headers->c_str(), |
| 1193 serialized_headers->size(), | 1191 serialized_headers->size(), |
| 1194 &decompressed_headers)); | 1192 &decompressed_headers)); |
| 1195 EXPECT_EQ(3u, decompressed_headers.size()); | 1193 EXPECT_EQ(3u, decompressed_headers.size()); |
| 1196 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); | 1194 EXPECT_EQ(kValue1, decompressed_headers[kHeader1]); |
| 1197 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); | 1195 EXPECT_EQ(kValue2, decompressed_headers[kHeader2]); |
| 1198 EXPECT_EQ(kValue3, decompressed_headers[kHeader3]); | 1196 EXPECT_EQ(kValue3, decompressed_headers[kHeader3]); |
| 1199 } | 1197 } |
| 1200 | 1198 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1336 { | 1334 { |
| 1337 const char kDescription[] = "'hello' data frame, no FIN"; | 1335 const char kDescription[] = "'hello' data frame, no FIN"; |
| 1338 const unsigned char kFrameData[] = { | 1336 const unsigned char kFrameData[] = { |
| 1339 0x00, 0x00, 0x00, 0x01, | 1337 0x00, 0x00, 0x00, 0x01, |
| 1340 0x00, 0x00, 0x00, 0x05, | 1338 0x00, 0x00, 0x00, 0x05, |
| 1341 'h', 'e', 'l', 'l', | 1339 'h', 'e', 'l', 'l', |
| 1342 'o' | 1340 'o' |
| 1343 }; | 1341 }; |
| 1344 const char bytes[] = "hello"; | 1342 const char bytes[] = "hello"; |
| 1345 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( | 1343 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( |
| 1346 1, bytes, arraysize(bytes) - 1, DATA_FLAG_NONE)); | 1344 1, bytes, strlen(bytes), DATA_FLAG_NONE)); |
| 1347 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 1345 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 1348 } | 1346 } |
| 1349 | 1347 |
| 1350 { | 1348 { |
| 1351 const char kDescription[] = "Data frame with negative data byte, no FIN"; | 1349 const char kDescription[] = "Data frame with negative data byte, no FIN"; |
| 1352 const unsigned char kFrameData[] = { | 1350 const unsigned char kFrameData[] = { |
| 1353 0x00, 0x00, 0x00, 0x01, | 1351 0x00, 0x00, 0x00, 0x01, |
| 1354 0x00, 0x00, 0x00, 0x01, | 1352 0x00, 0x00, 0x00, 0x01, |
| 1355 0xff | 1353 0xff |
| 1356 }; | 1354 }; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1392 'o' | 1390 'o' |
| 1393 }; | 1391 }; |
| 1394 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( | 1392 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( |
| 1395 0x7fffffff, "hello", 5, DATA_FLAG_FIN)); | 1393 0x7fffffff, "hello", 5, DATA_FLAG_FIN)); |
| 1396 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 1394 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 1397 } | 1395 } |
| 1398 | 1396 |
| 1399 { | 1397 { |
| 1400 const char kDescription[] = "Large data frame"; | 1398 const char kDescription[] = "Large data frame"; |
| 1401 const int kDataSize = 4 * 1024 * 1024; // 4 MB | 1399 const int kDataSize = 4 * 1024 * 1024; // 4 MB |
| 1402 const std::string kData(kDataSize, 'A'); | 1400 const string kData(kDataSize, 'A'); |
| 1403 const unsigned char kFrameHeader[] = { | 1401 const unsigned char kFrameHeader[] = { |
| 1404 0x00, 0x00, 0x00, 0x01, | 1402 0x00, 0x00, 0x00, 0x01, |
| 1405 0x01, 0x40, 0x00, 0x00, | 1403 0x01, 0x40, 0x00, 0x00, |
| 1406 }; | 1404 }; |
| 1407 | 1405 |
| 1408 const int kFrameSize = arraysize(kFrameHeader) + kDataSize; | 1406 const int kFrameSize = arraysize(kFrameHeader) + kDataSize; |
| 1409 scoped_array<unsigned char> expected_frame_data( | 1407 scoped_array<unsigned char> expected_frame_data( |
| 1410 new unsigned char[kFrameSize]); | 1408 new unsigned char[kFrameSize]); |
| 1411 memcpy(expected_frame_data.get(), kFrameHeader, arraysize(kFrameHeader)); | 1409 memcpy(expected_frame_data.get(), kFrameHeader, arraysize(kFrameHeader)); |
| 1412 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize); | 1410 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize); |
| 1413 | 1411 |
| 1414 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( | 1412 scoped_ptr<SpdyFrame> frame(framer.CreateDataFrame( |
| 1415 1, kData.data(), kData.size(), DATA_FLAG_FIN)); | 1413 1, kData.data(), kData.size(), DATA_FLAG_FIN)); |
| 1416 CompareFrame(kDescription, *frame, expected_frame_data.get(), kFrameSize); | 1414 CompareFrame(kDescription, *frame, expected_frame_data.get(), kFrameSize); |
| 1417 } | 1415 } |
| 1418 } | 1416 } |
| 1419 | 1417 |
| 1420 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { | 1418 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { |
| 1421 SpdyFramer framer(spdy_version_); | 1419 SpdyFramer framer(spdy_version_); |
| 1422 framer.set_enable_compression(false); | 1420 framer.set_enable_compression(false); |
| 1423 | 1421 |
| 1424 { | 1422 { |
| 1425 const char kDescription[] = "SYN_STREAM frame, lowest pri, slot 2, no FIN"; | 1423 const char kDescription[] = "SYN_STREAM frame, lowest pri, slot 2, no FIN"; |
| 1426 | 1424 |
| 1427 SpdyHeaderBlock headers; | 1425 SpdyHeaderBlock headers; |
| 1428 headers["bar"] = "foo"; | 1426 headers["bar"] = "foo"; |
| 1429 headers["foo"] = "bar"; | 1427 headers["foo"] = "bar"; |
| 1430 | 1428 |
| 1431 const unsigned char kPri = (IsSpdy2()) ? 0xC0 : 0xE0; | 1429 const unsigned char kPri = IsSpdy2() ? 0xC0 : 0xE0; |
| 1432 const unsigned char kCre = (IsSpdy2()) ? 0 : 2; | 1430 const unsigned char kCre = IsSpdy2() ? 0 : 2; |
| 1433 const unsigned char kV2FrameData[] = { | 1431 const unsigned char kV2FrameData[] = { |
| 1434 0x80, spdy_version_, 0x00, 0x01, | 1432 0x80, spdy_version_, 0x00, 0x01, |
| 1435 0x00, 0x00, 0x00, 0x20, | 1433 0x00, 0x00, 0x00, 0x20, |
| 1436 0x00, 0x00, 0x00, 0x01, | 1434 0x00, 0x00, 0x00, 0x01, |
| 1437 0x00, 0x00, 0x00, 0x00, | 1435 0x00, 0x00, 0x00, 0x00, |
| 1438 kPri, 0x00, 0x00, 0x02, | 1436 kPri, 0x00, 0x00, 0x02, |
| 1439 0x00, 0x03, 'b', 'a', | 1437 0x00, 0x03, 'b', 'a', |
| 1440 'r', 0x00, 0x03, 'f', | 1438 'r', 0x00, 0x03, 'f', |
| 1441 'o', 'o', 0x00, 0x03, | 1439 'o', 'o', 0x00, 0x03, |
| 1442 'f', 'o', 'o', 0x00, | 1440 'f', 'o', 'o', 0x00, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1523 | 1521 |
| 1524 { | 1522 { |
| 1525 const char kDescription[] = | 1523 const char kDescription[] = |
| 1526 "SYN_STREAM frame with a 0-length header val, high pri, FIN, " | 1524 "SYN_STREAM frame with a 0-length header val, high pri, FIN, " |
| 1527 "max stream ID"; | 1525 "max stream ID"; |
| 1528 | 1526 |
| 1529 SpdyHeaderBlock headers; | 1527 SpdyHeaderBlock headers; |
| 1530 headers["bar"] = "foo"; | 1528 headers["bar"] = "foo"; |
| 1531 headers["foo"] = ""; | 1529 headers["foo"] = ""; |
| 1532 | 1530 |
| 1533 const unsigned char kPri = (spdy_version_ != 2) ? 0x20 : 0x40; | 1531 const unsigned char kPri = IsSpdy2() ? 0x40 : 0x20; |
| 1534 const unsigned char kV2FrameData[] = { | 1532 const unsigned char kV2FrameData[] = { |
| 1535 0x80, spdy_version_, 0x00, 0x01, | 1533 0x80, spdy_version_, 0x00, 0x01, |
| 1536 0x01, 0x00, 0x00, 0x1D, | 1534 0x01, 0x00, 0x00, 0x1D, |
| 1537 0x7f, 0xff, 0xff, 0xff, | 1535 0x7f, 0xff, 0xff, 0xff, |
| 1538 0x7f, 0xff, 0xff, 0xff, | 1536 0x7f, 0xff, 0xff, 0xff, |
| 1539 kPri, 0x00, 0x00, 0x02, | 1537 kPri, 0x00, 0x00, 0x02, |
| 1540 0x00, 0x03, 'b', 'a', | 1538 0x00, 0x03, 'b', 'a', |
| 1541 'r', 0x00, 0x03, 'f', | 1539 'r', 0x00, 0x03, 'f', |
| 1542 'o', 'o', 0x00, 0x03, | 1540 'o', 'o', 0x00, 0x03, |
| 1543 'f', 'o', 'o', 0x00, | 1541 'f', 'o', 'o', 0x00, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1577 framer.set_enable_compression(true); | 1575 framer.set_enable_compression(true); |
| 1578 | 1576 |
| 1579 { | 1577 { |
| 1580 const char kDescription[] = | 1578 const char kDescription[] = |
| 1581 "SYN_STREAM frame, low pri, no FIN"; | 1579 "SYN_STREAM frame, low pri, no FIN"; |
| 1582 | 1580 |
| 1583 SpdyHeaderBlock headers; | 1581 SpdyHeaderBlock headers; |
| 1584 headers["bar"] = "foo"; | 1582 headers["bar"] = "foo"; |
| 1585 headers["foo"] = "bar"; | 1583 headers["foo"] = "bar"; |
| 1586 | 1584 |
| 1587 const SpdyPriority priority = (spdy_version_ != 2) ? 4 : 2; | 1585 const SpdyPriority priority = IsSpdy2() ? 2 : 4; |
| 1588 const unsigned char kV2FrameData[] = { | 1586 const unsigned char kV2FrameData[] = { |
| 1589 0x80, spdy_version_, 0x00, 0x01, | 1587 0x80, spdy_version_, 0x00, 0x01, |
| 1590 0x00, 0x00, 0x00, 0x25, | 1588 0x00, 0x00, 0x00, 0x25, |
| 1591 0x00, 0x00, 0x00, 0x01, | 1589 0x00, 0x00, 0x00, 0x01, |
| 1592 0x00, 0x00, 0x00, 0x00, | 1590 0x00, 0x00, 0x00, 0x00, |
| 1593 0x80, 0x00, 0x38, 0xea, | 1591 0x80, 0x00, 0x38, 0xea, |
| 1594 0xdf, 0xa2, 0x51, 0xb2, | 1592 0xdf, 0xa2, 0x51, 0xb2, |
| 1595 0x62, 0x60, 0x62, 0x60, | 1593 0x62, 0x60, 0x62, 0x60, |
| 1596 0x4e, 0x4a, 0x2c, 0x62, | 1594 0x4e, 0x4a, 0x2c, 0x62, |
| 1597 0x60, 0x4e, 0xcb, 0xcf, | 1595 0x60, 0x4e, 0xcb, 0xcf, |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1740 0x00, 0x00, 0x03, 'f', | 1738 0x00, 0x00, 0x03, 'f', |
| 1741 'o', 'o', 0x00, 0x00, | 1739 'o', 'o', 0x00, 0x00, |
| 1742 0x00, 0x03, 'f', 'o', | 1740 0x00, 0x03, 'f', 'o', |
| 1743 'o', 0x00, 0x00, 0x00, | 1741 'o', 0x00, 0x00, 0x00, |
| 1744 0x00 | 1742 0x00 |
| 1745 }; | 1743 }; |
| 1746 scoped_ptr<SpdyFrame> frame(framer.CreateSynReply( | 1744 scoped_ptr<SpdyFrame> frame(framer.CreateSynReply( |
| 1747 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); | 1745 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); |
| 1748 CompareFrame(kDescription, | 1746 CompareFrame(kDescription, |
| 1749 *frame, | 1747 *frame, |
| 1750 (IsSpdy2()) ? kV2FrameData : kV3FrameData, | 1748 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 1751 (IsSpdy2()) ? arraysize(kV2FrameData) | 1749 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 1752 : arraysize(kV3FrameData)); | |
| 1753 } | 1750 } |
| 1754 } | 1751 } |
| 1755 | 1752 |
| 1756 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) { | 1753 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) { |
| 1757 SpdyFramer framer(spdy_version_); | 1754 SpdyFramer framer(spdy_version_); |
| 1758 framer.set_enable_compression(true); | 1755 framer.set_enable_compression(true); |
| 1759 | 1756 |
| 1760 { | 1757 { |
| 1761 const char kDescription[] = "SYN_REPLY frame, no FIN"; | 1758 const char kDescription[] = "SYN_REPLY frame, no FIN"; |
| 1762 | 1759 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1787 0x4a, 0x04, 0xe5, 0x0b, | 1784 0x4a, 0x04, 0xe5, 0x0b, |
| 1788 0xe6, 0xb4, 0xfc, 0x7c, | 1785 0xe6, 0xb4, 0xfc, 0x7c, |
| 1789 0x24, 0x0a, 0x28, 0x08, | 1786 0x24, 0x0a, 0x28, 0x08, |
| 1790 0x00, 0x00, 0x00, 0xff, | 1787 0x00, 0x00, 0x00, 0xff, |
| 1791 0xff | 1788 0xff |
| 1792 }; | 1789 }; |
| 1793 scoped_ptr<SpdyFrame> frame(framer.CreateSynReply( | 1790 scoped_ptr<SpdyFrame> frame(framer.CreateSynReply( |
| 1794 1, CONTROL_FLAG_NONE, true, &headers)); | 1791 1, CONTROL_FLAG_NONE, true, &headers)); |
| 1795 CompareFrame(kDescription, | 1792 CompareFrame(kDescription, |
| 1796 *frame, | 1793 *frame, |
| 1797 (IsSpdy2()) ? kV2FrameData : kV3FrameData, | 1794 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 1798 (IsSpdy2()) ? arraysize(kV2FrameData) | 1795 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 1799 : arraysize(kV3FrameData)); | |
| 1800 } | 1796 } |
| 1801 } | 1797 } |
| 1802 | 1798 |
| 1803 TEST_P(SpdyFramerTest, CreateRstStream) { | 1799 TEST_P(SpdyFramerTest, CreateRstStream) { |
| 1804 SpdyFramer framer(spdy_version_); | 1800 SpdyFramer framer(spdy_version_); |
| 1805 | 1801 |
| 1806 { | 1802 { |
| 1807 const char kDescription[] = "RST_STREAM frame"; | 1803 const char kDescription[] = "RST_STREAM frame"; |
| 1808 const unsigned char kFrameData[] = { | 1804 const unsigned char kFrameData[] = { |
| 1809 0x80, spdy_version_, 0x00, 0x03, | 1805 0x80, spdy_version_, 0x00, 0x03, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1872 0x80, spdy_version_, 0x00, 0x04, | 1868 0x80, spdy_version_, 0x00, 0x04, |
| 1873 0x00, 0x00, 0x00, 0x0c, | 1869 0x00, 0x00, 0x00, 0x0c, |
| 1874 0x00, 0x00, 0x00, 0x01, | 1870 0x00, 0x00, 0x00, 0x01, |
| 1875 0x04, 0x03, 0x02, 0x01, | 1871 0x04, 0x03, 0x02, 0x01, |
| 1876 0x0a, 0x0b, 0x0c, 0x0d, | 1872 0x0a, 0x0b, 0x0c, 0x0d, |
| 1877 }; | 1873 }; |
| 1878 | 1874 |
| 1879 scoped_ptr<SpdySettingsControlFrame> frame(framer.CreateSettings(settings)); | 1875 scoped_ptr<SpdySettingsControlFrame> frame(framer.CreateSettings(settings)); |
| 1880 CompareFrame(kDescription, | 1876 CompareFrame(kDescription, |
| 1881 *frame, | 1877 *frame, |
| 1882 (IsSpdy2()) ? kFrameDatav2 : kFrameDatav3, | 1878 IsSpdy2() ? kFrameDatav2 : kFrameDatav3, |
| 1883 arraysize(kFrameDatav3)); // Size is unchanged among versions. | 1879 arraysize(kFrameDatav3)); // Size is unchanged among versions. |
| 1884 EXPECT_EQ(SpdyFramer::kInvalidStream, | 1880 EXPECT_EQ(SpdyFramer::kInvalidStream, |
| 1885 SpdyFramer::GetControlFrameStreamId(frame.get())); | 1881 SpdyFramer::GetControlFrameStreamId(frame.get())); |
| 1886 | 1882 |
| 1887 // Make sure that ParseSettings also works as advertised. | 1883 // Make sure that ParseSettings also works as advertised. |
| 1888 SettingsMap parsed_settings; | 1884 SettingsMap parsed_settings; |
| 1889 EXPECT_TRUE(framer.ParseSettings(frame.get(), &parsed_settings)); | 1885 EXPECT_TRUE(framer.ParseSettings(frame.get(), &parsed_settings)); |
| 1890 EXPECT_EQ(settings.size(), parsed_settings.size()); | 1886 EXPECT_EQ(settings.size(), parsed_settings.size()); |
| 1891 EXPECT_EQ(kFlags, parsed_settings[kId].first); | 1887 EXPECT_EQ(kFlags, parsed_settings[kId].first); |
| 1892 EXPECT_EQ(kValue, parsed_settings[kId].second); | 1888 EXPECT_EQ(kValue, parsed_settings[kId].second); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1980 const unsigned char kV3FrameData[] = { | 1976 const unsigned char kV3FrameData[] = { |
| 1981 0x80, spdy_version_, 0x00, 0x07, | 1977 0x80, spdy_version_, 0x00, 0x07, |
| 1982 0x00, 0x00, 0x00, 0x08, | 1978 0x00, 0x00, 0x00, 0x08, |
| 1983 0x00, 0x00, 0x00, 0x00, | 1979 0x00, 0x00, 0x00, 0x00, |
| 1984 0x00, 0x00, 0x00, 0x00, | 1980 0x00, 0x00, 0x00, 0x00, |
| 1985 }; | 1981 }; |
| 1986 scoped_ptr<SpdyGoAwayControlFrame> frame(framer.CreateGoAway(0, GOAWAY_OK)); | 1982 scoped_ptr<SpdyGoAwayControlFrame> frame(framer.CreateGoAway(0, GOAWAY_OK)); |
| 1987 CompareFrame(kDescription, | 1983 CompareFrame(kDescription, |
| 1988 *frame, | 1984 *frame, |
| 1989 IsSpdy2() ? kV2FrameData : kV3FrameData, | 1985 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 1990 IsSpdy2() ? arraysize(kV2FrameData) | 1986 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 1991 : arraysize(kV3FrameData)); | |
| 1992 EXPECT_EQ(SpdyFramer::kInvalidStream, | 1987 EXPECT_EQ(SpdyFramer::kInvalidStream, |
| 1993 SpdyFramer::GetControlFrameStreamId(frame.get())); | 1988 SpdyFramer::GetControlFrameStreamId(frame.get())); |
| 1994 } | 1989 } |
| 1995 | 1990 |
| 1996 { | 1991 { |
| 1997 const char kDescription[] = "GOAWAY frame with max stream ID, status"; | 1992 const char kDescription[] = "GOAWAY frame with max stream ID, status"; |
| 1998 const unsigned char kV2FrameData[] = { | 1993 const unsigned char kV2FrameData[] = { |
| 1999 0x80, spdy_version_, 0x00, 0x07, | 1994 0x80, spdy_version_, 0x00, 0x07, |
| 2000 0x00, 0x00, 0x00, 0x04, | 1995 0x00, 0x00, 0x00, 0x04, |
| 2001 0x7f, 0xff, 0xff, 0xff, | 1996 0x7f, 0xff, 0xff, 0xff, |
| 2002 }; | 1997 }; |
| 2003 const unsigned char kV3FrameData[] = { | 1998 const unsigned char kV3FrameData[] = { |
| 2004 0x80, spdy_version_, 0x00, 0x07, | 1999 0x80, spdy_version_, 0x00, 0x07, |
| 2005 0x00, 0x00, 0x00, 0x08, | 2000 0x00, 0x00, 0x00, 0x08, |
| 2006 0x7f, 0xff, 0xff, 0xff, | 2001 0x7f, 0xff, 0xff, 0xff, |
| 2007 0x00, 0x00, 0x00, 0x02, | 2002 0x00, 0x00, 0x00, 0x02, |
| 2008 }; | 2003 }; |
| 2009 scoped_ptr<SpdyFrame> frame(framer.CreateGoAway(0x7FFFFFFF, | 2004 scoped_ptr<SpdyFrame> frame(framer.CreateGoAway(0x7FFFFFFF, |
| 2010 GOAWAY_INTERNAL_ERROR)); | 2005 GOAWAY_INTERNAL_ERROR)); |
| 2011 CompareFrame(kDescription, | 2006 CompareFrame(kDescription, |
| 2012 *frame, | 2007 *frame, |
| 2013 IsSpdy2() ? kV2FrameData : kV3FrameData, | 2008 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 2014 IsSpdy2() ? arraysize(kV2FrameData) | 2009 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 2015 : arraysize(kV3FrameData)); | |
| 2016 } | 2010 } |
| 2017 } | 2011 } |
| 2018 | 2012 |
| 2019 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { | 2013 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
| 2020 SpdyFramer framer(spdy_version_); | 2014 SpdyFramer framer(spdy_version_); |
| 2021 framer.set_enable_compression(false); | 2015 framer.set_enable_compression(false); |
| 2022 | 2016 |
| 2023 { | 2017 { |
| 2024 const char kDescription[] = "HEADERS frame, no FIN"; | 2018 const char kDescription[] = "HEADERS frame, no FIN"; |
| 2025 | 2019 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 2048 0x00, 0x00, 0x03, 'f', | 2042 0x00, 0x00, 0x03, 'f', |
| 2049 'o', 'o', 0x00, 0x00, | 2043 'o', 'o', 0x00, 0x00, |
| 2050 0x00, 0x03, 'f', 'o', | 2044 0x00, 0x03, 'f', 'o', |
| 2051 'o', 0x00, 0x00, 0x00, | 2045 'o', 0x00, 0x00, 0x00, |
| 2052 0x03, 'b', 'a', 'r' | 2046 0x03, 'b', 'a', 'r' |
| 2053 }; | 2047 }; |
| 2054 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( | 2048 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( |
| 2055 1, CONTROL_FLAG_NONE, false, &headers)); | 2049 1, CONTROL_FLAG_NONE, false, &headers)); |
| 2056 CompareFrame(kDescription, | 2050 CompareFrame(kDescription, |
| 2057 *frame, | 2051 *frame, |
| 2058 (IsSpdy2()) ? kV2FrameData : kV3FrameData, | 2052 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 2059 (IsSpdy2()) ? arraysize(kV2FrameData) | 2053 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 2060 : arraysize(kV3FrameData)); | |
| 2061 } | 2054 } |
| 2062 | 2055 |
| 2063 { | 2056 { |
| 2064 const char kDescription[] = | 2057 const char kDescription[] = |
| 2065 "HEADERS frame with a 0-length header name, FIN, max stream ID"; | 2058 "HEADERS frame with a 0-length header name, FIN, max stream ID"; |
| 2066 | 2059 |
| 2067 SpdyHeaderBlock headers; | 2060 SpdyHeaderBlock headers; |
| 2068 headers[""] = "foo"; | 2061 headers[""] = "foo"; |
| 2069 headers["foo"] = "bar"; | 2062 headers["foo"] = "bar"; |
| 2070 | 2063 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 2090 0x00, 0x00, 0x03, 'f', | 2083 0x00, 0x00, 0x03, 'f', |
| 2091 'o', 'o', 0x00, 0x00, | 2084 'o', 'o', 0x00, 0x00, |
| 2092 0x00, 0x03, 'b', 'a', | 2085 0x00, 0x03, 'b', 'a', |
| 2093 'r' | 2086 'r' |
| 2094 }; | 2087 }; |
| 2095 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( | 2088 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( |
| 2096 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); | 2089 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); |
| 2097 CompareFrame(kDescription, | 2090 CompareFrame(kDescription, |
| 2098 *frame, | 2091 *frame, |
| 2099 IsSpdy2() ? kV2FrameData : kV3FrameData, | 2092 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 2100 IsSpdy2() ? arraysize(kV2FrameData) | 2093 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 2101 : arraysize(kV3FrameData)); | |
| 2102 } | 2094 } |
| 2103 | 2095 |
| 2104 { | 2096 { |
| 2105 const char kDescription[] = | 2097 const char kDescription[] = |
| 2106 "HEADERS frame with a 0-length header val, FIN, max stream ID"; | 2098 "HEADERS frame with a 0-length header val, FIN, max stream ID"; |
| 2107 | 2099 |
| 2108 SpdyHeaderBlock headers; | 2100 SpdyHeaderBlock headers; |
| 2109 headers["bar"] = "foo"; | 2101 headers["bar"] = "foo"; |
| 2110 headers["foo"] = ""; | 2102 headers["foo"] = ""; |
| 2111 | 2103 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 2131 'o', 'o', 0x00, 0x00, | 2123 'o', 'o', 0x00, 0x00, |
| 2132 0x00, 0x03, 'f', 'o', | 2124 0x00, 0x03, 'f', 'o', |
| 2133 'o', 0x00, 0x00, 0x00, | 2125 'o', 0x00, 0x00, 0x00, |
| 2134 0x00 | 2126 0x00 |
| 2135 }; | 2127 }; |
| 2136 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( | 2128 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( |
| 2137 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); | 2129 0x7fffffff, CONTROL_FLAG_FIN, false, &headers)); |
| 2138 CompareFrame(kDescription, | 2130 CompareFrame(kDescription, |
| 2139 *frame, | 2131 *frame, |
| 2140 IsSpdy2() ? kV2FrameData : kV3FrameData, | 2132 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 2141 IsSpdy2() ? arraysize(kV2FrameData) | 2133 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 2142 : arraysize(kV3FrameData)); | |
| 2143 } | 2134 } |
| 2144 } | 2135 } |
| 2145 | 2136 |
| 2146 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { | 2137 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { |
| 2147 SpdyFramer framer(spdy_version_); | 2138 SpdyFramer framer(spdy_version_); |
| 2148 framer.set_enable_compression(true); | 2139 framer.set_enable_compression(true); |
| 2149 | 2140 |
| 2150 { | 2141 { |
| 2151 const char kDescription[] = "HEADERS frame, no FIN"; | 2142 const char kDescription[] = "HEADERS frame, no FIN"; |
| 2152 | 2143 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2178 0xe6, 0xb4, 0xfc, 0x7c, | 2169 0xe6, 0xb4, 0xfc, 0x7c, |
| 2179 0x24, 0x0a, 0x28, 0x08, | 2170 0x24, 0x0a, 0x28, 0x08, |
| 2180 0x00, 0x00, 0x00, 0xff, | 2171 0x00, 0x00, 0x00, 0xff, |
| 2181 0xff | 2172 0xff |
| 2182 }; | 2173 }; |
| 2183 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( | 2174 scoped_ptr<SpdyFrame> frame(framer.CreateHeaders( |
| 2184 1, CONTROL_FLAG_NONE, true, &headers)); | 2175 1, CONTROL_FLAG_NONE, true, &headers)); |
| 2185 CompareFrame(kDescription, | 2176 CompareFrame(kDescription, |
| 2186 *frame, | 2177 *frame, |
| 2187 IsSpdy2() ? kV2FrameData : kV3FrameData, | 2178 IsSpdy2() ? kV2FrameData : kV3FrameData, |
| 2188 IsSpdy2() ? arraysize(kV2FrameData) | 2179 IsSpdy2() ? arraysize(kV2FrameData) : arraysize(kV3FrameData)); |
| 2189 : arraysize(kV3FrameData)); | |
| 2190 } | 2180 } |
| 2191 } | 2181 } |
| 2192 | 2182 |
| 2193 TEST_P(SpdyFramerTest, CreateWindowUpdate) { | 2183 TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
| 2194 SpdyFramer framer(spdy_version_); | 2184 SpdyFramer framer(spdy_version_); |
| 2195 | 2185 |
| 2196 { | 2186 { |
| 2197 const char kDescription[] = "WINDOW_UPDATE frame"; | 2187 const char kDescription[] = "WINDOW_UPDATE frame"; |
| 2198 const unsigned char kFrameData[] = { | 2188 const unsigned char kFrameData[] = { |
| 2199 0x80, spdy_version_, 0x00, 0x09, | 2189 0x80, spdy_version_, 0x00, 0x09, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2261 1, // priority | 2251 1, // priority |
| 2262 0, // credential_slot | 2252 0, // credential_slot |
| 2263 CONTROL_FLAG_NONE, | 2253 CONTROL_FLAG_NONE, |
| 2264 true, // compress | 2254 true, // compress |
| 2265 &headers)); | 2255 &headers)); |
| 2266 EXPECT_TRUE(control_frame.get() != NULL); | 2256 EXPECT_TRUE(control_frame.get() != NULL); |
| 2267 TestSpdyVisitor visitor(spdy_version_); | 2257 TestSpdyVisitor visitor(spdy_version_); |
| 2268 visitor.use_compression_ = true; | 2258 visitor.use_compression_ = true; |
| 2269 visitor.SimulateInFramer( | 2259 visitor.SimulateInFramer( |
| 2270 reinterpret_cast<unsigned char*>(control_frame->data()), | 2260 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2271 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2261 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2272 EXPECT_EQ(1, visitor.syn_frame_count_); | 2262 EXPECT_EQ(1, visitor.syn_frame_count_); |
| 2273 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 2263 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 2274 } | 2264 } |
| 2275 | 2265 |
| 2276 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { | 2266 TEST_P(SpdyFramerTest, ReadCompressedSynReplyHeaderBlock) { |
| 2277 SpdyHeaderBlock headers; | 2267 SpdyHeaderBlock headers; |
| 2278 headers["alpha"] = "beta"; | 2268 headers["alpha"] = "beta"; |
| 2279 headers["gamma"] = "delta"; | 2269 headers["gamma"] = "delta"; |
| 2280 SpdyFramer framer(spdy_version_); | 2270 SpdyFramer framer(spdy_version_); |
| 2281 scoped_ptr<SpdySynReplyControlFrame> control_frame( | 2271 scoped_ptr<SpdySynReplyControlFrame> control_frame( |
| 2282 framer.CreateSynReply(1, // stream_id | 2272 framer.CreateSynReply(1, // stream_id |
| 2283 CONTROL_FLAG_NONE, | 2273 CONTROL_FLAG_NONE, |
| 2284 true, // compress | 2274 true, // compress |
| 2285 &headers)); | 2275 &headers)); |
| 2286 EXPECT_TRUE(control_frame.get() != NULL); | 2276 EXPECT_TRUE(control_frame.get() != NULL); |
| 2287 TestSpdyVisitor visitor(spdy_version_); | 2277 TestSpdyVisitor visitor(spdy_version_); |
| 2288 visitor.use_compression_ = true; | 2278 visitor.use_compression_ = true; |
| 2289 visitor.SimulateInFramer( | 2279 visitor.SimulateInFramer( |
| 2290 reinterpret_cast<unsigned char*>(control_frame->data()), | 2280 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2291 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2281 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2292 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 2282 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
| 2293 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 2283 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 2294 } | 2284 } |
| 2295 | 2285 |
| 2296 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { | 2286 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { |
| 2297 SpdyHeaderBlock headers; | 2287 SpdyHeaderBlock headers; |
| 2298 headers["alpha"] = "beta"; | 2288 headers["alpha"] = "beta"; |
| 2299 headers["gamma"] = "delta"; | 2289 headers["gamma"] = "delta"; |
| 2300 SpdyFramer framer(spdy_version_); | 2290 SpdyFramer framer(spdy_version_); |
| 2301 scoped_ptr<SpdyHeadersControlFrame> control_frame( | 2291 scoped_ptr<SpdyHeadersControlFrame> control_frame( |
| 2302 framer.CreateHeaders(1, // stream_id | 2292 framer.CreateHeaders(1, // stream_id |
| 2303 CONTROL_FLAG_NONE, | 2293 CONTROL_FLAG_NONE, |
| 2304 true, // compress | 2294 true, // compress |
| 2305 &headers)); | 2295 &headers)); |
| 2306 EXPECT_TRUE(control_frame.get() != NULL); | 2296 EXPECT_TRUE(control_frame.get() != NULL); |
| 2307 TestSpdyVisitor visitor(spdy_version_); | 2297 TestSpdyVisitor visitor(spdy_version_); |
| 2308 visitor.use_compression_ = true; | 2298 visitor.use_compression_ = true; |
| 2309 visitor.SimulateInFramer( | 2299 visitor.SimulateInFramer( |
| 2310 reinterpret_cast<unsigned char*>(control_frame->data()), | 2300 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2311 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2301 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2312 EXPECT_EQ(1, visitor.headers_frame_count_); | 2302 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2313 // control_frame_header_data_count_ depends on the random sequence | 2303 // control_frame_header_data_count_ depends on the random sequence |
| 2314 // produced by rand(), so adding, removing or running single tests | 2304 // produced by rand(), so adding, removing or running single tests |
| 2315 // alters this value. The best we can do is assert that it happens | 2305 // alters this value. The best we can do is assert that it happens |
| 2316 // at least twice. | 2306 // at least twice. |
| 2317 EXPECT_LE(2, visitor.control_frame_header_data_count_); | 2307 EXPECT_LE(2, visitor.control_frame_header_data_count_); |
| 2318 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 2308 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
| 2319 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 2309 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
| 2320 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 2310 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 2321 } | 2311 } |
| 2322 | 2312 |
| 2323 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { | 2313 TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlockWithHalfClose) { |
| 2324 SpdyHeaderBlock headers; | 2314 SpdyHeaderBlock headers; |
| 2325 headers["alpha"] = "beta"; | 2315 headers["alpha"] = "beta"; |
| 2326 headers["gamma"] = "delta"; | 2316 headers["gamma"] = "delta"; |
| 2327 SpdyFramer framer(spdy_version_); | 2317 SpdyFramer framer(spdy_version_); |
| 2328 scoped_ptr<SpdyHeadersControlFrame> control_frame( | 2318 scoped_ptr<SpdyHeadersControlFrame> control_frame( |
| 2329 framer.CreateHeaders(1, // stream_id | 2319 framer.CreateHeaders(1, // stream_id |
| 2330 CONTROL_FLAG_FIN, | 2320 CONTROL_FLAG_FIN, |
| 2331 true, // compress | 2321 true, // compress |
| 2332 &headers)); | 2322 &headers)); |
| 2333 EXPECT_TRUE(control_frame.get() != NULL); | 2323 EXPECT_TRUE(control_frame.get() != NULL); |
| 2334 TestSpdyVisitor visitor(spdy_version_); | 2324 TestSpdyVisitor visitor(spdy_version_); |
| 2335 visitor.use_compression_ = true; | 2325 visitor.use_compression_ = true; |
| 2336 visitor.SimulateInFramer( | 2326 visitor.SimulateInFramer( |
| 2337 reinterpret_cast<unsigned char*>(control_frame->data()), | 2327 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2338 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2328 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2339 EXPECT_EQ(1, visitor.headers_frame_count_); | 2329 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 2340 // control_frame_header_data_count_ depends on the random sequence | 2330 // control_frame_header_data_count_ depends on the random sequence |
| 2341 // produced by rand(), so adding, removing or running single tests | 2331 // produced by rand(), so adding, removing or running single tests |
| 2342 // alters this value. The best we can do is assert that it happens | 2332 // alters this value. The best we can do is assert that it happens |
| 2343 // at least twice. | 2333 // at least twice. |
| 2344 EXPECT_LE(2, visitor.control_frame_header_data_count_); | 2334 EXPECT_LE(2, visitor.control_frame_header_data_count_); |
| 2345 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 2335 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
| 2346 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 2336 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
| 2347 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 2337 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 2348 } | 2338 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2401 0, // associated_stream_id | 2391 0, // associated_stream_id |
| 2402 1, // priority | 2392 1, // priority |
| 2403 0, // credential_slot | 2393 0, // credential_slot |
| 2404 CONTROL_FLAG_NONE, | 2394 CONTROL_FLAG_NONE, |
| 2405 false, // compress | 2395 false, // compress |
| 2406 &headers)); | 2396 &headers)); |
| 2407 EXPECT_TRUE(control_frame.get() != NULL); | 2397 EXPECT_TRUE(control_frame.get() != NULL); |
| 2408 TestSpdyVisitor visitor(spdy_version_); | 2398 TestSpdyVisitor visitor(spdy_version_); |
| 2409 visitor.SimulateInFramer( | 2399 visitor.SimulateInFramer( |
| 2410 reinterpret_cast<unsigned char*>(control_frame->data()), | 2400 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2411 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2401 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2412 EXPECT_FALSE(visitor.header_buffer_valid_); | 2402 EXPECT_FALSE(visitor.header_buffer_valid_); |
| 2413 EXPECT_EQ(1, visitor.error_count_); | 2403 EXPECT_EQ(1, visitor.error_count_); |
| 2414 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, | 2404 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, |
| 2415 visitor.framer_.error_code()); | 2405 visitor.framer_.error_code()); |
| 2416 EXPECT_EQ(0, visitor.syn_frame_count_); | 2406 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 2417 EXPECT_EQ(0u, visitor.header_buffer_length_); | 2407 EXPECT_EQ(0u, visitor.header_buffer_length_); |
| 2418 } | 2408 } |
| 2419 | 2409 |
| 2420 // Check that the framer stops delivering header data chunks once the visitor | 2410 // Check that the framer stops delivering header data chunks once the visitor |
| 2421 // declares it doesn't want any more. This is important to guard against | 2411 // declares it doesn't want any more. This is important to guard against |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2436 0, // credential_slot | 2426 0, // credential_slot |
| 2437 CONTROL_FLAG_FIN, // half close | 2427 CONTROL_FLAG_FIN, // half close |
| 2438 true, // compress | 2428 true, // compress |
| 2439 &headers)); | 2429 &headers)); |
| 2440 EXPECT_TRUE(control_frame.get() != NULL); | 2430 EXPECT_TRUE(control_frame.get() != NULL); |
| 2441 TestSpdyVisitor visitor(spdy_version_); | 2431 TestSpdyVisitor visitor(spdy_version_); |
| 2442 visitor.set_header_buffer_size(kHeaderBufferSize); | 2432 visitor.set_header_buffer_size(kHeaderBufferSize); |
| 2443 visitor.use_compression_ = true; | 2433 visitor.use_compression_ = true; |
| 2444 visitor.SimulateInFramer( | 2434 visitor.SimulateInFramer( |
| 2445 reinterpret_cast<unsigned char*>(control_frame->data()), | 2435 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2446 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2436 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2447 EXPECT_FALSE(visitor.header_buffer_valid_); | 2437 EXPECT_FALSE(visitor.header_buffer_valid_); |
| 2448 EXPECT_EQ(1, visitor.error_count_); | 2438 EXPECT_EQ(1, visitor.error_count_); |
| 2449 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, | 2439 EXPECT_EQ(SpdyFramer::SPDY_CONTROL_PAYLOAD_TOO_LARGE, |
| 2450 visitor.framer_.error_code()); | 2440 visitor.framer_.error_code()); |
| 2451 | 2441 |
| 2452 // The framer should have stoped delivering chunks after the visitor | 2442 // The framer should have stoped delivering chunks after the visitor |
| 2453 // signaled "stop" by returning false from OnControlFrameHeaderData(). | 2443 // signaled "stop" by returning false from OnControlFrameHeaderData(). |
| 2454 // | 2444 // |
| 2455 // control_frame_header_data_count_ depends on the random sequence | 2445 // control_frame_header_data_count_ depends on the random sequence |
| 2456 // produced by rand(), so adding, removing or running single tests | 2446 // produced by rand(), so adding, removing or running single tests |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 2476 0, // associated_stream_id | 2466 0, // associated_stream_id |
| 2477 1, // priority | 2467 1, // priority |
| 2478 0, // credential_slot | 2468 0, // credential_slot |
| 2479 CONTROL_FLAG_NONE, | 2469 CONTROL_FLAG_NONE, |
| 2480 false, // compress | 2470 false, // compress |
| 2481 &headers)); | 2471 &headers)); |
| 2482 TestSpdyVisitor visitor(spdy_version_); | 2472 TestSpdyVisitor visitor(spdy_version_); |
| 2483 visitor.use_compression_ = true; | 2473 visitor.use_compression_ = true; |
| 2484 visitor.SimulateInFramer( | 2474 visitor.SimulateInFramer( |
| 2485 reinterpret_cast<unsigned char*>(control_frame->data()), | 2475 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2486 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2476 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2487 EXPECT_EQ(1, visitor.error_count_); | 2477 EXPECT_EQ(1, visitor.error_count_); |
| 2488 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code()); | 2478 EXPECT_EQ(SpdyFramer::SPDY_DECOMPRESS_FAILURE, visitor.framer_.error_code()); |
| 2489 EXPECT_EQ(0u, visitor.header_buffer_length_); | 2479 EXPECT_EQ(0u, visitor.header_buffer_length_); |
| 2490 } | 2480 } |
| 2491 | 2481 |
| 2492 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { | 2482 TEST_P(SpdyFramerTest, ControlFrameSizesAreValidated) { |
| 2493 // Create a GoAway frame that has a few extra bytes at the end. | 2483 // Create a GoAway frame that has a few extra bytes at the end. |
| 2494 // We create enough overhead to overflow the framer's control frame buffer. | 2484 // We create enough overhead to overflow the framer's control frame buffer. |
| 2495 size_t overhead = SpdyFramer::kControlFrameBufferSize; | 2485 size_t overhead = SpdyFramer::kControlFrameBufferSize; |
| 2496 | |
| 2497 SpdyFramer framer(spdy_version_); | 2486 SpdyFramer framer(spdy_version_); |
| 2498 scoped_ptr<SpdyGoAwayControlFrame> goaway(framer.CreateGoAway(1, GOAWAY_OK)); | 2487 scoped_ptr<SpdyGoAwayControlFrame> goaway(framer.CreateGoAway(1, GOAWAY_OK)); |
| 2499 goaway->set_length(goaway->length() + overhead); | 2488 goaway->set_length(goaway->length() + overhead); |
| 2500 std::string pad('A', overhead); | 2489 string pad('A', overhead); |
| 2501 TestSpdyVisitor visitor(spdy_version_); | 2490 TestSpdyVisitor visitor(spdy_version_); |
| 2502 | 2491 |
| 2503 visitor.SimulateInFramer( | 2492 visitor.SimulateInFramer( |
| 2504 reinterpret_cast<unsigned char*>(goaway->data()), | 2493 reinterpret_cast<unsigned char*>(goaway->data()), |
| 2505 goaway->length() - overhead + SpdyControlFrame::kHeaderSize); | 2494 goaway->length() - overhead + SpdyControlFrame::kHeaderSize); |
| 2506 visitor.SimulateInFramer( | 2495 visitor.SimulateInFramer( |
| 2507 reinterpret_cast<const unsigned char*>(pad.c_str()), | 2496 reinterpret_cast<const unsigned char*>(pad.c_str()), |
| 2508 overhead); | 2497 overhead); |
| 2498 | |
| 2509 EXPECT_EQ(1, visitor.error_count_); // This generated an error. | 2499 EXPECT_EQ(1, visitor.error_count_); // This generated an error. |
| 2510 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 2500 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
| 2511 visitor.framer_.error_code()); | 2501 visitor.framer_.error_code()); |
| 2512 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. | 2502 EXPECT_EQ(0, visitor.goaway_count_); // Frame not parsed. |
| 2513 } | 2503 } |
| 2514 | 2504 |
| 2515 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { | 2505 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { |
| 2516 SpdyFramer framer(spdy_version_); | 2506 SpdyFramer framer(spdy_version_); |
| 2517 SettingsMap settings; | 2507 SettingsMap settings; |
| 2518 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); | 2508 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 2519 control_frame->set_length(0); | 2509 control_frame->set_length(0); |
| 2520 TestSpdyVisitor visitor(spdy_version_); | 2510 TestSpdyVisitor visitor(spdy_version_); |
| 2521 visitor.use_compression_ = false; | 2511 visitor.use_compression_ = false; |
| 2522 visitor.SimulateInFramer( | 2512 visitor.SimulateInFramer( |
| 2523 reinterpret_cast<unsigned char*>(control_frame->data()), | 2513 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2524 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2514 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2525 // Should generate an error, since zero-len settings frames are unsupported. | 2515 // Should generate an error, since zero-len settings frames are unsupported. |
| 2526 EXPECT_EQ(1, visitor.error_count_); | 2516 EXPECT_EQ(1, visitor.error_count_); |
| 2527 } | 2517 } |
| 2528 | 2518 |
| 2529 // Tests handling of SETTINGS frames with invalid length. | 2519 // Tests handling of SETTINGS frames with invalid length. |
| 2530 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { | 2520 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { |
| 2531 SpdyFramer framer(spdy_version_); | 2521 SpdyFramer framer(spdy_version_); |
| 2532 SettingsMap settings; | 2522 SettingsMap settings; |
| 2533 // Add a setting to pad the frame so that we don't get a buffer overflow when | 2523 // Add a setting to pad the frame so that we don't get a buffer overflow when |
| 2534 // calling SimulateInFramer() below. | 2524 // calling SimulateInFramer() below. |
| 2535 settings[SETTINGS_UPLOAD_BANDWIDTH] = | 2525 settings[SETTINGS_UPLOAD_BANDWIDTH] = |
| 2536 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0x00000002); | 2526 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, 0x00000002); |
| 2537 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); | 2527 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 2538 control_frame->set_length(5); | 2528 control_frame->set_length(5); |
| 2539 TestSpdyVisitor visitor(spdy_version_); | 2529 TestSpdyVisitor visitor(spdy_version_); |
| 2540 visitor.use_compression_ = false; | 2530 visitor.use_compression_ = false; |
| 2541 visitor.SimulateInFramer( | 2531 visitor.SimulateInFramer( |
| 2542 reinterpret_cast<unsigned char*>(control_frame->data()), | 2532 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2543 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2533 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2544 // Should generate an error, since zero-len settings frames are unsupported. | 2534 // Should generate an error, since zero-len settings frames are unsupported. |
| 2545 EXPECT_EQ(1, visitor.error_count_); | 2535 EXPECT_EQ(1, visitor.error_count_); |
| 2546 } | 2536 } |
| 2547 | 2537 |
| 2548 // Tests handling of SETTINGS frames larger than the frame buffer size. | 2538 // Tests handling of SETTINGS frames larger than the frame buffer size. |
| 2549 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { | 2539 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { |
| 2550 SpdyFramer framer(spdy_version_); | 2540 SpdyFramer framer(spdy_version_); |
| 2551 SettingsMap settings; | 2541 SettingsMap settings; |
| 2552 SpdySettingsFlags flags = SETTINGS_FLAG_NONE; | 2542 SpdySettingsFlags flags = SETTINGS_FLAG_PLEASE_PERSIST; |
| 2553 settings[SETTINGS_UPLOAD_BANDWIDTH] = | 2543 settings[SETTINGS_UPLOAD_BANDWIDTH] = |
| 2554 SettingsFlagsAndValue(flags, 0x00000002); | 2544 SettingsFlagsAndValue(flags, 0x00000002); |
| 2555 settings[SETTINGS_DOWNLOAD_BANDWIDTH] = | 2545 settings[SETTINGS_DOWNLOAD_BANDWIDTH] = |
| 2556 SettingsFlagsAndValue(flags, 0x00000003); | 2546 SettingsFlagsAndValue(flags, 0x00000003); |
| 2557 settings[SETTINGS_ROUND_TRIP_TIME] = SettingsFlagsAndValue(flags, 0x00000004); | 2547 settings[SETTINGS_ROUND_TRIP_TIME] = SettingsFlagsAndValue(flags, 0x00000004); |
| 2558 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); | 2548 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 2559 EXPECT_LT(SpdyFramer::kControlFrameBufferSize, | 2549 EXPECT_LT(SpdyFramer::kControlFrameBufferSize, |
| 2560 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2550 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2561 TestSpdyVisitor visitor(spdy_version_); | 2551 TestSpdyVisitor visitor(spdy_version_); |
| 2562 visitor.use_compression_ = false; | 2552 visitor.use_compression_ = false; |
| 2563 | 2553 |
| 2564 // Read all at once. | 2554 // Read all at once. |
| 2565 visitor.SimulateInFramer( | 2555 visitor.SimulateInFramer( |
| 2566 reinterpret_cast<unsigned char*>(control_frame->data()), | 2556 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2567 control_frame->length() + SpdyControlFrame::kHeaderSize); | 2557 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2568 EXPECT_EQ(0, visitor.error_count_); | 2558 EXPECT_EQ(0, visitor.error_count_); |
| 2569 EXPECT_EQ(settings.size(), static_cast<unsigned>(visitor.setting_count_)); | 2559 EXPECT_EQ(settings.size(), static_cast<unsigned>(visitor.setting_count_)); |
| 2570 EXPECT_EQ(1, visitor.settings_frame_count_); | 2560 EXPECT_EQ(1, visitor.settings_frame_count_); |
| 2571 | 2561 |
| 2572 // Read data in small chunks. | 2562 // Read data in small chunks. |
| 2573 size_t framed_data = 0; | 2563 size_t framed_data = 0; |
| 2574 size_t unframed_data = control_frame->length() + | 2564 size_t unframed_data = control_frame->length() + |
| 2575 SpdyControlFrame::kHeaderSize; | 2565 SpdyControlFrame::kHeaderSize; |
| 2576 size_t kReadChunkSize = 5; // Read five bytes at a time. | 2566 size_t kReadChunkSize = 5; // Read five bytes at a time. |
| 2577 while (unframed_data > 0) { | 2567 while (unframed_data > 0) { |
| 2578 size_t to_read = std::min(kReadChunkSize, unframed_data); | 2568 size_t to_read = min(kReadChunkSize, unframed_data); |
| 2579 visitor.SimulateInFramer( | 2569 visitor.SimulateInFramer( |
| 2580 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), | 2570 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data), |
| 2581 to_read); | 2571 to_read); |
| 2582 unframed_data -= to_read; | 2572 unframed_data -= to_read; |
| 2583 framed_data += to_read; | 2573 framed_data += to_read; |
| 2584 } | 2574 } |
| 2585 EXPECT_EQ(0, visitor.error_count_); | 2575 EXPECT_EQ(0, visitor.error_count_); |
| 2586 EXPECT_EQ(settings.size() * 2, static_cast<unsigned>(visitor.setting_count_)); | 2576 EXPECT_EQ(settings.size() * 2, static_cast<unsigned>(visitor.setting_count_)); |
| 2587 EXPECT_EQ(2, visitor.settings_frame_count_); | 2577 EXPECT_EQ(2, visitor.settings_frame_count_); |
| 2588 } | 2578 } |
| 2589 | 2579 |
| 2590 TEST_P(SpdyFramerTest, ReadCredentialFrame) { | 2580 TEST_P(SpdyFramerTest, ReadCredentialFrame) { |
| 2591 SpdyCredential credential; | 2581 SpdyCredential credential; |
| 2592 credential.slot = 3; | 2582 credential.slot = 3; |
| 2593 credential.proof = "proof"; | 2583 credential.proof = "proof"; |
| 2594 credential.certs.push_back("a cert"); | 2584 credential.certs.push_back("a cert"); |
| 2595 credential.certs.push_back("another cert"); | 2585 credential.certs.push_back("another cert"); |
| 2596 credential.certs.push_back("final cert"); | 2586 credential.certs.push_back("final cert"); |
| 2597 SpdyFramer framer(spdy_version_); | 2587 SpdyFramer framer(spdy_version_); |
| 2598 scoped_ptr<SpdyFrame> control_frame( | 2588 scoped_ptr<SpdyFrame> control_frame( |
| 2599 framer.CreateCredentialFrame(credential)); | 2589 framer.CreateCredentialFrame(credential)); |
| 2600 EXPECT_TRUE(control_frame.get() != NULL); | 2590 EXPECT_TRUE(control_frame.get() != NULL); |
| 2601 TestSpdyVisitor visitor(spdy_version_); | 2591 TestSpdyVisitor visitor(spdy_version_); |
| 2602 visitor.use_compression_ = false; | 2592 visitor.use_compression_ = false; |
| 2603 visitor.SimulateInFramer( | 2593 visitor.SimulateInFramer( |
| 2604 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 2594 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 2605 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2595 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2606 EXPECT_EQ(0, visitor.error_count_); | 2596 EXPECT_EQ(0, visitor.error_count_); |
| 2607 EXPECT_EQ(1, visitor.credential_count_); | 2597 EXPECT_EQ(1, visitor.credential_count_); |
| 2608 EXPECT_EQ(control_frame->length(), visitor.credential_buffer_length_); | 2598 EXPECT_EQ(control_frame->length(), visitor.credential_buffer_length_); |
| 2609 EXPECT_EQ(credential.slot, visitor.credential_.slot); | 2599 EXPECT_EQ(credential.slot, visitor.credential_.slot); |
| 2610 EXPECT_EQ(credential.proof, visitor.credential_.proof); | 2600 EXPECT_EQ(credential.proof, visitor.credential_.proof); |
| 2611 EXPECT_EQ(credential.certs.size(), visitor.credential_.certs.size()); | 2601 EXPECT_EQ(credential.certs.size(), visitor.credential_.certs.size()); |
| 2612 for (size_t i = 0; i < credential.certs.size(); i++) { | 2602 for (size_t i = 0; i < credential.certs.size(); i++) { |
| 2613 EXPECT_EQ(credential.certs[i], visitor.credential_.certs[i]); | 2603 EXPECT_EQ(credential.certs[i], visitor.credential_.certs[i]); |
| 2614 } | 2604 } |
| 2615 } | 2605 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2674 credential.certs.push_back("a cert"); | 2664 credential.certs.push_back("a cert"); |
| 2675 credential.certs.push_back("another cert"); | 2665 credential.certs.push_back("another cert"); |
| 2676 credential.certs.push_back("final cert"); | 2666 credential.certs.push_back("final cert"); |
| 2677 SpdyFramer framer(spdy_version_); | 2667 SpdyFramer framer(spdy_version_); |
| 2678 scoped_ptr<SpdyFrame> control_frame( | 2668 scoped_ptr<SpdyFrame> control_frame( |
| 2679 framer.CreateCredentialFrame(credential)); | 2669 framer.CreateCredentialFrame(credential)); |
| 2680 EXPECT_TRUE(control_frame.get() != NULL); | 2670 EXPECT_TRUE(control_frame.get() != NULL); |
| 2681 TestSpdyVisitor visitor(spdy_version_); | 2671 TestSpdyVisitor visitor(spdy_version_); |
| 2682 visitor.use_compression_ = false; | 2672 visitor.use_compression_ = false; |
| 2683 unsigned char* data = | 2673 unsigned char* data = |
| 2684 reinterpret_cast<unsigned char*>(control_frame.get()->data()); | 2674 reinterpret_cast<unsigned char*>(control_frame->data()); |
| 2685 size_t offset = SpdyControlFrame::kHeaderSize + 4; | 2675 size_t offset = SpdyControlFrame::kHeaderSize + 4; |
| 2686 data[offset] = 0xFF; // Proof length is past the end of the frame | 2676 data[offset] = 0xFF; // Proof length is past the end of the frame |
| 2687 visitor.SimulateInFramer( | 2677 visitor.SimulateInFramer( |
| 2688 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2678 data, control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2689 EXPECT_EQ(1, visitor.error_count_); | 2679 EXPECT_EQ(1, visitor.error_count_); |
| 2690 } | 2680 } |
| 2691 | 2681 |
| 2692 TEST_P(SpdyFramerTest, ReadCredentialFrameWithCorruptCertificate) { | 2682 TEST_P(SpdyFramerTest, ReadCredentialFrameWithCorruptCertificate) { |
| 2693 SpdyCredential credential; | 2683 SpdyCredential credential; |
| 2694 credential.slot = 3; | 2684 credential.slot = 3; |
| 2695 credential.proof = "proof"; | 2685 credential.proof = "proof"; |
| 2696 credential.certs.push_back("a cert"); | 2686 credential.certs.push_back("a cert"); |
| 2697 credential.certs.push_back("another cert"); | 2687 credential.certs.push_back("another cert"); |
| 2698 credential.certs.push_back("final cert"); | 2688 credential.certs.push_back("final cert"); |
| 2699 SpdyFramer framer(spdy_version_); | 2689 SpdyFramer framer(spdy_version_); |
| 2700 scoped_ptr<SpdyFrame> control_frame( | 2690 scoped_ptr<SpdyFrame> control_frame( |
| 2701 framer.CreateCredentialFrame(credential)); | 2691 framer.CreateCredentialFrame(credential)); |
| 2702 EXPECT_TRUE(control_frame.get() != NULL); | 2692 EXPECT_TRUE(control_frame.get() != NULL); |
| 2703 TestSpdyVisitor visitor(spdy_version_); | 2693 TestSpdyVisitor visitor(spdy_version_); |
| 2704 visitor.use_compression_ = false; | 2694 visitor.use_compression_ = false; |
| 2705 unsigned char* data = | 2695 unsigned char* data = |
| 2706 reinterpret_cast<unsigned char*>(control_frame.get()->data()); | 2696 reinterpret_cast<unsigned char*>(control_frame->data()); |
| 2707 size_t offset = SpdyControlFrame::kHeaderSize + credential.proof.length(); | 2697 size_t offset = SpdyControlFrame::kHeaderSize + credential.proof.length(); |
| 2708 data[offset] = 0xFF; // Certificate length is past the end of the frame | 2698 data[offset] = 0xFF; // Certificate length is past the end of the frame |
| 2709 visitor.SimulateInFramer( | 2699 visitor.SimulateInFramer( |
| 2710 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 2700 data, control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 2711 EXPECT_EQ(1, visitor.error_count_); | 2701 EXPECT_EQ(1, visitor.error_count_); |
| 2712 } | 2702 } |
| 2713 | 2703 |
| 2714 TEST_P(SpdyFramerTest, ReadGarbage) { | 2704 TEST_P(SpdyFramerTest, ReadGarbage) { |
| 2715 SpdyFramer framer(spdy_version_); | 2705 SpdyFramer framer(spdy_version_); |
| 2716 unsigned char garbage_frame[256]; | 2706 unsigned char garbage_frame[256]; |
| 2717 memset(garbage_frame, ~0, sizeof(garbage_frame)); | 2707 memset(garbage_frame, ~0, sizeof(garbage_frame)); |
| 2718 TestSpdyVisitor visitor(spdy_version_); | 2708 TestSpdyVisitor visitor(spdy_version_); |
| 2719 visitor.use_compression_ = false; | 2709 visitor.use_compression_ = false; |
| 2720 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); | 2710 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2876 GOAWAY)); | 2866 GOAWAY)); |
| 2877 EXPECT_EQ(SpdyHeadersControlFrame::size(), | 2867 EXPECT_EQ(SpdyHeadersControlFrame::size(), |
| 2878 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, | 2868 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, |
| 2879 HEADERS)); | 2869 HEADERS)); |
| 2880 EXPECT_EQ(SpdyWindowUpdateControlFrame::size(), | 2870 EXPECT_EQ(SpdyWindowUpdateControlFrame::size(), |
| 2881 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, | 2871 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, |
| 2882 WINDOW_UPDATE)); | 2872 WINDOW_UPDATE)); |
| 2883 EXPECT_EQ(SpdyCredentialControlFrame::size(), | 2873 EXPECT_EQ(SpdyCredentialControlFrame::size(), |
| 2884 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, | 2874 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, |
| 2885 CREDENTIAL)); | 2875 CREDENTIAL)); |
| 2886 EXPECT_EQ(static_cast<size_t>(0x7FFFFFFF), | 2876 EXPECT_EQ(numeric_limits<size_t>::max(), |
| 2887 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, | 2877 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, |
| 2888 NUM_CONTROL_FRAME_TYPES)); | 2878 NUM_CONTROL_FRAME_TYPES)); |
| 2889 } | 2879 } |
| 2890 | 2880 |
| 2891 TEST_P(SpdyFramerTest, CatchProbableHttpResponse) { | 2881 TEST_P(SpdyFramerTest, CatchProbableHttpResponse) { |
| 2892 { | 2882 { |
| 2893 testing::StrictMock<test::MockVisitor> visitor; | 2883 testing::StrictMock<test::MockVisitor> visitor; |
| 2894 SpdyFramer framer(spdy_version_); | 2884 SpdyFramer framer(spdy_version_); |
| 2895 framer.set_visitor(&visitor); | 2885 framer.set_visitor(&visitor); |
| 2896 | 2886 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2961 | 2951 |
| 2962 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize; | 2952 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize; |
| 2963 framer.ProcessInput(frame->data(), frame_size); | 2953 framer.ProcessInput(frame->data(), frame_size); |
| 2964 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 2954 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 2965 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()); | 2955 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()); |
| 2966 } | 2956 } |
| 2967 | 2957 |
| 2968 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { | 2958 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { |
| 2969 const uint32 kId = 0x020304; | 2959 const uint32 kId = 0x020304; |
| 2970 const uint32 kFlags = 0x01; | 2960 const uint32 kFlags = 0x01; |
| 2971 const uint32 kWireFormat = | 2961 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); |
| 2972 htonl(IsSpdy2() ? 0x04030201 : 0x01020304); | |
| 2973 | 2962 |
| 2974 SettingsFlagsAndId id_and_flags = | 2963 SettingsFlagsAndId id_and_flags = |
| 2975 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); | 2964 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); |
| 2976 EXPECT_EQ(kId, id_and_flags.id()); | 2965 EXPECT_EQ(kId, id_and_flags.id()); |
| 2977 EXPECT_EQ(kFlags, id_and_flags.flags()); | 2966 EXPECT_EQ(kFlags, id_and_flags.flags()); |
| 2978 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); | 2967 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); |
| 2979 } | 2968 } |
| 2980 | 2969 |
| 2981 } // namespace net | 2970 } // namespace net |
| OLD | NEW |