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 "net/spdy/spdy_framer.h" | 5 #include "net/spdy/spdy_framer.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 #include <limits> | 11 #include <limits> |
12 #include <memory> | 12 #include <memory> |
13 #include <string> | 13 #include <string> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "base/compiler_specific.h" | 16 #include "base/compiler_specific.h" |
| 17 #include "base/macros.h" |
17 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
18 #include "net/spdy/hpack/hpack_constants.h" | 19 #include "net/spdy/hpack/hpack_constants.h" |
19 #include "net/spdy/mock_spdy_framer_visitor.h" | 20 #include "net/spdy/mock_spdy_framer_visitor.h" |
20 #include "net/spdy/spdy_frame_builder.h" | 21 #include "net/spdy/spdy_frame_builder.h" |
21 #include "net/spdy/spdy_frame_reader.h" | 22 #include "net/spdy/spdy_frame_reader.h" |
22 #include "net/spdy/spdy_protocol.h" | 23 #include "net/spdy/spdy_protocol.h" |
23 #include "net/spdy/spdy_test_utils.h" | 24 #include "net/spdy/spdy_test_utils.h" |
24 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
25 #include "testing/platform_test.h" | 26 #include "testing/platform_test.h" |
26 | 27 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); | 153 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers)); |
153 ResetBuffer(); | 154 ResetBuffer(); |
154 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); | 155 memcpy(buffer_.get(), frame->data(), framer.GetHeadersMinimumSize()); |
155 size_ += framer.GetSynStreamMinimumSize(); | 156 size_ += framer.GetSynStreamMinimumSize(); |
156 } | 157 } |
157 | 158 |
158 void OnRstStream(SpdyStreamId stream_id, | 159 void OnRstStream(SpdyStreamId stream_id, |
159 SpdyRstStreamStatus status) override { | 160 SpdyRstStreamStatus status) override { |
160 LOG(FATAL); | 161 LOG(FATAL); |
161 } | 162 } |
162 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { | 163 void OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) override { |
163 LOG(FATAL); | 164 LOG(FATAL); |
164 } | 165 } |
165 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } | 166 void OnPing(SpdyPingId unique_id, bool is_ack) override { LOG(FATAL); } |
166 void OnSettingsEnd() override { LOG(FATAL); } | 167 void OnSettingsEnd() override { LOG(FATAL); } |
167 void OnGoAway(SpdyStreamId last_accepted_stream_id, | 168 void OnGoAway(SpdyStreamId last_accepted_stream_id, |
168 SpdyGoAwayStatus status) override { | 169 SpdyGoAwayStatus status) override { |
169 LOG(FATAL); | 170 LOG(FATAL); |
170 } | 171 } |
171 | 172 |
172 void OnHeaders(SpdyStreamId stream_id, | 173 void OnHeaders(SpdyStreamId stream_id, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 memcpy(buffer_.get(), frame->data(), framer.GetPushPromiseMinimumSize()); | 207 memcpy(buffer_.get(), frame->data(), framer.GetPushPromiseMinimumSize()); |
207 size_ += framer.GetPushPromiseMinimumSize(); | 208 size_ += framer.GetPushPromiseMinimumSize(); |
208 } | 209 } |
209 | 210 |
210 void OnContinuation(SpdyStreamId stream_id, bool end) override { | 211 void OnContinuation(SpdyStreamId stream_id, bool end) override { |
211 LOG(FATAL); | 212 LOG(FATAL); |
212 } | 213 } |
213 | 214 |
214 void OnPriority(SpdyStreamId stream_id, | 215 void OnPriority(SpdyStreamId stream_id, |
215 SpdyStreamId parent_stream_id, | 216 SpdyStreamId parent_stream_id, |
216 uint8 weight, | 217 uint8_t weight, |
217 bool exclusive) override { | 218 bool exclusive) override { |
218 // Do nothing. | 219 // Do nothing. |
219 } | 220 } |
220 | 221 |
221 bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { | 222 bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { |
222 LOG(FATAL); | 223 LOG(FATAL); |
223 return false; | 224 return false; |
224 } | 225 } |
225 | 226 |
226 char* ReleaseBuffer() { | 227 char* ReleaseBuffer() { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 ++fin_frame_count_; | 397 ++fin_frame_count_; |
397 } | 398 } |
398 | 399 |
399 bool OnRstStreamFrameData(const char* rst_stream_data, size_t len) override { | 400 bool OnRstStreamFrameData(const char* rst_stream_data, size_t len) override { |
400 if ((rst_stream_data != NULL) && (len > 0)) { | 401 if ((rst_stream_data != NULL) && (len > 0)) { |
401 fin_opaque_data_ += string(rst_stream_data, len); | 402 fin_opaque_data_ += string(rst_stream_data, len); |
402 } | 403 } |
403 return true; | 404 return true; |
404 } | 405 } |
405 | 406 |
406 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override { | 407 void OnSetting(SpdySettingsIds id, uint8_t flags, uint32_t value) override { |
407 ++setting_count_; | 408 ++setting_count_; |
408 } | 409 } |
409 | 410 |
410 void OnSettingsAck() override { | 411 void OnSettingsAck() override { |
411 DCHECK_LT(SPDY3, framer_.protocol_version()); | 412 DCHECK_LT(SPDY3, framer_.protocol_version()); |
412 ++settings_ack_received_; | 413 ++settings_ack_received_; |
413 } | 414 } |
414 | 415 |
415 void OnSettingsEnd() override { | 416 void OnSettingsEnd() override { |
416 if (framer_.protocol_version() <= SPDY3) { return; } | 417 if (framer_.protocol_version() <= SPDY3) { return; } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 } | 470 } |
470 for (const SpdyAltSvcWireFormat::AlternativeService& altsvc : | 471 for (const SpdyAltSvcWireFormat::AlternativeService& altsvc : |
471 altsvc_vector) { | 472 altsvc_vector) { |
472 test_altsvc_ir_.add_altsvc(altsvc); | 473 test_altsvc_ir_.add_altsvc(altsvc); |
473 } | 474 } |
474 ++altsvc_count_; | 475 ++altsvc_count_; |
475 } | 476 } |
476 | 477 |
477 void OnPriority(SpdyStreamId stream_id, | 478 void OnPriority(SpdyStreamId stream_id, |
478 SpdyStreamId parent_stream_id, | 479 SpdyStreamId parent_stream_id, |
479 uint8 weight, | 480 uint8_t weight, |
480 bool exclusive) override { | 481 bool exclusive) override { |
481 ++priority_count_; | 482 ++priority_count_; |
482 } | 483 } |
483 | 484 |
484 bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { | 485 bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { |
485 DLOG(INFO) << "Unknown frame type " << frame_type; | 486 DLOG(INFO) << "Unknown frame type " << frame_type; |
486 return on_unknown_frame_result_; | 487 return on_unknown_frame_result_; |
487 } | 488 } |
488 | 489 |
489 void OnSendCompressedFrame(SpdyStreamId stream_id, | 490 void OnSendCompressedFrame(SpdyStreamId stream_id, |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 StringPiece GetSerializedHeaders(const SpdyFrame* frame, | 616 StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
616 const SpdyFramer& framer) { | 617 const SpdyFramer& framer) { |
617 SpdyFrameReader reader(frame->data(), frame->size()); | 618 SpdyFrameReader reader(frame->data(), frame->size()); |
618 if (framer.protocol_version() > SPDY3) { | 619 if (framer.protocol_version() > SPDY3) { |
619 reader.Seek(3); // Seek past the frame length. | 620 reader.Seek(3); // Seek past the frame length. |
620 } else { | 621 } else { |
621 reader.Seek(2); // Seek past the frame length. | 622 reader.Seek(2); // Seek past the frame length. |
622 } | 623 } |
623 SpdyFrameType frame_type; | 624 SpdyFrameType frame_type; |
624 if (framer.protocol_version() > SPDY3) { | 625 if (framer.protocol_version() > SPDY3) { |
625 uint8 serialized_type; | 626 uint8_t serialized_type; |
626 reader.ReadUInt8(&serialized_type); | 627 reader.ReadUInt8(&serialized_type); |
627 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), | 628 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
628 serialized_type); | 629 serialized_type); |
629 DCHECK_EQ(HEADERS, frame_type); | 630 DCHECK_EQ(HEADERS, frame_type); |
630 uint8 flags; | 631 uint8_t flags; |
631 reader.ReadUInt8(&flags); | 632 reader.ReadUInt8(&flags); |
632 if (flags & HEADERS_FLAG_PRIORITY) { | 633 if (flags & HEADERS_FLAG_PRIORITY) { |
633 frame_type = SYN_STREAM; | 634 frame_type = SYN_STREAM; |
634 } | 635 } |
635 } else { | 636 } else { |
636 uint16 serialized_type; | 637 uint16_t serialized_type; |
637 reader.ReadUInt16(&serialized_type); | 638 reader.ReadUInt16(&serialized_type); |
638 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), | 639 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
639 serialized_type); | 640 serialized_type); |
640 DCHECK(frame_type == HEADERS || | 641 DCHECK(frame_type == HEADERS || |
641 frame_type == SYN_STREAM) << frame_type; | 642 frame_type == SYN_STREAM) << frame_type; |
642 } | 643 } |
643 | 644 |
644 if (frame_type == SYN_STREAM) { | 645 if (frame_type == SYN_STREAM) { |
645 return StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), | 646 return StringPiece(frame->data() + framer.GetSynStreamMinimumSize(), |
646 frame->size() - framer.GetSynStreamMinimumSize()); | 647 frame->size() - framer.GetSynStreamMinimumSize()); |
(...skipping 1886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2533 0x01, 0x00, 0x00, 0x07, | 2534 0x01, 0x00, 0x00, 0x07, |
2534 0x0a, 0x0b, 0x0c, 0x0d, | 2535 0x0a, 0x0b, 0x0c, 0x0d, |
2535 }; | 2536 }; |
2536 const unsigned char kH2FrameData[] = { | 2537 const unsigned char kH2FrameData[] = { |
2537 0x00, 0x00, 0x06, 0x04, | 2538 0x00, 0x00, 0x06, 0x04, |
2538 0x00, 0x00, 0x00, 0x00, | 2539 0x00, 0x00, 0x00, 0x00, |
2539 0x00, 0x00, 0x04, 0x0a, | 2540 0x00, 0x00, 0x04, 0x0a, |
2540 0x0b, 0x0c, 0x0d, | 2541 0x0b, 0x0c, 0x0d, |
2541 }; | 2542 }; |
2542 | 2543 |
2543 uint32 kValue = 0x0a0b0c0d; | 2544 uint32_t kValue = 0x0a0b0c0d; |
2544 SpdySettingsIR settings_ir; | 2545 SpdySettingsIR settings_ir; |
2545 | 2546 |
2546 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); | 2547 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); |
2547 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; | 2548 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; |
2548 settings_ir.AddSetting(kId, | 2549 settings_ir.AddSetting(kId, |
2549 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, | 2550 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, |
2550 kFlags & SETTINGS_FLAG_PERSISTED, | 2551 kFlags & SETTINGS_FLAG_PERSISTED, |
2551 kValue); | 2552 kValue); |
2552 | 2553 |
2553 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 2554 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
(...skipping 2336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4890 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) | 4891 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) |
4891 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4892 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4892 } | 4893 } |
4893 } | 4894 } |
4894 | 4895 |
4895 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { | 4896 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) { |
4896 if (spdy_version_ > SPDY3) { | 4897 if (spdy_version_ > SPDY3) { |
4897 return; | 4898 return; |
4898 } | 4899 } |
4899 | 4900 |
4900 uint8 flags = 0; | 4901 uint8_t flags = 0; |
4901 do { | 4902 do { |
4902 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4903 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4903 | 4904 |
4904 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4905 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4905 SpdyFramer framer(spdy_version_); | 4906 SpdyFramer framer(spdy_version_); |
4906 framer.set_visitor(&visitor); | 4907 framer.set_visitor(&visitor); |
4907 | 4908 |
4908 SpdyDataIR data_ir(1, "hello"); | 4909 SpdyDataIR data_ir(1, "hello"); |
4909 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4910 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
4910 SetFrameFlags(frame.get(), flags, spdy_version_); | 4911 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 20 matching lines...) Expand all Loading... |
4931 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4932 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4932 } | 4933 } |
4933 } while (++flags != 0); | 4934 } while (++flags != 0); |
4934 } | 4935 } |
4935 | 4936 |
4936 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { | 4937 TEST_P(SpdyFramerTest, DataFrameFlagsV4) { |
4937 if (spdy_version_ <= SPDY3) { | 4938 if (spdy_version_ <= SPDY3) { |
4938 return; | 4939 return; |
4939 } | 4940 } |
4940 | 4941 |
4941 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | | 4942 uint8_t valid_data_flags = |
4942 DATA_FLAG_PADDED; | 4943 DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT | DATA_FLAG_PADDED; |
4943 | 4944 |
4944 uint8 flags = 0; | 4945 uint8_t flags = 0; |
4945 do { | 4946 do { |
4946 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4947 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4947 | 4948 |
4948 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4949 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4949 SpdyFramer framer(spdy_version_); | 4950 SpdyFramer framer(spdy_version_); |
4950 framer.set_visitor(&visitor); | 4951 framer.set_visitor(&visitor); |
4951 | 4952 |
4952 SpdyDataIR data_ir(1, "hello"); | 4953 SpdyDataIR data_ir(1, "hello"); |
4953 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 4954 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
4954 SetFrameFlags(frame.get(), flags, spdy_version_); | 4955 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 26 matching lines...) Expand all Loading... |
4981 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4982 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4982 } | 4983 } |
4983 } while (++flags != 0); | 4984 } while (++flags != 0); |
4984 } | 4985 } |
4985 | 4986 |
4986 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4987 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
4987 if (!IsSpdy2() && !IsSpdy3()) { | 4988 if (!IsSpdy2() && !IsSpdy3()) { |
4988 // SYN_STREAM not supported in SPDY>3 | 4989 // SYN_STREAM not supported in SPDY>3 |
4989 return; | 4990 return; |
4990 } | 4991 } |
4991 uint8 flags = 0; | 4992 uint8_t flags = 0; |
4992 do { | 4993 do { |
4993 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4994 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
4994 | 4995 |
4995 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4996 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
4996 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4997 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
4997 SpdyFramer framer(spdy_version_); | 4998 SpdyFramer framer(spdy_version_); |
4998 framer.set_visitor(&visitor); | 4999 framer.set_visitor(&visitor); |
4999 framer.set_debug_visitor(&debug_visitor); | 5000 framer.set_debug_visitor(&debug_visitor); |
5000 | 5001 |
5001 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); | 5002 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(8, SYN_STREAM, _, _)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5035 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5036 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5036 } | 5037 } |
5037 } while (++flags != 0); | 5038 } while (++flags != 0); |
5038 } | 5039 } |
5039 | 5040 |
5040 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { | 5041 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
5041 if (!IsSpdy2() && !IsSpdy3()) { | 5042 if (!IsSpdy2() && !IsSpdy3()) { |
5042 // SYN_REPLY not supported in SPDY>3 | 5043 // SYN_REPLY not supported in SPDY>3 |
5043 return; | 5044 return; |
5044 } | 5045 } |
5045 uint8 flags = 0; | 5046 uint8_t flags = 0; |
5046 do { | 5047 do { |
5047 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5048 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5048 | 5049 |
5049 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5050 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5050 SpdyFramer framer(spdy_version_); | 5051 SpdyFramer framer(spdy_version_); |
5051 framer.set_visitor(&visitor); | 5052 framer.set_visitor(&visitor); |
5052 | 5053 |
5053 SpdySynReplyIR syn_reply(37); | 5054 SpdySynReplyIR syn_reply(37); |
5054 syn_reply.SetHeader("foo", "bar"); | 5055 syn_reply.SetHeader("foo", "bar"); |
5055 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 5056 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
(...skipping 18 matching lines...) Expand all Loading... |
5074 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5075 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5075 } else { | 5076 } else { |
5076 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5077 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5077 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5078 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5078 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5079 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5079 } | 5080 } |
5080 } while (++flags != 0); | 5081 } while (++flags != 0); |
5081 } | 5082 } |
5082 | 5083 |
5083 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { | 5084 TEST_P(SpdyFramerTest, RstStreamFrameFlags) { |
5084 uint8 flags = 0; | 5085 uint8_t flags = 0; |
5085 do { | 5086 do { |
5086 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5087 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5087 | 5088 |
5088 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5089 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5089 SpdyFramer framer(spdy_version_); | 5090 SpdyFramer framer(spdy_version_); |
5090 framer.set_visitor(&visitor); | 5091 framer.set_visitor(&visitor); |
5091 | 5092 |
5092 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); | 5093 SpdyRstStreamIR rst_stream(13, RST_STREAM_CANCEL); |
5093 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); | 5094 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
5094 SetFrameFlags(frame.get(), flags, spdy_version_); | 5095 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 13 matching lines...) Expand all Loading... |
5108 } else { | 5109 } else { |
5109 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5110 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5110 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5111 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5111 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5112 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5112 } | 5113 } |
5113 } while (++flags != 0); | 5114 } while (++flags != 0); |
5114 } | 5115 } |
5115 | 5116 |
5116 TEST_P(SpdyFramerTest, SettingsFrameFlagsOldFormat) { | 5117 TEST_P(SpdyFramerTest, SettingsFrameFlagsOldFormat) { |
5117 if (spdy_version_ > SPDY3) { return; } | 5118 if (spdy_version_ > SPDY3) { return; } |
5118 uint8 flags = 0; | 5119 uint8_t flags = 0; |
5119 do { | 5120 do { |
5120 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5121 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5121 | 5122 |
5122 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5123 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5123 SpdyFramer framer(spdy_version_); | 5124 SpdyFramer framer(spdy_version_); |
5124 framer.set_visitor(&visitor); | 5125 framer.set_visitor(&visitor); |
5125 | 5126 |
5126 SpdySettingsIR settings_ir; | 5127 SpdySettingsIR settings_ir; |
5127 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, | 5128 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, |
5128 false, | 5129 false, |
(...skipping 21 matching lines...) Expand all Loading... |
5150 } else { | 5151 } else { |
5151 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5152 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5152 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5153 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5153 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5154 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5154 } | 5155 } |
5155 } while (++flags != 0); | 5156 } while (++flags != 0); |
5156 } | 5157 } |
5157 | 5158 |
5158 TEST_P(SpdyFramerTest, SettingsFrameFlags) { | 5159 TEST_P(SpdyFramerTest, SettingsFrameFlags) { |
5159 if (spdy_version_ <= SPDY3) { return; } | 5160 if (spdy_version_ <= SPDY3) { return; } |
5160 uint8 flags = 0; | 5161 uint8_t flags = 0; |
5161 do { | 5162 do { |
5162 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5163 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5163 | 5164 |
5164 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5165 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5165 SpdyFramer framer(spdy_version_); | 5166 SpdyFramer framer(spdy_version_); |
5166 framer.set_visitor(&visitor); | 5167 framer.set_visitor(&visitor); |
5167 | 5168 |
5168 SpdySettingsIR settings_ir; | 5169 SpdySettingsIR settings_ir; |
5169 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); | 5170 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 0, 0, 16); |
5170 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 5171 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
(...skipping 21 matching lines...) Expand all Loading... |
5192 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5193 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5193 } else { | 5194 } else { |
5194 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5195 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5195 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5196 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5196 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5197 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5197 } | 5198 } |
5198 } while (++flags != 0); | 5199 } while (++flags != 0); |
5199 } | 5200 } |
5200 | 5201 |
5201 TEST_P(SpdyFramerTest, GoawayFrameFlags) { | 5202 TEST_P(SpdyFramerTest, GoawayFrameFlags) { |
5202 uint8 flags = 0; | 5203 uint8_t flags = 0; |
5203 do { | 5204 do { |
5204 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5205 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5205 | 5206 |
5206 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5207 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5207 SpdyFramer framer(spdy_version_); | 5208 SpdyFramer framer(spdy_version_); |
5208 framer.set_visitor(&visitor); | 5209 framer.set_visitor(&visitor); |
5209 | 5210 |
5210 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); | 5211 SpdyGoAwayIR goaway_ir(97, GOAWAY_OK, "test"); |
5211 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 5212 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
5212 SetFrameFlags(frame.get(), flags, spdy_version_); | 5213 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 12 matching lines...) Expand all Loading... |
5225 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5226 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5226 } else { | 5227 } else { |
5227 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5228 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5228 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5229 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5229 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5230 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5230 } | 5231 } |
5231 } while (++flags != 0); | 5232 } while (++flags != 0); |
5232 } | 5233 } |
5233 | 5234 |
5234 TEST_P(SpdyFramerTest, HeadersFrameFlags) { | 5235 TEST_P(SpdyFramerTest, HeadersFrameFlags) { |
5235 uint8 flags = 0; | 5236 uint8_t flags = 0; |
5236 do { | 5237 do { |
5237 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5238 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5238 | 5239 |
5239 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5240 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5240 SpdyFramer framer(spdy_version_); | 5241 SpdyFramer framer(spdy_version_); |
5241 framer.set_visitor(&visitor); | 5242 framer.set_visitor(&visitor); |
5242 | 5243 |
5243 SpdyHeadersIR headers_ir(57); | 5244 SpdyHeadersIR headers_ir(57); |
5244 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { | 5245 if (IsHttp2() && (flags & HEADERS_FLAG_PRIORITY)) { |
5245 headers_ir.set_priority(3); | 5246 headers_ir.set_priority(3); |
5246 headers_ir.set_has_priority(true); | 5247 headers_ir.set_has_priority(true); |
5247 headers_ir.set_parent_stream_id(5); | 5248 headers_ir.set_parent_stream_id(5); |
5248 headers_ir.set_exclusive(true); | 5249 headers_ir.set_exclusive(true); |
5249 } | 5250 } |
5250 headers_ir.SetHeader("foo", "bar"); | 5251 headers_ir.SetHeader("foo", "bar"); |
5251 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 5252 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
5252 uint8 set_flags = flags; | 5253 uint8_t set_flags = flags; |
5253 if (IsHttp2()) { | 5254 if (IsHttp2()) { |
5254 // TODO(jgraettinger): Add padding to SpdyHeadersIR, | 5255 // TODO(jgraettinger): Add padding to SpdyHeadersIR, |
5255 // and implement framing. | 5256 // and implement framing. |
5256 set_flags &= ~HEADERS_FLAG_PADDED; | 5257 set_flags &= ~HEADERS_FLAG_PADDED; |
5257 } | 5258 } |
5258 SetFrameFlags(frame.get(), set_flags, spdy_version_); | 5259 SetFrameFlags(frame.get(), set_flags, spdy_version_); |
5259 | 5260 |
5260 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) { | 5261 if (!IsHttp2() && flags & ~CONTROL_FLAG_FIN) { |
5261 EXPECT_CALL(visitor, OnError(_)); | 5262 EXPECT_CALL(visitor, OnError(_)); |
5262 } else if (IsHttp2() && flags & ~(CONTROL_FLAG_FIN | | 5263 } else if (IsHttp2() && flags & ~(CONTROL_FLAG_FIN | |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5314 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5315 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5315 } else { | 5316 } else { |
5316 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5317 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5317 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5318 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5318 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5319 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5319 } | 5320 } |
5320 } while (++flags != 0); | 5321 } while (++flags != 0); |
5321 } | 5322 } |
5322 | 5323 |
5323 TEST_P(SpdyFramerTest, PingFrameFlags) { | 5324 TEST_P(SpdyFramerTest, PingFrameFlags) { |
5324 uint8 flags = 0; | 5325 uint8_t flags = 0; |
5325 do { | 5326 do { |
5326 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5327 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5327 | 5328 |
5328 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5329 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5329 SpdyFramer framer(spdy_version_); | 5330 SpdyFramer framer(spdy_version_); |
5330 framer.set_visitor(&visitor); | 5331 framer.set_visitor(&visitor); |
5331 | 5332 |
5332 scoped_ptr<SpdyFrame> frame(framer.SerializePing(SpdyPingIR(42))); | 5333 scoped_ptr<SpdyFrame> frame(framer.SerializePing(SpdyPingIR(42))); |
5333 SetFrameFlags(frame.get(), flags, spdy_version_); | 5334 SetFrameFlags(frame.get(), flags, spdy_version_); |
5334 | 5335 |
(...skipping 15 matching lines...) Expand all Loading... |
5350 } else { | 5351 } else { |
5351 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | 5352 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); |
5352 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, | 5353 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS, |
5353 framer.error_code()) | 5354 framer.error_code()) |
5354 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5355 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5355 } | 5356 } |
5356 } while (++flags != 0); | 5357 } while (++flags != 0); |
5357 } | 5358 } |
5358 | 5359 |
5359 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { | 5360 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) { |
5360 uint8 flags = 0; | 5361 uint8_t flags = 0; |
5361 do { | 5362 do { |
5362 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5363 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5363 | 5364 |
5364 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5365 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5365 SpdyFramer framer(spdy_version_); | 5366 SpdyFramer framer(spdy_version_); |
5366 framer.set_visitor(&visitor); | 5367 framer.set_visitor(&visitor); |
5367 | 5368 |
5368 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( | 5369 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
5369 SpdyWindowUpdateIR(4, 1024))); | 5370 SpdyWindowUpdateIR(4, 1024))); |
5370 SetFrameFlags(frame.get(), flags, spdy_version_); | 5371 SetFrameFlags(frame.get(), flags, spdy_version_); |
(...skipping 16 matching lines...) Expand all Loading... |
5387 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5388 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5388 } | 5389 } |
5389 } while (++flags != 0); | 5390 } while (++flags != 0); |
5390 } | 5391 } |
5391 | 5392 |
5392 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { | 5393 TEST_P(SpdyFramerTest, PushPromiseFrameFlags) { |
5393 if (spdy_version_ <= SPDY3) { | 5394 if (spdy_version_ <= SPDY3) { |
5394 return; | 5395 return; |
5395 } | 5396 } |
5396 | 5397 |
5397 uint8 flags = 0; | 5398 uint8_t flags = 0; |
5398 do { | 5399 do { |
5399 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5400 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5400 | 5401 |
5401 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5402 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5402 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 5403 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
5403 SpdyFramer framer(spdy_version_); | 5404 SpdyFramer framer(spdy_version_); |
5404 framer.set_visitor(&visitor); | 5405 framer.set_visitor(&visitor); |
5405 framer.set_debug_visitor(&debug_visitor); | 5406 framer.set_debug_visitor(&debug_visitor); |
5406 | 5407 |
5407 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); | 5408 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, PUSH_PROMISE, _, _)); |
(...skipping 28 matching lines...) Expand all Loading... |
5436 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5437 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5437 } | 5438 } |
5438 } while (++flags != 0); | 5439 } while (++flags != 0); |
5439 } | 5440 } |
5440 | 5441 |
5441 TEST_P(SpdyFramerTest, ContinuationFrameFlags) { | 5442 TEST_P(SpdyFramerTest, ContinuationFrameFlags) { |
5442 if (spdy_version_ <= SPDY3) { | 5443 if (spdy_version_ <= SPDY3) { |
5443 return; | 5444 return; |
5444 } | 5445 } |
5445 | 5446 |
5446 uint8 flags = 0; | 5447 uint8_t flags = 0; |
5447 do { | 5448 do { |
5448 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 5449 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
5449 | 5450 |
5450 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5451 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5451 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 5452 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
5452 SpdyFramer framer(spdy_version_); | 5453 SpdyFramer framer(spdy_version_); |
5453 framer.set_visitor(&visitor); | 5454 framer.set_visitor(&visitor); |
5454 framer.set_debug_visitor(&debug_visitor); | 5455 framer.set_debug_visitor(&debug_visitor); |
5455 | 5456 |
5456 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); | 5457 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(42, HEADERS, _, _)); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5525 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false)); | 5526 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false)); |
5526 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); | 5527 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); |
5527 | 5528 |
5528 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); | 5529 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); |
5529 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); | 5530 EXPECT_EQ(SpdyFramer::SPDY_READY_FOR_FRAME, framer.state()); |
5530 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5531 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5531 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5532 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5532 } | 5533 } |
5533 | 5534 |
5534 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { | 5535 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { |
5535 const uint32 kId = 0x020304; | 5536 const uint32_t kId = 0x020304; |
5536 const uint32 kFlags = 0x01; | 5537 const uint32_t kFlags = 0x01; |
5537 const uint32 kWireFormat = | 5538 const uint32_t kWireFormat = |
5538 base::HostToNet32(IsSpdy2() ? 0x04030201 : 0x01020304); | 5539 base::HostToNet32(IsSpdy2() ? 0x04030201 : 0x01020304); |
5539 | 5540 |
5540 SettingsFlagsAndId id_and_flags = | 5541 SettingsFlagsAndId id_and_flags = |
5541 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); | 5542 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); |
5542 EXPECT_EQ(kId, id_and_flags.id()); | 5543 EXPECT_EQ(kId, id_and_flags.id()); |
5543 EXPECT_EQ(kFlags, id_and_flags.flags()); | 5544 EXPECT_EQ(kFlags, id_and_flags.flags()); |
5544 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); | 5545 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); |
5545 } | 5546 } |
5546 | 5547 |
5547 // Test handling of a RST_STREAM with out-of-bounds status codes. | 5548 // Test handling of a RST_STREAM with out-of-bounds status codes. |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6067 | 6068 |
6068 EXPECT_EQ(1, visitor->data_frame_count_); | 6069 EXPECT_EQ(1, visitor->data_frame_count_); |
6069 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); | 6070 EXPECT_EQ(strlen(four_score), static_cast<unsigned>(visitor->data_bytes_)); |
6070 EXPECT_EQ(0, visitor->headers_frame_count_); | 6071 EXPECT_EQ(0, visitor->headers_frame_count_); |
6071 } | 6072 } |
6072 } | 6073 } |
6073 | 6074 |
6074 } // namespace test | 6075 } // namespace test |
6075 | 6076 |
6076 } // namespace net | 6077 } // namespace net |
OLD | NEW |