| 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/quic_stream_sequencer.h" | 5 #include "net/quic/quic_stream_sequencer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 QuicStreamOffset close_offset() const { return close_offset_; } | 63 QuicStreamOffset close_offset() const { return close_offset_; } |
| 64 }; | 64 }; |
| 65 | 65 |
| 66 class MockStream : public ReliableQuicStream { | 66 class MockStream : public ReliableQuicStream { |
| 67 public: | 67 public: |
| 68 MockStream(QuicSession* session, QuicStreamId id) | 68 MockStream(QuicSession* session, QuicStreamId id) |
| 69 : ReliableQuicStream(id, session) { | 69 : ReliableQuicStream(id, session) { |
| 70 } | 70 } |
| 71 | 71 |
| 72 MOCK_METHOD0(OnFinRead, void()); | 72 MOCK_METHOD0(OnFinRead, void()); |
| 73 MOCK_METHOD2(ProcessData, uint32(const char* data, uint32 data_len)); | 73 MOCK_METHOD2(ProcessRawData, uint32(const char* data, uint32 data_len)); |
| 74 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, | 74 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, |
| 75 const string& details)); | 75 const string& details)); |
| 76 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); | 76 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); |
| 77 MOCK_METHOD0(OnCanWrite, void()); | 77 MOCK_METHOD0(OnCanWrite, void()); |
| 78 virtual QuicPriority EffectivePriority() const { return 0; } |
| 78 }; | 79 }; |
| 79 | 80 |
| 80 namespace { | 81 namespace { |
| 81 | 82 |
| 82 static const char kPayload[] = | 83 static const char kPayload[] = |
| 83 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 84 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| 84 | 85 |
| 85 class QuicStreamSequencerTest : public ::testing::Test { | 86 class QuicStreamSequencerTest : public ::testing::Test { |
| 86 protected: | 87 protected: |
| 87 QuicStreamSequencerTest() | 88 QuicStreamSequencerTest() |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 return true; | 130 return true; |
| 130 } | 131 } |
| 131 | 132 |
| 132 MockConnection* connection_; | 133 MockConnection* connection_; |
| 133 MockSession session_; | 134 MockSession session_; |
| 134 testing::StrictMock<MockStream> stream_; | 135 testing::StrictMock<MockStream> stream_; |
| 135 scoped_ptr<QuicStreamSequencerPeer> sequencer_; | 136 scoped_ptr<QuicStreamSequencerPeer> sequencer_; |
| 136 }; | 137 }; |
| 137 | 138 |
| 138 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { | 139 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { |
| 139 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)) | 140 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)) |
| 140 .WillOnce(Return(3)); | 141 .WillOnce(Return(3)); |
| 141 | 142 |
| 142 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 143 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 143 EXPECT_EQ(0u, sequencer_->frames()->size()); | 144 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 144 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 145 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
| 145 // Ignore this - it matches a past sequence number and we should not see it | 146 // Ignore this - it matches a past sequence number and we should not see it |
| 146 // again. | 147 // again. |
| 147 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); | 148 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); |
| 148 EXPECT_EQ(0u, sequencer_->frames()->size()); | 149 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 149 } | 150 } |
| 150 | 151 |
| 151 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) { | 152 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) { |
| 152 // TODO(rch): enable when chromium supports EXPECT_DFATAL. | 153 // TODO(rch): enable when chromium supports EXPECT_DFATAL. |
| 153 /* | 154 /* |
| 154 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)), | 155 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)), |
| 155 "Setting max frame memory to 2. " | 156 "Setting max frame memory to 2. " |
| 156 "Some frames will be impossible to handle."); | 157 "Some frames will be impossible to handle."); |
| 157 | 158 |
| 158 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), ""); | 159 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), ""); |
| 159 */ | 160 */ |
| 160 } | 161 } |
| 161 | 162 |
| 162 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) { | 163 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) { |
| 163 sequencer_->SetMemoryLimit(3); | 164 sequencer_->SetMemoryLimit(3); |
| 164 | 165 |
| 165 EXPECT_FALSE(sequencer_->OnFrame(3, "abc")); | 166 EXPECT_FALSE(sequencer_->OnFrame(3, "abc")); |
| 166 } | 167 } |
| 167 | 168 |
| 168 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { | 169 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { |
| 169 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)); | 170 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)); |
| 170 | 171 |
| 171 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 172 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 172 EXPECT_EQ(1u, sequencer_->frames()->size()); | 173 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 173 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 174 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 174 // Ignore this - it matches a buffered frame. | 175 // Ignore this - it matches a buffered frame. |
| 175 // Right now there's no checking that the payload is consistent. | 176 // Right now there's no checking that the payload is consistent. |
| 176 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); | 177 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); |
| 177 EXPECT_EQ(1u, sequencer_->frames()->size()); | 178 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 178 } | 179 } |
| 179 | 180 |
| 180 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { | 181 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { |
| 181 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 182 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 182 | 183 |
| 183 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 184 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 184 EXPECT_EQ(0u, sequencer_->frames()->size()); | 185 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 185 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 186 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
| 186 } | 187 } |
| 187 | 188 |
| 188 TEST_F(QuicStreamSequencerTest, EmptyFrame) { | 189 TEST_F(QuicStreamSequencerTest, EmptyFrame) { |
| 189 EXPECT_CALL(stream_, | 190 EXPECT_CALL(stream_, |
| 190 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 191 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
| 191 EXPECT_FALSE(sequencer_->OnFrame(0, "")); | 192 EXPECT_FALSE(sequencer_->OnFrame(0, "")); |
| 192 EXPECT_EQ(0u, sequencer_->frames()->size()); | 193 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 193 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 194 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 194 } | 195 } |
| 195 | 196 |
| 196 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { | 197 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { |
| 197 EXPECT_CALL(stream_, OnFinRead()); | 198 EXPECT_CALL(stream_, OnFinRead()); |
| 198 EXPECT_TRUE(sequencer_->OnFinFrame(0, "")); | 199 EXPECT_TRUE(sequencer_->OnFinFrame(0, "")); |
| 199 EXPECT_EQ(0u, sequencer_->frames()->size()); | 200 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 200 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 201 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 201 } | 202 } |
| 202 | 203 |
| 203 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { | 204 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { |
| 204 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2)); | 205 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(2)); |
| 205 | 206 |
| 206 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 207 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 207 EXPECT_EQ(1u, sequencer_->frames()->size()); | 208 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 208 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); | 209 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); |
| 209 EXPECT_EQ("c", sequencer_->frames()->find(2)->second); | 210 EXPECT_EQ("c", sequencer_->frames()->find(2)->second); |
| 210 } | 211 } |
| 211 | 212 |
| 212 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 213 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
| 213 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 214 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
| 214 | 215 |
| 215 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 216 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 216 EXPECT_EQ(1u, sequencer_->frames()->size()); | 217 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 217 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 218 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 218 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second); | 219 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second); |
| 219 } | 220 } |
| 220 | 221 |
| 221 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { | 222 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { |
| 222 EXPECT_TRUE(sequencer_->OnFrame(3, "abc")); | 223 EXPECT_TRUE(sequencer_->OnFrame(3, "abc")); |
| 223 EXPECT_EQ(1u, sequencer_->frames()->size()); | 224 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 224 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 225 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 225 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second); | 226 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second); |
| 226 } | 227 } |
| 227 | 228 |
| 228 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { | 229 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { |
| 229 // Buffer the first | 230 // Buffer the first |
| 230 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 231 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
| 231 EXPECT_EQ(1u, sequencer_->frames()->size()); | 232 EXPECT_EQ(1u, sequencer_->frames()->size()); |
| 232 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 233 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 233 // Buffer the second | 234 // Buffer the second |
| 234 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 235 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 235 EXPECT_EQ(2u, sequencer_->frames()->size()); | 236 EXPECT_EQ(2u, sequencer_->frames()->size()); |
| 236 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 237 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 237 | 238 |
| 238 InSequence s; | 239 InSequence s; |
| 239 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 240 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 240 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 241 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
| 241 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); | 242 EXPECT_CALL(stream_, ProcessRawData(StrEq("ghi"), 3)).WillOnce(Return(3)); |
| 242 | 243 |
| 243 // Ack right away | 244 // Ack right away |
| 244 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 245 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 245 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); | 246 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); |
| 246 | 247 |
| 247 EXPECT_EQ(0u, sequencer_->frames()->size()); | 248 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 248 } | 249 } |
| 249 | 250 |
| 250 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) { | 251 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) { |
| 251 sequencer_->SetMemoryLimit(9); | 252 sequencer_->SetMemoryLimit(9); |
| 252 | 253 |
| 253 // Too far to buffer. | 254 // Too far to buffer. |
| 254 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl")); | 255 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl")); |
| 255 | 256 |
| 256 // We can afford to buffer this. | 257 // We can afford to buffer this. |
| 257 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 258 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
| 258 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 259 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
| 259 | 260 |
| 260 InSequence s; | 261 InSequence s; |
| 261 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 262 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 262 | 263 |
| 263 // Ack right away | 264 // Ack right away |
| 264 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 265 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 265 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 266 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
| 266 | 267 |
| 267 // We should be willing to buffer this now. | 268 // We should be willing to buffer this now. |
| 268 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 269 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
| 269 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 270 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
| 270 | 271 |
| 271 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 272 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
| 272 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); | 273 EXPECT_CALL(stream_, ProcessRawData(StrEq("ghi"), 3)).WillOnce(Return(3)); |
| 273 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3)); | 274 EXPECT_CALL(stream_, ProcessRawData(StrEq("jkl"), 3)).WillOnce(Return(3)); |
| 274 | 275 |
| 275 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 276 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 276 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); | 277 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); |
| 277 EXPECT_EQ(0u, sequencer_->frames()->size()); | 278 EXPECT_EQ(0u, sequencer_->frames()->size()); |
| 278 } | 279 } |
| 279 | 280 |
| 280 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) { | 281 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) { |
| 281 sequencer_->SetMemoryLimit(9); | 282 sequencer_->SetMemoryLimit(9); |
| 282 char buffer[20]; | 283 char buffer[20]; |
| 283 iovec iov[2]; | 284 iovec iov[2]; |
| 284 iov[0].iov_base = &buffer[0]; | 285 iov[0].iov_base = &buffer[0]; |
| 285 iov[0].iov_len = 1; | 286 iov[0].iov_len = 1; |
| 286 iov[1].iov_base = &buffer[1]; | 287 iov[1].iov_base = &buffer[1]; |
| 287 iov[1].iov_len = 2; | 288 iov[1].iov_len = 2; |
| 288 | 289 |
| 289 // Push abc - process. | 290 // Push abc - process. |
| 290 // Push jkl - buffer (not next data) | 291 // Push jkl - buffer (not next data) |
| 291 // Push def - don't process. | 292 // Push def - don't process. |
| 292 // Push mno - drop (too far out) | 293 // Push mno - drop (too far out) |
| 293 // Push ghi - buffer (def not processed) | 294 // Push ghi - buffer (def not processed) |
| 294 // Read 2. | 295 // Read 2. |
| 295 // Push mno - buffer (not all read) | 296 // Push mno - buffer (not all read) |
| 296 // Read all | 297 // Read all |
| 297 // Push pqr - process | 298 // Push pqr - process |
| 298 | 299 |
| 299 InSequence s; | 300 InSequence s; |
| 300 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 301 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 301 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); | 302 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(0)); |
| 302 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); | 303 EXPECT_CALL(stream_, ProcessRawData(StrEq("pqr"), 3)).WillOnce(Return(3)); |
| 303 | 304 |
| 304 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 305 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 305 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 306 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 306 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 307 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
| 307 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); | 308 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); |
| 308 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 309 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
| 309 | 310 |
| 310 // Read 3 bytes. | 311 // Read 3 bytes. |
| 311 EXPECT_EQ(3, sequencer_->Readv(iov, 2)); | 312 EXPECT_EQ(3, sequencer_->Readv(iov, 2)); |
| 312 EXPECT_EQ(0, strncmp(buffer, "def", 3)); | 313 EXPECT_EQ(0, strncmp(buffer, "def", 3)); |
| 313 | 314 |
| 314 // Now we have space to bufer this. | 315 // Now we have space to bufer this. |
| 315 EXPECT_TRUE(sequencer_->OnFrame(12, "mno")); | 316 EXPECT_TRUE(sequencer_->OnFrame(12, "mno")); |
| 316 | 317 |
| 317 // Read the remaining 9 bytes. | 318 // Read the remaining 9 bytes. |
| 318 iov[1].iov_len = 19; | 319 iov[1].iov_len = 19; |
| 319 EXPECT_EQ(9, sequencer_->Readv(iov, 2)); | 320 EXPECT_EQ(9, sequencer_->Readv(iov, 2)); |
| 320 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9)); | 321 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9)); |
| 321 | 322 |
| 322 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); | 323 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); |
| 323 } | 324 } |
| 324 | 325 |
| 325 // Same as above, just using a different method for reading. | 326 // Same as above, just using a different method for reading. |
| 326 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) { | 327 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) { |
| 327 sequencer_->SetMemoryLimit(9); | 328 sequencer_->SetMemoryLimit(9); |
| 328 | 329 |
| 329 InSequence s; | 330 InSequence s; |
| 330 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 331 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 331 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); | 332 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(0)); |
| 332 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); | 333 EXPECT_CALL(stream_, ProcessRawData(StrEq("pqr"), 3)).WillOnce(Return(3)); |
| 333 | 334 |
| 334 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 335 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 335 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 336 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 336 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 337 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
| 337 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); | 338 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); |
| 338 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 339 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
| 339 | 340 |
| 340 // Read 3 bytes. | 341 // Read 3 bytes. |
| 341 const char* expected[] = {"def", "ghi", "jkl"}; | 342 const char* expected[] = {"def", "ghi", "jkl"}; |
| 342 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 343 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 354 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1)); | 355 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1)); |
| 355 | 356 |
| 356 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); | 357 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); |
| 357 } | 358 } |
| 358 | 359 |
| 359 // Same as above, just using a different method for reading. | 360 // Same as above, just using a different method for reading. |
| 360 TEST_F(QuicStreamSequencerTest, MarkConsumed) { | 361 TEST_F(QuicStreamSequencerTest, MarkConsumed) { |
| 361 sequencer_->SetMemoryLimit(9); | 362 sequencer_->SetMemoryLimit(9); |
| 362 | 363 |
| 363 InSequence s; | 364 InSequence s; |
| 364 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 365 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
| 365 | 366 |
| 366 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 367 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 367 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 368 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 368 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 369 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
| 369 | 370 |
| 370 // Peek into the data. | 371 // Peek into the data. |
| 371 const char* expected[] = {"abc", "def", "ghi"}; | 372 const char* expected[] = {"abc", "def", "ghi"}; |
| 372 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 373 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| 373 | 374 |
| 374 // Consume 1 byte. | 375 // Consume 1 byte. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 386 // Consume 5 bytes. | 387 // Consume 5 bytes. |
| 387 sequencer_->MarkConsumed(5); | 388 sequencer_->MarkConsumed(5); |
| 388 // Verify data. | 389 // Verify data. |
| 389 const char* expected4[] = {"i"}; | 390 const char* expected4[] = {"i"}; |
| 390 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); | 391 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); |
| 391 } | 392 } |
| 392 | 393 |
| 393 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { | 394 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { |
| 394 // TODO(rch): enable when chromium supports EXPECT_DFATAL. | 395 // TODO(rch): enable when chromium supports EXPECT_DFATAL. |
| 395 /* | 396 /* |
| 396 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 397 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
| 397 | 398 |
| 398 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 399 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 399 EXPECT_TRUE(sequencer_->OnFrame(9, "jklmnopqrstuvwxyz")); | 400 EXPECT_TRUE(sequencer_->OnFrame(9, "jklmnopqrstuvwxyz")); |
| 400 | 401 |
| 401 // Peek into the data. Only the first chunk should be readable | 402 // Peek into the data. Only the first chunk should be readable |
| 402 // because of the missing data. | 403 // because of the missing data. |
| 403 const char* expected[] = {"abc"}; | 404 const char* expected[] = {"abc"}; |
| 404 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 405 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| 405 | 406 |
| 406 // Now, attempt to mark consumed more data than was readable | 407 // Now, attempt to mark consumed more data than was readable |
| 407 // and expect the stream to be closed. | 408 // and expect the stream to be closed. |
| 408 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); | 409 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); |
| 409 EXPECT_DFATAL(sequencer_->MarkConsumed(4), | 410 EXPECT_DFATAL(sequencer_->MarkConsumed(4), |
| 410 "Invalid argument to MarkConsumed. num_bytes_consumed_: 3 " | 411 "Invalid argument to MarkConsumed. num_bytes_consumed_: 3 " |
| 411 "end_offset: 4 offset: 9 length: 17"); | 412 "end_offset: 4 offset: 9 length: 17"); |
| 412 */ | 413 */ |
| 413 } | 414 } |
| 414 | 415 |
| 415 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { | 416 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { |
| 416 InSequence s; | 417 InSequence s; |
| 417 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 418 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
| 418 | 419 |
| 419 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 420 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 420 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 421 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 421 // Missing packet: 6, ghi | 422 // Missing packet: 6, ghi |
| 422 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 423 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
| 423 | 424 |
| 424 const char* expected[] = {"abc", "def"}; | 425 const char* expected[] = {"abc", "def"}; |
| 425 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 426 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| 426 | 427 |
| 427 sequencer_->MarkConsumed(6); | 428 sequencer_->MarkConsumed(6); |
| 428 } | 429 } |
| 429 | 430 |
| 430 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 431 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
| 431 InSequence s; | 432 InSequence s; |
| 432 | 433 |
| 433 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 434 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 434 EXPECT_CALL(stream_, OnFinRead()); | 435 EXPECT_CALL(stream_, OnFinRead()); |
| 435 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc")); | 436 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc")); |
| 436 | 437 |
| 437 EXPECT_EQ(3u, sequencer_->close_offset()); | 438 EXPECT_EQ(3u, sequencer_->close_offset()); |
| 438 } | 439 } |
| 439 | 440 |
| 440 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { | 441 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
| 441 sequencer_->OnFinFrame(6, ""); | 442 sequencer_->OnFinFrame(6, ""); |
| 442 EXPECT_EQ(6u, sequencer_->close_offset()); | 443 EXPECT_EQ(6u, sequencer_->close_offset()); |
| 443 InSequence s; | 444 InSequence s; |
| 444 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 445 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 445 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 446 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
| 446 EXPECT_CALL(stream_, OnFinRead()); | 447 EXPECT_CALL(stream_, OnFinRead()); |
| 447 | 448 |
| 448 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 449 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
| 449 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 450 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 450 } | 451 } |
| 451 | 452 |
| 452 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { | 453 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { |
| 453 sequencer_->OnFinFrame(3, ""); | 454 sequencer_->OnFinFrame(3, ""); |
| 454 EXPECT_EQ(3u, sequencer_->close_offset()); | 455 EXPECT_EQ(3u, sequencer_->close_offset()); |
| 455 InSequence s; | 456 InSequence s; |
| 456 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 457 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
| 457 EXPECT_CALL(stream_, OnFinRead()); | 458 EXPECT_CALL(stream_, OnFinRead()); |
| 458 | 459 |
| 459 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 460 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 460 } | 461 } |
| 461 | 462 |
| 462 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { | 463 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { |
| 463 char buffer[3]; | 464 char buffer[3]; |
| 464 | 465 |
| 465 sequencer_->OnFinFrame(3, ""); | 466 sequencer_->OnFinFrame(3, ""); |
| 466 EXPECT_EQ(3u, sequencer_->close_offset()); | 467 EXPECT_EQ(3u, sequencer_->close_offset()); |
| 467 | 468 |
| 468 EXPECT_FALSE(sequencer_->IsClosed()); | 469 EXPECT_FALSE(sequencer_->IsClosed()); |
| 469 | 470 |
| 470 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 471 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
| 471 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 472 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
| 472 | 473 |
| 473 iovec iov = { &buffer[0], 3 }; | 474 iovec iov = { &buffer[0], 3 }; |
| 474 int bytes_read = sequencer_->Readv(&iov, 1); | 475 int bytes_read = sequencer_->Readv(&iov, 1); |
| 475 EXPECT_EQ(3, bytes_read); | 476 EXPECT_EQ(3, bytes_read); |
| 476 EXPECT_TRUE(sequencer_->IsClosed()); | 477 EXPECT_TRUE(sequencer_->IsClosed()); |
| 477 } | 478 } |
| 478 | 479 |
| 479 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { | 480 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { |
| 480 sequencer_->OnFinFrame(3, ""); | 481 sequencer_->OnFinFrame(3, ""); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 string output_; | 529 string output_; |
| 529 FrameList list_; | 530 FrameList list_; |
| 530 }; | 531 }; |
| 531 | 532 |
| 532 // All frames are processed as soon as we have sequential data. | 533 // All frames are processed as soon as we have sequential data. |
| 533 // Infinite buffering, so all frames are acked right away. | 534 // Infinite buffering, so all frames are acked right away. |
| 534 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { | 535 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { |
| 535 InSequence s; | 536 InSequence s; |
| 536 for (size_t i = 0; i < list_.size(); ++i) { | 537 for (size_t i = 0; i < list_.size(); ++i) { |
| 537 string* data = &list_[i].second; | 538 string* data = &list_[i].second; |
| 538 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) | 539 EXPECT_CALL(stream_, ProcessRawData(StrEq(*data), data->size())) |
| 539 .WillOnce(Return(data->size())); | 540 .WillOnce(Return(data->size())); |
| 540 } | 541 } |
| 541 | 542 |
| 542 while (!list_.empty()) { | 543 while (!list_.empty()) { |
| 543 int index = OneToN(list_.size()) - 1; | 544 int index = OneToN(list_.size()) - 1; |
| 544 LOG(ERROR) << "Sending index " << index << " " | 545 LOG(ERROR) << "Sending index " << index << " " |
| 545 << list_[index].second.data(); | 546 << list_[index].second.data(); |
| 546 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first, | 547 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first, |
| 547 list_[index].second.data())); | 548 list_[index].second.data())); |
| 548 | 549 |
| 549 list_.erase(list_.begin() + index); | 550 list_.erase(list_.begin() + index); |
| 550 } | 551 } |
| 551 } | 552 } |
| 552 | 553 |
| 553 // All frames are processed as soon as we have sequential data. | 554 // All frames are processed as soon as we have sequential data. |
| 554 // Buffering, so some frames are rejected. | 555 // Buffering, so some frames are rejected. |
| 555 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) { | 556 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) { |
| 556 sequencer_->SetMemoryLimit(26); | 557 sequencer_->SetMemoryLimit(26); |
| 557 | 558 |
| 558 InSequence s; | 559 InSequence s; |
| 559 for (size_t i = 0; i < list_.size(); ++i) { | 560 for (size_t i = 0; i < list_.size(); ++i) { |
| 560 string* data = &list_[i].second; | 561 string* data = &list_[i].second; |
| 561 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) | 562 EXPECT_CALL(stream_, ProcessRawData(StrEq(*data), data->size())) |
| 562 .WillOnce(Return(data->size())); | 563 .WillOnce(Return(data->size())); |
| 563 } | 564 } |
| 564 | 565 |
| 565 while (!list_.empty()) { | 566 while (!list_.empty()) { |
| 566 int index = OneToN(list_.size()) - 1; | 567 int index = OneToN(list_.size()) - 1; |
| 567 LOG(ERROR) << "Sending index " << index << " " | 568 LOG(ERROR) << "Sending index " << index << " " |
| 568 << list_[index].second.data(); | 569 << list_[index].second.data(); |
| 569 bool acked = sequencer_->OnFrame(list_[index].first, | 570 bool acked = sequencer_->OnFrame(list_[index].first, |
| 570 list_[index].second.data()); | 571 list_[index].second.data()); |
| 571 | 572 |
| 572 if (acked) { | 573 if (acked) { |
| 573 list_.erase(list_.begin() + index); | 574 list_.erase(list_.begin() + index); |
| 574 } | 575 } |
| 575 } | 576 } |
| 576 } | 577 } |
| 577 | 578 |
| 578 } // namespace | 579 } // namespace |
| 579 } // namespace test | 580 } // namespace test |
| 580 } // namespace net | 581 } // namespace net |
| OLD | NEW |