| 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/quic/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_ack_notifier.h" | 7 #include "net/quic/quic_ack_notifier.h" |
| 8 #include "net/quic/quic_connection.h" | 8 #include "net/quic/quic_connection.h" |
| 9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
| 10 #include "net/quic/quic_write_blocked_list.h" | 10 #include "net/quic/quic_write_blocked_list.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 Initialize(kShouldProcessData); | 153 Initialize(kShouldProcessData); |
| 154 | 154 |
| 155 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( | 155 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( |
| 156 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 156 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 157 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); | 157 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); |
| 158 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( | 158 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( |
| 159 length); | 159 length); |
| 160 | 160 |
| 161 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( | 161 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( |
| 162 Return(QuicConsumedData(kDataLen, true))); | 162 Return(QuicConsumedData(kDataLen, true))); |
| 163 stream_->WriteOrBufferData(kData1, false, NULL); | 163 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 164 EXPECT_FALSE(HasWriteBlockedStreams()); | 164 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 165 } | 165 } |
| 166 | 166 |
| 167 TEST_F(ReliableQuicStreamTest, NoBlockingIfNoDataOrFin) { | 167 TEST_F(ReliableQuicStreamTest, NoBlockingIfNoDataOrFin) { |
| 168 Initialize(kShouldProcessData); | 168 Initialize(kShouldProcessData); |
| 169 | 169 |
| 170 // Write no data and no fin. If we consume nothing we should not be write | 170 // Write no data and no fin. If we consume nothing we should not be write |
| 171 // blocked. | 171 // blocked. |
| 172 EXPECT_DFATAL(stream_->WriteOrBufferData(StringPiece(), false, NULL), ""); | 172 EXPECT_DFATAL(stream_->WriteOrBufferData(StringPiece(), false, nullptr), ""); |
| 173 EXPECT_FALSE(HasWriteBlockedStreams()); | 173 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 174 } | 174 } |
| 175 | 175 |
| 176 TEST_F(ReliableQuicStreamTest, BlockIfOnlySomeDataConsumed) { | 176 TEST_F(ReliableQuicStreamTest, BlockIfOnlySomeDataConsumed) { |
| 177 Initialize(kShouldProcessData); | 177 Initialize(kShouldProcessData); |
| 178 | 178 |
| 179 // Write some data and no fin. If we consume some but not all of the data, | 179 // Write some data and no fin. If we consume some but not all of the data, |
| 180 // we should be write blocked a not all the data was consumed. | 180 // we should be write blocked a not all the data was consumed. |
| 181 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 181 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 182 .WillOnce(Return(QuicConsumedData(1, false))); | 182 .WillOnce(Return(QuicConsumedData(1, false))); |
| 183 stream_->WriteOrBufferData(StringPiece(kData1, 2), false, NULL); | 183 stream_->WriteOrBufferData(StringPiece(kData1, 2), false, nullptr); |
| 184 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 184 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 185 } | 185 } |
| 186 | 186 |
| 187 TEST_F(ReliableQuicStreamTest, BlockIfFinNotConsumedWithData) { | 187 TEST_F(ReliableQuicStreamTest, BlockIfFinNotConsumedWithData) { |
| 188 Initialize(kShouldProcessData); | 188 Initialize(kShouldProcessData); |
| 189 | 189 |
| 190 // Write some data and no fin. If we consume all the data but not the fin, | 190 // Write some data and no fin. If we consume all the data but not the fin, |
| 191 // we should be write blocked because the fin was not consumed. | 191 // we should be write blocked because the fin was not consumed. |
| 192 // (This should never actually happen as the fin should be sent out with the | 192 // (This should never actually happen as the fin should be sent out with the |
| 193 // last data) | 193 // last data) |
| 194 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 194 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 195 .WillOnce(Return(QuicConsumedData(2, false))); | 195 .WillOnce(Return(QuicConsumedData(2, false))); |
| 196 stream_->WriteOrBufferData(StringPiece(kData1, 2), true, NULL); | 196 stream_->WriteOrBufferData(StringPiece(kData1, 2), true, nullptr); |
| 197 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 197 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 198 } | 198 } |
| 199 | 199 |
| 200 TEST_F(ReliableQuicStreamTest, BlockIfSoloFinNotConsumed) { | 200 TEST_F(ReliableQuicStreamTest, BlockIfSoloFinNotConsumed) { |
| 201 Initialize(kShouldProcessData); | 201 Initialize(kShouldProcessData); |
| 202 | 202 |
| 203 // Write no data and a fin. If we consume nothing we should be write blocked, | 203 // Write no data and a fin. If we consume nothing we should be write blocked, |
| 204 // as the fin was not consumed. | 204 // as the fin was not consumed. |
| 205 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 205 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 206 .WillOnce(Return(QuicConsumedData(0, false))); | 206 .WillOnce(Return(QuicConsumedData(0, false))); |
| 207 stream_->WriteOrBufferData(StringPiece(), true, NULL); | 207 stream_->WriteOrBufferData(StringPiece(), true, nullptr); |
| 208 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); | 208 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams()); |
| 209 } | 209 } |
| 210 | 210 |
| 211 TEST_F(ReliableQuicStreamTest, WriteOrBufferData) { | 211 TEST_F(ReliableQuicStreamTest, WriteOrBufferData) { |
| 212 Initialize(kShouldProcessData); | 212 Initialize(kShouldProcessData); |
| 213 | 213 |
| 214 EXPECT_FALSE(HasWriteBlockedStreams()); | 214 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 215 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( | 215 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( |
| 216 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 216 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 217 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); | 217 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); |
| 218 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( | 218 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( |
| 219 length); | 219 length); |
| 220 | 220 |
| 221 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).WillOnce( | 221 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).WillOnce( |
| 222 Return(QuicConsumedData(kDataLen - 1, false))); | 222 Return(QuicConsumedData(kDataLen - 1, false))); |
| 223 stream_->WriteOrBufferData(kData1, false, NULL); | 223 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 224 EXPECT_TRUE(HasWriteBlockedStreams()); | 224 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 225 | 225 |
| 226 // Queue a bytes_consumed write. | 226 // Queue a bytes_consumed write. |
| 227 stream_->WriteOrBufferData(kData2, false, NULL); | 227 stream_->WriteOrBufferData(kData2, false, nullptr); |
| 228 | 228 |
| 229 // Make sure we get the tail of the first write followed by the bytes_consumed | 229 // Make sure we get the tail of the first write followed by the bytes_consumed |
| 230 InSequence s; | 230 InSequence s; |
| 231 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)). | 231 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)). |
| 232 WillOnce(Return(QuicConsumedData(1, false))); | 232 WillOnce(Return(QuicConsumedData(1, false))); |
| 233 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)). | 233 EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)). |
| 234 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); | 234 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); |
| 235 stream_->OnCanWrite(); | 235 stream_->OnCanWrite(); |
| 236 | 236 |
| 237 // And finally the end of the bytes_consumed. | 237 // And finally the end of the bytes_consumed. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 249 EXPECT_FALSE(HasWriteBlockedStreams()); | 249 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 250 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( | 250 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( |
| 251 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 251 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 252 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, IN_FEC_GROUP); | 252 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, IN_FEC_GROUP); |
| 253 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( | 253 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( |
| 254 length); | 254 length); |
| 255 | 255 |
| 256 // Write first data onto stream, which will cause one session write. | 256 // Write first data onto stream, which will cause one session write. |
| 257 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)).WillOnce( | 257 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)).WillOnce( |
| 258 Return(QuicConsumedData(kDataLen - 1, false))); | 258 Return(QuicConsumedData(kDataLen - 1, false))); |
| 259 stream_->WriteOrBufferData(kData1, false, NULL); | 259 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 260 EXPECT_TRUE(HasWriteBlockedStreams()); | 260 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 261 | 261 |
| 262 // Queue a bytes_consumed write. | 262 // Queue a bytes_consumed write. |
| 263 stream_->WriteOrBufferData(kData2, false, NULL); | 263 stream_->WriteOrBufferData(kData2, false, nullptr); |
| 264 | 264 |
| 265 // Make sure we get the tail of the first write followed by the bytes_consumed | 265 // Make sure we get the tail of the first write followed by the bytes_consumed |
| 266 InSequence s; | 266 InSequence s; |
| 267 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)). | 267 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)). |
| 268 WillOnce(Return(QuicConsumedData(1, false))); | 268 WillOnce(Return(QuicConsumedData(1, false))); |
| 269 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)). | 269 EXPECT_CALL(*session_, WritevData(_, _, _, _, MUST_FEC_PROTECT, _)). |
| 270 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); | 270 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); |
| 271 stream_->OnCanWrite(); | 271 stream_->OnCanWrite(); |
| 272 | 272 |
| 273 // And finally the end of the bytes_consumed. | 273 // And finally the end of the bytes_consumed. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 285 EXPECT_FALSE(HasWriteBlockedStreams()); | 285 EXPECT_FALSE(HasWriteBlockedStreams()); |
| 286 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( | 286 size_t length = 1 + QuicPacketCreator::StreamFramePacketOverhead( |
| 287 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 287 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 288 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); | 288 PACKET_6BYTE_SEQUENCE_NUMBER, 0u, NOT_IN_FEC_GROUP); |
| 289 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( | 289 QuicConnectionPeer::GetPacketCreator(connection_)->set_max_packet_length( |
| 290 length); | 290 length); |
| 291 | 291 |
| 292 // Write first data onto stream, which will cause one session write. | 292 // Write first data onto stream, which will cause one session write. |
| 293 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)).WillOnce( | 293 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)).WillOnce( |
| 294 Return(QuicConsumedData(kDataLen - 1, false))); | 294 Return(QuicConsumedData(kDataLen - 1, false))); |
| 295 stream_->WriteOrBufferData(kData1, false, NULL); | 295 stream_->WriteOrBufferData(kData1, false, nullptr); |
| 296 EXPECT_TRUE(HasWriteBlockedStreams()); | 296 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 297 | 297 |
| 298 // Queue a bytes_consumed write. | 298 // Queue a bytes_consumed write. |
| 299 stream_->WriteOrBufferData(kData2, false, NULL); | 299 stream_->WriteOrBufferData(kData2, false, nullptr); |
| 300 | 300 |
| 301 // Make sure we get the tail of the first write followed by the bytes_consumed | 301 // Make sure we get the tail of the first write followed by the bytes_consumed |
| 302 InSequence s; | 302 InSequence s; |
| 303 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)). | 303 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)). |
| 304 WillOnce(Return(QuicConsumedData(1, false))); | 304 WillOnce(Return(QuicConsumedData(1, false))); |
| 305 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)). | 305 EXPECT_CALL(*session_, WritevData(_, _, _, _, MAY_FEC_PROTECT, _)). |
| 306 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); | 306 WillOnce(Return(QuicConsumedData(kDataLen - 2, false))); |
| 307 stream_->OnCanWrite(); | 307 stream_->OnCanWrite(); |
| 308 | 308 |
| 309 // And finally the end of the bytes_consumed. | 309 // And finally the end of the bytes_consumed. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 329 // before termination. | 329 // before termination. |
| 330 // Test that if no FIN has been sent, we send a RST. | 330 // Test that if no FIN has been sent, we send a RST. |
| 331 | 331 |
| 332 Initialize(kShouldProcessData); | 332 Initialize(kShouldProcessData); |
| 333 EXPECT_FALSE(fin_sent()); | 333 EXPECT_FALSE(fin_sent()); |
| 334 EXPECT_FALSE(rst_sent()); | 334 EXPECT_FALSE(rst_sent()); |
| 335 | 335 |
| 336 // Write some data, with no FIN. | 336 // Write some data, with no FIN. |
| 337 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 337 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 338 .WillOnce(Return(QuicConsumedData(1, false))); | 338 .WillOnce(Return(QuicConsumedData(1, false))); |
| 339 stream_->WriteOrBufferData(StringPiece(kData1, 1), false, NULL); | 339 stream_->WriteOrBufferData(StringPiece(kData1, 1), false, nullptr); |
| 340 EXPECT_FALSE(fin_sent()); | 340 EXPECT_FALSE(fin_sent()); |
| 341 EXPECT_FALSE(rst_sent()); | 341 EXPECT_FALSE(rst_sent()); |
| 342 | 342 |
| 343 // Now close the stream, and expect that we send a RST. | 343 // Now close the stream, and expect that we send a RST. |
| 344 EXPECT_CALL(*session_, SendRstStream(_, _, _)); | 344 EXPECT_CALL(*session_, SendRstStream(_, _, _)); |
| 345 stream_->OnClose(); | 345 stream_->OnClose(); |
| 346 EXPECT_FALSE(fin_sent()); | 346 EXPECT_FALSE(fin_sent()); |
| 347 EXPECT_TRUE(rst_sent()); | 347 EXPECT_TRUE(rst_sent()); |
| 348 } | 348 } |
| 349 | 349 |
| 350 TEST_F(ReliableQuicStreamTest, RstNotSentIfFinSent) { | 350 TEST_F(ReliableQuicStreamTest, RstNotSentIfFinSent) { |
| 351 // For flow control accounting, a stream must send either a FIN or a RST frame | 351 // For flow control accounting, a stream must send either a FIN or a RST frame |
| 352 // before termination. | 352 // before termination. |
| 353 // Test that if a FIN has been sent, we don't also send a RST. | 353 // Test that if a FIN has been sent, we don't also send a RST. |
| 354 | 354 |
| 355 Initialize(kShouldProcessData); | 355 Initialize(kShouldProcessData); |
| 356 EXPECT_FALSE(fin_sent()); | 356 EXPECT_FALSE(fin_sent()); |
| 357 EXPECT_FALSE(rst_sent()); | 357 EXPECT_FALSE(rst_sent()); |
| 358 | 358 |
| 359 // Write some data, with FIN. | 359 // Write some data, with FIN. |
| 360 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 360 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 361 .WillOnce(Return(QuicConsumedData(1, true))); | 361 .WillOnce(Return(QuicConsumedData(1, true))); |
| 362 stream_->WriteOrBufferData(StringPiece(kData1, 1), true, NULL); | 362 stream_->WriteOrBufferData(StringPiece(kData1, 1), true, nullptr); |
| 363 EXPECT_TRUE(fin_sent()); | 363 EXPECT_TRUE(fin_sent()); |
| 364 EXPECT_FALSE(rst_sent()); | 364 EXPECT_FALSE(rst_sent()); |
| 365 | 365 |
| 366 // Now close the stream, and expect that we do not send a RST. | 366 // Now close the stream, and expect that we do not send a RST. |
| 367 stream_->OnClose(); | 367 stream_->OnClose(); |
| 368 EXPECT_TRUE(fin_sent()); | 368 EXPECT_TRUE(fin_sent()); |
| 369 EXPECT_FALSE(rst_sent()); | 369 EXPECT_FALSE(rst_sent()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 TEST_F(ReliableQuicStreamTest, OnlySendOneRst) { | 372 TEST_F(ReliableQuicStreamTest, OnlySendOneRst) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 | 506 |
| 507 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) | 507 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)) |
| 508 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( | 508 .WillOnce(DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 509 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 509 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 510 Return(QuicConsumedData(kInitialWriteSize, false)))); | 510 Return(QuicConsumedData(kInitialWriteSize, false)))); |
| 511 stream_->WriteOrBufferData(kData, false, delegate.get()); | 511 stream_->WriteOrBufferData(kData, false, delegate.get()); |
| 512 EXPECT_TRUE(HasWriteBlockedStreams()); | 512 EXPECT_TRUE(HasWriteBlockedStreams()); |
| 513 | 513 |
| 514 // Handle the ack of the first write. | 514 // Handle the ack of the first write. |
| 515 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 515 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
| 516 proxy_delegate = NULL; | 516 proxy_delegate = nullptr; |
| 517 | 517 |
| 518 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( | 518 EXPECT_CALL(*session_, WritevData(kHeadersStreamId, _, _, _, _, _)).WillOnce( |
| 519 DoAll(WithArgs<5>(Invoke(CreateFunctor( | 519 DoAll(WithArgs<5>(Invoke(CreateFunctor( |
| 520 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 520 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
| 521 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); | 521 Return(QuicConsumedData(kDataSize - kInitialWriteSize, false)))); |
| 522 stream_->OnCanWrite(); | 522 stream_->OnCanWrite(); |
| 523 | 523 |
| 524 // Handle the ack for the second write. | 524 // Handle the ack for the second write. |
| 525 EXPECT_CALL(*delegate.get(), OnAckNotification(101, 202, 303, 404, zero_)); | 525 EXPECT_CALL(*delegate.get(), OnAckNotification(101, 202, 303, 404, zero_)); |
| 526 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); | 526 proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 | 643 |
| 644 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); | 644 EXPECT_FALSE(stream_->HasFinalReceivedByteOffset()); |
| 645 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); | 645 QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); |
| 646 stream_->OnStreamReset(rst_frame); | 646 stream_->OnStreamReset(rst_frame); |
| 647 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); | 647 EXPECT_TRUE(stream_->HasFinalReceivedByteOffset()); |
| 648 } | 648 } |
| 649 | 649 |
| 650 } // namespace | 650 } // namespace |
| 651 } // namespace test | 651 } // namespace test |
| 652 } // namespace net | 652 } // namespace net |
| OLD | NEW |