| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_flags.h" | 7 #include "net/quic/quic_flags.h" |
| 8 #include "net/quic/quic_utils.h" | 8 #include "net/quic/quic_utils.h" |
| 9 #include "net/quic/spdy_utils.h" | 9 #include "net/quic/spdy_utils.h" |
| 10 #include "net/quic/test_tools/quic_connection_peer.h" | 10 #include "net/quic/test_tools/quic_connection_peer.h" |
| 11 #include "net/quic/test_tools/quic_session_peer.h" | 11 #include "net/quic/test_tools/quic_session_peer.h" |
| 12 #include "net/quic/test_tools/quic_test_utils.h" | 12 #include "net/quic/test_tools/quic_test_utils.h" |
| 13 #include "net/spdy/spdy_protocol.h" | 13 #include "net/spdy/spdy_protocol.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 using base::StringPiece; | 16 using base::StringPiece; |
| 17 using std::string; | 17 using std::string; |
| 18 using testing::Invoke; | 18 using testing::Invoke; |
| 19 using testing::StrictMock; | 19 using testing::StrictMock; |
| 20 using testing::WithArgs; | 20 using testing::WithArgs; |
| 21 using testing::_; | 21 using testing::_; |
| 22 | 22 |
| 23 namespace net { | 23 namespace net { |
| 24 namespace test { | 24 namespace test { |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 class MockVisitor : public SpdyFramerVisitorInterface { | 27 class MockVisitor : public SpdyFramerVisitorInterface { |
| 28 public: | 28 public: |
| 29 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); | 29 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); |
| 30 MOCK_METHOD3(OnDataFrameHeader, void(SpdyStreamId stream_id, | 30 MOCK_METHOD3(OnDataFrameHeader, |
| 31 size_t length, | 31 void(SpdyStreamId stream_id, size_t length, bool fin)); |
| 32 bool fin)); | 32 MOCK_METHOD4( |
| 33 MOCK_METHOD4(OnStreamFrameData, void(SpdyStreamId stream_id, | 33 OnStreamFrameData, |
| 34 const char* data, | 34 void(SpdyStreamId stream_id, const char* data, size_t len, bool fin)); |
| 35 size_t len, | 35 MOCK_METHOD3(OnControlFrameHeaderData, |
| 36 bool fin)); | 36 bool(SpdyStreamId stream_id, |
| 37 MOCK_METHOD3(OnControlFrameHeaderData, bool(SpdyStreamId stream_id, | 37 const char* header_data, |
| 38 const char* header_data, | 38 size_t len)); |
| 39 size_t len)); | 39 MOCK_METHOD5(OnSynStream, |
| 40 MOCK_METHOD5(OnSynStream, void(SpdyStreamId stream_id, | 40 void(SpdyStreamId stream_id, |
| 41 SpdyStreamId associated_stream_id, | 41 SpdyStreamId associated_stream_id, |
| 42 SpdyPriority priority, | 42 SpdyPriority priority, |
| 43 bool fin, | 43 bool fin, |
| 44 bool unidirectional)); | 44 bool unidirectional)); |
| 45 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin)); | 45 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin)); |
| 46 MOCK_METHOD2(OnRstStream, void(SpdyStreamId stream_id, | 46 MOCK_METHOD2(OnRstStream, |
| 47 SpdyRstStreamStatus status)); | 47 void(SpdyStreamId stream_id, SpdyRstStreamStatus status)); |
| 48 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); | 48 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); |
| 49 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); | 49 MOCK_METHOD3(OnSetting, void(SpdySettingsIds id, uint8 flags, uint32 value)); |
| 50 MOCK_METHOD0(OnSettingsAck, void()); | 50 MOCK_METHOD0(OnSettingsAck, void()); |
| 51 MOCK_METHOD0(OnSettingsEnd, void()); | 51 MOCK_METHOD0(OnSettingsEnd, void()); |
| 52 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); | 52 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); |
| 53 MOCK_METHOD2(OnGoAway, void(SpdyStreamId last_accepted_stream_id, | 53 MOCK_METHOD2(OnGoAway, |
| 54 SpdyGoAwayStatus status)); | 54 void(SpdyStreamId last_accepted_stream_id, |
| 55 SpdyGoAwayStatus status)); |
| 55 MOCK_METHOD3(OnHeaders, void(SpdyStreamId stream_id, bool fin, bool end)); | 56 MOCK_METHOD3(OnHeaders, void(SpdyStreamId stream_id, bool fin, bool end)); |
| 56 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId stream_id, | 57 MOCK_METHOD2(OnWindowUpdate, |
| 57 uint32 delta_window_size)); | 58 void(SpdyStreamId stream_id, uint32 delta_window_size)); |
| 58 MOCK_METHOD2(OnCredentialFrameData, bool(const char* credential_data, | 59 MOCK_METHOD2(OnCredentialFrameData, |
| 59 size_t len)); | 60 bool(const char* credential_data, size_t len)); |
| 60 MOCK_METHOD1(OnBlocked, void(SpdyStreamId stream_id)); | 61 MOCK_METHOD1(OnBlocked, void(SpdyStreamId stream_id)); |
| 61 MOCK_METHOD3(OnPushPromise, void(SpdyStreamId stream_id, | 62 MOCK_METHOD3(OnPushPromise, |
| 62 SpdyStreamId promised_stream_id, | 63 void(SpdyStreamId stream_id, |
| 63 bool end)); | 64 SpdyStreamId promised_stream_id, |
| 65 bool end)); |
| 64 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); | 66 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); |
| 65 }; | 67 }; |
| 66 | 68 |
| 67 class QuicHeadersStreamTest : public ::testing::TestWithParam<bool> { | 69 class QuicHeadersStreamTest : public ::testing::TestWithParam<bool> { |
| 68 public: | 70 public: |
| 69 static QuicVersionVector GetVersions() { | 71 static QuicVersionVector GetVersions() { |
| 70 QuicVersionVector versions; | 72 QuicVersionVector versions; |
| 71 versions.push_back(QuicVersionMax()); | 73 versions.push_back(QuicVersionMax()); |
| 72 return versions; | 74 return versions; |
| 73 } | 75 } |
| 74 | 76 |
| 75 QuicHeadersStreamTest() | 77 QuicHeadersStreamTest() |
| 76 : connection_(new StrictMock<MockConnection>(is_server(), GetVersions())), | 78 : connection_(new StrictMock<MockConnection>(is_server(), GetVersions())), |
| 77 session_(connection_), | 79 session_(connection_), |
| 78 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), | 80 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), |
| 79 body_("hello world"), | 81 body_("hello world"), |
| 80 framer_(SPDY3) { | 82 framer_(SPDY3) { |
| 81 headers_[":version"] = "HTTP/1.1"; | 83 headers_[":version"] = "HTTP/1.1"; |
| 82 headers_[":status"] = "200 Ok"; | 84 headers_[":status"] = "200 Ok"; |
| 83 headers_["content-length"] = "11"; | 85 headers_["content-length"] = "11"; |
| 84 framer_.set_visitor(&visitor_); | 86 framer_.set_visitor(&visitor_); |
| 85 EXPECT_EQ(QuicVersionMax(), session_.connection()->version()); | 87 EXPECT_EQ(QuicVersionMax(), session_.connection()->version()); |
| 86 EXPECT_TRUE(headers_stream_ != NULL); | 88 EXPECT_TRUE(headers_stream_ != NULL); |
| 87 } | 89 } |
| 88 | 90 |
| 89 QuicConsumedData SaveIov(const IOVector& data) { | 91 QuicConsumedData SaveIov(const IOVector& data) { |
| 90 const iovec* iov = data.iovec(); | 92 const iovec* iov = data.iovec(); |
| 91 int count = data.Capacity(); | 93 int count = data.Capacity(); |
| 92 for (int i = 0 ; i < count; ++i) { | 94 for (int i = 0; i < count; ++i) { |
| 93 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); | 95 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); |
| 94 } | 96 } |
| 95 return QuicConsumedData(saved_data_.length(), false); | 97 return QuicConsumedData(saved_data_.length(), false); |
| 96 } | 98 } |
| 97 | 99 |
| 98 bool SaveHeaderData(const char* data, int len) { | 100 bool SaveHeaderData(const char* data, int len) { |
| 99 saved_header_data_.append(data, len); | 101 saved_header_data_.append(data, len); |
| 100 return true; | 102 return true; |
| 101 } | 103 } |
| 102 | 104 |
| 103 void SaveHeaderDataStringPiece(StringPiece data) { | 105 void SaveHeaderDataStringPiece(StringPiece data) { |
| 104 saved_header_data_.append(data.data(), data.length()); | 106 saved_header_data_.append(data.data(), data.length()); |
| 105 } | 107 } |
| 106 | 108 |
| 107 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 109 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
| 108 bool fin, | 110 bool fin, |
| 109 QuicPriority priority) { | 111 QuicPriority priority) { |
| 110 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 112 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
| 111 } | 113 } |
| 112 | 114 |
| 113 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, | 115 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
| 114 bool fin) { | |
| 115 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 116 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
| 116 } | 117 } |
| 117 | 118 |
| 118 void WriteHeadersAndCheckData(QuicStreamId stream_id, | 119 void WriteHeadersAndCheckData(QuicStreamId stream_id, |
| 119 bool fin, | 120 bool fin, |
| 120 QuicPriority priority, | 121 QuicPriority priority, |
| 121 SpdyFrameType type) { | 122 SpdyFrameType type) { |
| 122 // Write the headers and capture the outgoing data | 123 // Write the headers and capture the outgoing data |
| 123 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, NULL)) | 124 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, NULL)) |
| 124 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 125 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
| 125 headers_stream_->WriteHeaders(stream_id, headers_, fin, NULL); | 126 headers_stream_->WriteHeaders(stream_id, headers_, fin, NULL); |
| 126 | 127 |
| 127 // Parse the outgoing data and check that it matches was was written. | 128 // Parse the outgoing data and check that it matches was was written. |
| 128 if (type == SYN_STREAM) { | 129 if (type == SYN_STREAM) { |
| 129 EXPECT_CALL(visitor_, OnSynStream(stream_id, kNoAssociatedStream, 0, | 130 EXPECT_CALL(visitor_, |
| 130 // priority, | 131 OnSynStream(stream_id, |
| 131 fin, kNotUnidirectional)); | 132 kNoAssociatedStream, |
| 133 0, |
| 134 // priority, |
| 135 fin, |
| 136 kNotUnidirectional)); |
| 132 } else { | 137 } else { |
| 133 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin)); | 138 EXPECT_CALL(visitor_, OnSynReply(stream_id, fin)); |
| 134 } | 139 } |
| 135 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 140 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
| 136 .WillRepeatedly(WithArgs<1, 2>( | 141 .WillRepeatedly(WithArgs<1, 2>( |
| 137 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 142 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
| 138 if (fin) { | 143 if (fin) { |
| 139 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, NULL, 0, true)); | 144 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, NULL, 0, true)); |
| 140 } | 145 } |
| 141 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); | 146 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); |
| 142 EXPECT_FALSE(framer_.HasError()) << framer_.error_code(); | 147 EXPECT_FALSE(framer_.HasError()) << framer_.error_code(); |
| 143 | 148 |
| 144 CheckHeaders(); | 149 CheckHeaders(); |
| 145 saved_data_.clear(); | 150 saved_data_.clear(); |
| 146 } | 151 } |
| 147 | 152 |
| 148 void CheckHeaders() { | 153 void CheckHeaders() { |
| 149 SpdyHeaderBlock headers; | 154 SpdyHeaderBlock headers; |
| 150 EXPECT_EQ(saved_header_data_.length(), | 155 EXPECT_EQ( |
| 151 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(), | 156 saved_header_data_.length(), |
| 152 saved_header_data_.length(), | 157 framer_.ParseHeaderBlockInBuffer( |
| 153 &headers)); | 158 saved_header_data_.data(), saved_header_data_.length(), &headers)); |
| 154 EXPECT_EQ(headers_, headers); | 159 EXPECT_EQ(headers_, headers); |
| 155 saved_header_data_.clear(); | 160 saved_header_data_.clear(); |
| 156 } | 161 } |
| 157 | 162 |
| 158 bool is_server() { | 163 bool is_server() { return GetParam(); } |
| 159 return GetParam(); | |
| 160 } | |
| 161 | 164 |
| 162 void CloseConnection() { | 165 void CloseConnection() { QuicConnectionPeer::CloseConnection(connection_); } |
| 163 QuicConnectionPeer::CloseConnection(connection_); | |
| 164 } | |
| 165 | 166 |
| 166 static const bool kNotUnidirectional = false; | 167 static const bool kNotUnidirectional = false; |
| 167 static const bool kNoAssociatedStream = false; | 168 static const bool kNoAssociatedStream = false; |
| 168 | 169 |
| 169 StrictMock<MockConnection>* connection_; | 170 StrictMock<MockConnection>* connection_; |
| 170 StrictMock<MockSession> session_; | 171 StrictMock<MockSession> session_; |
| 171 QuicHeadersStream* headers_stream_; | 172 QuicHeadersStream* headers_stream_; |
| 172 SpdyHeaderBlock headers_; | 173 SpdyHeaderBlock headers_; |
| 173 string body_; | 174 string body_; |
| 174 string saved_data_; | 175 string saved_data_; |
| 175 string saved_header_data_; | 176 string saved_header_data_; |
| 176 SpdyFramer framer_; | 177 SpdyFramer framer_; |
| 177 StrictMock<MockVisitor> visitor_; | 178 StrictMock<MockVisitor> visitor_; |
| 178 }; | 179 }; |
| 179 | 180 |
| 180 INSTANTIATE_TEST_CASE_P(Tests, QuicHeadersStreamTest, testing::Bool()); | 181 INSTANTIATE_TEST_CASE_P(Tests, QuicHeadersStreamTest, testing::Bool()); |
| 181 | 182 |
| 182 TEST_P(QuicHeadersStreamTest, StreamId) { | 183 TEST_P(QuicHeadersStreamTest, StreamId) { |
| 183 EXPECT_EQ(3u, headers_stream_->id()); | 184 EXPECT_EQ(3u, headers_stream_->id()); |
| 184 } | 185 } |
| 185 | 186 |
| 186 TEST_P(QuicHeadersStreamTest, EffectivePriority) { | 187 TEST_P(QuicHeadersStreamTest, EffectivePriority) { |
| 187 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); | 188 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); |
| 188 } | 189 } |
| 189 | 190 |
| 190 TEST_P(QuicHeadersStreamTest, WriteHeaders) { | 191 TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
| 191 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id +=2) { | 192 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id += 2) { |
| 192 for (int count = 0; count < 2; ++count) { | 193 for (int count = 0; count < 2; ++count) { |
| 193 bool fin = (count == 0); | 194 bool fin = (count == 0); |
| 194 if (is_server()) { | 195 if (is_server()) { |
| 195 WriteHeadersAndExpectSynReply(stream_id, fin); | 196 WriteHeadersAndExpectSynReply(stream_id, fin); |
| 196 } else { | 197 } else { |
| 197 for (QuicPriority priority = 0; priority < 7; ++priority) { | 198 for (QuicPriority priority = 0; priority < 7; ++priority) { |
| 198 WriteHeadersAndExpectSynStream(stream_id, fin, priority); | 199 WriteHeadersAndExpectSynStream(stream_id, fin, priority); |
| 199 } | 200 } |
| 200 } | 201 } |
| 201 } | 202 } |
| 202 } | 203 } |
| 203 } | 204 } |
| 204 | 205 |
| 205 TEST_P(QuicHeadersStreamTest, ProcessRawData) { | 206 TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
| 206 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id +=2) { | 207 for (QuicStreamId stream_id = 5; stream_id < 9; stream_id += 2) { |
| 207 for (int count = 0; count < 2; ++count) { | 208 for (int count = 0; count < 2; ++count) { |
| 208 bool fin = (count == 0); | 209 bool fin = (count == 0); |
| 209 for (QuicPriority priority = 0; priority < 7; ++priority) { | 210 for (QuicPriority priority = 0; priority < 7; ++priority) { |
| 210 // Replace with "WriteHeadersAndSaveData" | 211 // Replace with "WriteHeadersAndSaveData" |
| 211 scoped_ptr<SpdySerializedFrame> frame; | 212 scoped_ptr<SpdySerializedFrame> frame; |
| 212 if (is_server()) { | 213 if (is_server()) { |
| 213 SpdySynStreamIR syn_stream(stream_id); | 214 SpdySynStreamIR syn_stream(stream_id); |
| 214 syn_stream.set_name_value_block(headers_); | 215 syn_stream.set_name_value_block(headers_); |
| 215 syn_stream.set_fin(fin); | 216 syn_stream.set_fin(fin); |
| 216 frame.reset(framer_.SerializeSynStream(syn_stream)); | 217 frame.reset(framer_.SerializeSynStream(syn_stream)); |
| 217 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 218 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 218 } else { | 219 } else { |
| 219 SpdySynReplyIR syn_reply(stream_id); | 220 SpdySynReplyIR syn_reply(stream_id); |
| 220 syn_reply.set_name_value_block(headers_); | 221 syn_reply.set_name_value_block(headers_); |
| 221 syn_reply.set_fin(fin); | 222 syn_reply.set_fin(fin); |
| 222 frame.reset(framer_.SerializeSynReply(syn_reply)); | 223 frame.reset(framer_.SerializeSynReply(syn_reply)); |
| 223 } | 224 } |
| 224 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | 225 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
| 225 .WillRepeatedly(WithArgs<1>( | 226 .WillRepeatedly(WithArgs<1>(Invoke( |
| 226 Invoke(this, | 227 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
| 227 &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 228 EXPECT_CALL(session_, | 228 EXPECT_CALL(session_, |
| 229 OnStreamHeadersComplete(stream_id, fin, frame->size())); | 229 OnStreamHeadersComplete(stream_id, fin, frame->size())); |
| 230 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 230 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 231 | 231 |
| 232 CheckHeaders(); | 232 CheckHeaders(); |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 | 237 |
| 238 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { | 238 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { |
| 239 SpdyDataIR data(2, ""); | 239 SpdyDataIR data(2, ""); |
| 240 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 240 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 241 EXPECT_CALL(*connection_, | 241 EXPECT_CALL(*connection_, |
| 242 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 242 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 243 "SPDY DATA frame received.")) | 243 "SPDY DATA frame received.")) |
| 244 .WillOnce(InvokeWithoutArgs(this, | 244 .WillOnce( |
| 245 &QuicHeadersStreamTest::CloseConnection)); | 245 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 246 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 246 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 247 } | 247 } |
| 248 | 248 |
| 249 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { | 249 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { |
| 250 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, ""); | 250 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR, ""); |
| 251 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 251 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 252 EXPECT_CALL(*connection_, | 252 EXPECT_CALL(*connection_, |
| 253 SendConnectionCloseWithDetails( | 253 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 254 QUIC_INVALID_HEADERS_STREAM_DATA, | 254 "SPDY RST_STREAM frame received.")) |
| 255 "SPDY RST_STREAM frame received.")) | 255 .WillOnce( |
| 256 .WillOnce(InvokeWithoutArgs(this, | 256 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 257 &QuicHeadersStreamTest::CloseConnection)); | |
| 258 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 257 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 259 } | 258 } |
| 260 | 259 |
| 261 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { | 260 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { |
| 262 SpdySettingsIR data; | 261 SpdySettingsIR data; |
| 263 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0); | 262 data.AddSetting(SETTINGS_UPLOAD_BANDWIDTH, true, true, 0); |
| 264 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 263 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 265 EXPECT_CALL(*connection_, | 264 EXPECT_CALL(*connection_, |
| 266 SendConnectionCloseWithDetails( | 265 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 267 QUIC_INVALID_HEADERS_STREAM_DATA, | 266 "SPDY SETTINGS frame received.")) |
| 268 "SPDY SETTINGS frame received.")) | 267 .WillOnce( |
| 269 .WillOnce(InvokeWithoutArgs(this, | 268 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 270 &QuicHeadersStreamTest::CloseConnection)); | |
| 271 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 269 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 272 } | 270 } |
| 273 | 271 |
| 274 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { | 272 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { |
| 275 SpdyPingIR data(1); | 273 SpdyPingIR data(1); |
| 276 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 274 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 277 EXPECT_CALL(*connection_, | 275 EXPECT_CALL(*connection_, |
| 278 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 276 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 279 "SPDY PING frame received.")) | 277 "SPDY PING frame received.")) |
| 280 .WillOnce(InvokeWithoutArgs(this, | 278 .WillOnce( |
| 281 &QuicHeadersStreamTest::CloseConnection)); | 279 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 282 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 280 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 283 } | 281 } |
| 284 | 282 |
| 285 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { | 283 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { |
| 286 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); | 284 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); |
| 287 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 285 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 288 EXPECT_CALL(*connection_, | 286 EXPECT_CALL(*connection_, |
| 289 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 287 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 290 "SPDY GOAWAY frame received.")) | 288 "SPDY GOAWAY frame received.")) |
| 291 .WillOnce(InvokeWithoutArgs(this, | 289 .WillOnce( |
| 292 &QuicHeadersStreamTest::CloseConnection)); | 290 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 293 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 291 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 294 } | 292 } |
| 295 | 293 |
| 296 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) { | 294 TEST_P(QuicHeadersStreamTest, ProcessSpdyHeadersFrame) { |
| 297 SpdyHeadersIR data(1); | 295 SpdyHeadersIR data(1); |
| 298 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 296 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 299 EXPECT_CALL(*connection_, | 297 EXPECT_CALL(*connection_, |
| 300 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 298 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 301 "SPDY HEADERS frame received.")) | 299 "SPDY HEADERS frame received.")) |
| 302 .WillOnce(InvokeWithoutArgs(this, | 300 .WillOnce( |
| 303 &QuicHeadersStreamTest::CloseConnection)); | 301 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 304 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 302 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 305 } | 303 } |
| 306 | 304 |
| 307 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { | 305 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { |
| 308 SpdyWindowUpdateIR data(1, 1); | 306 SpdyWindowUpdateIR data(1, 1); |
| 309 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 307 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); |
| 310 EXPECT_CALL(*connection_, | 308 EXPECT_CALL( |
| 311 SendConnectionCloseWithDetails( | 309 *connection_, |
| 312 QUIC_INVALID_HEADERS_STREAM_DATA, | 310 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 313 "SPDY WINDOW_UPDATE frame received.")) | 311 "SPDY WINDOW_UPDATE frame received.")) |
| 314 .WillOnce(InvokeWithoutArgs(this, | 312 .WillOnce( |
| 315 &QuicHeadersStreamTest::CloseConnection)); | 313 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 316 headers_stream_->ProcessRawData(frame->data(), frame->size()); | 314 headers_stream_->ProcessRawData(frame->data(), frame->size()); |
| 317 } | 315 } |
| 318 | 316 |
| 319 TEST_P(QuicHeadersStreamTest, NoFlowControl) { | 317 TEST_P(QuicHeadersStreamTest, NoFlowControl) { |
| 320 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control_2, true); | 318 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control_2, true); |
| 321 EXPECT_FALSE(headers_stream_->flow_controller()->IsEnabled()); | 319 EXPECT_FALSE(headers_stream_->flow_controller()->IsEnabled()); |
| 322 } | 320 } |
| 323 | 321 |
| 324 } // namespace | 322 } // namespace |
| 325 } // namespace test | 323 } // namespace test |
| 326 } // namespace net | 324 } // namespace net |
| OLD | NEW |