| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/spdy/spdy_write_queue.h" | 5 #include "net/spdy/spdy_write_queue.h" |
| 6 | 6 |
| 7 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 std::unique_ptr<SpdyBufferProducer> producer_low = StringToProducer("LOW"); | 108 std::unique_ptr<SpdyBufferProducer> producer_low = StringToProducer("LOW"); |
| 109 std::unique_ptr<SpdyBufferProducer> producer_medium = | 109 std::unique_ptr<SpdyBufferProducer> producer_medium = |
| 110 StringToProducer("MEDIUM"); | 110 StringToProducer("MEDIUM"); |
| 111 std::unique_ptr<SpdyBufferProducer> producer_highest = | 111 std::unique_ptr<SpdyBufferProducer> producer_highest = |
| 112 StringToProducer("HIGHEST"); | 112 StringToProducer("HIGHEST"); |
| 113 | 113 |
| 114 std::unique_ptr<SpdyStream> stream_medium(MakeTestStream(MEDIUM)); | 114 std::unique_ptr<SpdyStream> stream_medium(MakeTestStream(MEDIUM)); |
| 115 std::unique_ptr<SpdyStream> stream_highest(MakeTestStream(HIGHEST)); | 115 std::unique_ptr<SpdyStream> stream_highest(MakeTestStream(HIGHEST)); |
| 116 | 116 |
| 117 // A NULL stream should still work. | 117 // A NULL stream should still work. |
| 118 write_queue.Enqueue(LOW, SYN_STREAM, std::move(producer_low), | 118 write_queue.Enqueue(LOW, HEADERS, std::move(producer_low), |
| 119 base::WeakPtr<SpdyStream>()); | 119 base::WeakPtr<SpdyStream>()); |
| 120 write_queue.Enqueue(MEDIUM, SYN_REPLY, std::move(producer_medium), | 120 write_queue.Enqueue(MEDIUM, HEADERS, std::move(producer_medium), |
| 121 stream_medium->GetWeakPtr()); | 121 stream_medium->GetWeakPtr()); |
| 122 write_queue.Enqueue(HIGHEST, RST_STREAM, std::move(producer_highest), | 122 write_queue.Enqueue(HIGHEST, RST_STREAM, std::move(producer_highest), |
| 123 stream_highest->GetWeakPtr()); | 123 stream_highest->GetWeakPtr()); |
| 124 | 124 |
| 125 SpdyFrameType frame_type = DATA; | 125 SpdyFrameType frame_type = DATA; |
| 126 std::unique_ptr<SpdyBufferProducer> frame_producer; | 126 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 127 base::WeakPtr<SpdyStream> stream; | 127 base::WeakPtr<SpdyStream> stream; |
| 128 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 128 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 129 EXPECT_EQ(RST_STREAM, frame_type); | 129 EXPECT_EQ(RST_STREAM, frame_type); |
| 130 EXPECT_EQ("HIGHEST", ProducerToString(std::move(frame_producer))); | 130 EXPECT_EQ("HIGHEST", ProducerToString(std::move(frame_producer))); |
| 131 EXPECT_EQ(stream_highest.get(), stream.get()); | 131 EXPECT_EQ(stream_highest.get(), stream.get()); |
| 132 | 132 |
| 133 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 133 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 134 EXPECT_EQ(SYN_REPLY, frame_type); | 134 EXPECT_EQ(HEADERS, frame_type); |
| 135 EXPECT_EQ("MEDIUM", ProducerToString(std::move(frame_producer))); | 135 EXPECT_EQ("MEDIUM", ProducerToString(std::move(frame_producer))); |
| 136 EXPECT_EQ(stream_medium.get(), stream.get()); | 136 EXPECT_EQ(stream_medium.get(), stream.get()); |
| 137 | 137 |
| 138 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 138 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 139 EXPECT_EQ(SYN_STREAM, frame_type); | 139 EXPECT_EQ(HEADERS, frame_type); |
| 140 EXPECT_EQ("LOW", ProducerToString(std::move(frame_producer))); | 140 EXPECT_EQ("LOW", ProducerToString(std::move(frame_producer))); |
| 141 EXPECT_EQ(nullptr, stream.get()); | 141 EXPECT_EQ(nullptr, stream.get()); |
| 142 | 142 |
| 143 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 143 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 144 } | 144 } |
| 145 | 145 |
| 146 // Add some frame producers with the same priority. The producers | 146 // Add some frame producers with the same priority. The producers |
| 147 // should be dequeued in FIFO order with their associated stream. | 147 // should be dequeued in FIFO order with their associated stream. |
| 148 TEST_F(SpdyWriteQueueTest, DequeuesFIFO) { | 148 TEST_F(SpdyWriteQueueTest, DequeuesFIFO) { |
| 149 SpdyWriteQueue write_queue; | 149 SpdyWriteQueue write_queue; |
| 150 | 150 |
| 151 std::unique_ptr<SpdyBufferProducer> producer1 = IntToProducer(1); | 151 std::unique_ptr<SpdyBufferProducer> producer1 = IntToProducer(1); |
| 152 std::unique_ptr<SpdyBufferProducer> producer2 = IntToProducer(2); | 152 std::unique_ptr<SpdyBufferProducer> producer2 = IntToProducer(2); |
| 153 std::unique_ptr<SpdyBufferProducer> producer3 = IntToProducer(3); | 153 std::unique_ptr<SpdyBufferProducer> producer3 = IntToProducer(3); |
| 154 | 154 |
| 155 std::unique_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); | 155 std::unique_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); |
| 156 std::unique_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); | 156 std::unique_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); |
| 157 std::unique_ptr<SpdyStream> stream3(MakeTestStream(DEFAULT_PRIORITY)); | 157 std::unique_ptr<SpdyStream> stream3(MakeTestStream(DEFAULT_PRIORITY)); |
| 158 | 158 |
| 159 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, std::move(producer1), | 159 write_queue.Enqueue(DEFAULT_PRIORITY, HEADERS, std::move(producer1), |
| 160 stream1->GetWeakPtr()); | 160 stream1->GetWeakPtr()); |
| 161 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_REPLY, std::move(producer2), | 161 write_queue.Enqueue(DEFAULT_PRIORITY, HEADERS, std::move(producer2), |
| 162 stream2->GetWeakPtr()); | 162 stream2->GetWeakPtr()); |
| 163 write_queue.Enqueue(DEFAULT_PRIORITY, RST_STREAM, std::move(producer3), | 163 write_queue.Enqueue(DEFAULT_PRIORITY, RST_STREAM, std::move(producer3), |
| 164 stream3->GetWeakPtr()); | 164 stream3->GetWeakPtr()); |
| 165 | 165 |
| 166 SpdyFrameType frame_type = DATA; | 166 SpdyFrameType frame_type = DATA; |
| 167 std::unique_ptr<SpdyBufferProducer> frame_producer; | 167 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 168 base::WeakPtr<SpdyStream> stream; | 168 base::WeakPtr<SpdyStream> stream; |
| 169 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 169 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 170 EXPECT_EQ(SYN_STREAM, frame_type); | 170 EXPECT_EQ(HEADERS, frame_type); |
| 171 EXPECT_EQ(1, ProducerToInt(std::move(frame_producer))); | 171 EXPECT_EQ(1, ProducerToInt(std::move(frame_producer))); |
| 172 EXPECT_EQ(stream1.get(), stream.get()); | 172 EXPECT_EQ(stream1.get(), stream.get()); |
| 173 | 173 |
| 174 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 174 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 175 EXPECT_EQ(SYN_REPLY, frame_type); | 175 EXPECT_EQ(HEADERS, frame_type); |
| 176 EXPECT_EQ(2, ProducerToInt(std::move(frame_producer))); | 176 EXPECT_EQ(2, ProducerToInt(std::move(frame_producer))); |
| 177 EXPECT_EQ(stream2.get(), stream.get()); | 177 EXPECT_EQ(stream2.get(), stream.get()); |
| 178 | 178 |
| 179 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 179 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 180 EXPECT_EQ(RST_STREAM, frame_type); | 180 EXPECT_EQ(RST_STREAM, frame_type); |
| 181 EXPECT_EQ(3, ProducerToInt(std::move(frame_producer))); | 181 EXPECT_EQ(3, ProducerToInt(std::move(frame_producer))); |
| 182 EXPECT_EQ(stream3.get(), stream.get()); | 182 EXPECT_EQ(stream3.get(), stream.get()); |
| 183 | 183 |
| 184 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 184 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 185 } | 185 } |
| 186 | 186 |
| 187 // Enqueue a bunch of writes and then call | 187 // Enqueue a bunch of writes and then call |
| 188 // RemovePendingWritesForStream() on one of the streams. No dequeued | 188 // RemovePendingWritesForStream() on one of the streams. No dequeued |
| 189 // write should be for that stream. | 189 // write should be for that stream. |
| 190 TEST_F(SpdyWriteQueueTest, RemovePendingWritesForStream) { | 190 TEST_F(SpdyWriteQueueTest, RemovePendingWritesForStream) { |
| 191 SpdyWriteQueue write_queue; | 191 SpdyWriteQueue write_queue; |
| 192 | 192 |
| 193 std::unique_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); | 193 std::unique_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); |
| 194 std::unique_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); | 194 std::unique_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); |
| 195 | 195 |
| 196 for (int i = 0; i < 100; ++i) { | 196 for (int i = 0; i < 100; ++i) { |
| 197 base::WeakPtr<SpdyStream> stream = | 197 base::WeakPtr<SpdyStream> stream = |
| 198 (((i % 3) == 0) ? stream1 : stream2)->GetWeakPtr(); | 198 (((i % 3) == 0) ? stream1 : stream2)->GetWeakPtr(); |
| 199 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, IntToProducer(i), stream); | 199 write_queue.Enqueue(DEFAULT_PRIORITY, HEADERS, IntToProducer(i), stream); |
| 200 } | 200 } |
| 201 | 201 |
| 202 write_queue.RemovePendingWritesForStream(stream2->GetWeakPtr()); | 202 write_queue.RemovePendingWritesForStream(stream2->GetWeakPtr()); |
| 203 | 203 |
| 204 for (int i = 0; i < 100; i += 3) { | 204 for (int i = 0; i < 100; i += 3) { |
| 205 SpdyFrameType frame_type = DATA; | 205 SpdyFrameType frame_type = DATA; |
| 206 std::unique_ptr<SpdyBufferProducer> frame_producer; | 206 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 207 base::WeakPtr<SpdyStream> stream; | 207 base::WeakPtr<SpdyStream> stream; |
| 208 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 208 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 209 EXPECT_EQ(SYN_STREAM, frame_type); | 209 EXPECT_EQ(HEADERS, frame_type); |
| 210 EXPECT_EQ(i, ProducerToInt(std::move(frame_producer))); | 210 EXPECT_EQ(i, ProducerToInt(std::move(frame_producer))); |
| 211 EXPECT_EQ(stream1.get(), stream.get()); | 211 EXPECT_EQ(stream1.get(), stream.get()); |
| 212 } | 212 } |
| 213 | 213 |
| 214 SpdyFrameType frame_type = DATA; | 214 SpdyFrameType frame_type = DATA; |
| 215 std::unique_ptr<SpdyBufferProducer> frame_producer; | 215 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 216 base::WeakPtr<SpdyStream> stream; | 216 base::WeakPtr<SpdyStream> stream; |
| 217 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 217 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 218 } | 218 } |
| 219 | 219 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 231 std::unique_ptr<SpdyStream> stream3(MakeTestStream(DEFAULT_PRIORITY)); | 231 std::unique_ptr<SpdyStream> stream3(MakeTestStream(DEFAULT_PRIORITY)); |
| 232 stream3->set_stream_id(5); | 232 stream3->set_stream_id(5); |
| 233 // No stream id assigned. | 233 // No stream id assigned. |
| 234 std::unique_ptr<SpdyStream> stream4(MakeTestStream(DEFAULT_PRIORITY)); | 234 std::unique_ptr<SpdyStream> stream4(MakeTestStream(DEFAULT_PRIORITY)); |
| 235 base::WeakPtr<SpdyStream> streams[] = { | 235 base::WeakPtr<SpdyStream> streams[] = { |
| 236 stream1->GetWeakPtr(), stream2->GetWeakPtr(), | 236 stream1->GetWeakPtr(), stream2->GetWeakPtr(), |
| 237 stream3->GetWeakPtr(), stream4->GetWeakPtr() | 237 stream3->GetWeakPtr(), stream4->GetWeakPtr() |
| 238 }; | 238 }; |
| 239 | 239 |
| 240 for (int i = 0; i < 100; ++i) { | 240 for (int i = 0; i < 100; ++i) { |
| 241 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, IntToProducer(i), | 241 write_queue.Enqueue(DEFAULT_PRIORITY, HEADERS, IntToProducer(i), |
| 242 streams[i % arraysize(streams)]); | 242 streams[i % arraysize(streams)]); |
| 243 } | 243 } |
| 244 | 244 |
| 245 write_queue.RemovePendingWritesForStreamsAfter(stream1->stream_id()); | 245 write_queue.RemovePendingWritesForStreamsAfter(stream1->stream_id()); |
| 246 | 246 |
| 247 for (int i = 0; i < 100; i += arraysize(streams)) { | 247 for (int i = 0; i < 100; i += arraysize(streams)) { |
| 248 SpdyFrameType frame_type = DATA; | 248 SpdyFrameType frame_type = DATA; |
| 249 std::unique_ptr<SpdyBufferProducer> frame_producer; | 249 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 250 base::WeakPtr<SpdyStream> stream; | 250 base::WeakPtr<SpdyStream> stream; |
| 251 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)) | 251 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)) |
| 252 << "Unable to Dequeue i: " << i; | 252 << "Unable to Dequeue i: " << i; |
| 253 EXPECT_EQ(SYN_STREAM, frame_type); | 253 EXPECT_EQ(HEADERS, frame_type); |
| 254 EXPECT_EQ(i, ProducerToInt(std::move(frame_producer))); | 254 EXPECT_EQ(i, ProducerToInt(std::move(frame_producer))); |
| 255 EXPECT_EQ(stream1.get(), stream.get()); | 255 EXPECT_EQ(stream1.get(), stream.get()); |
| 256 } | 256 } |
| 257 | 257 |
| 258 SpdyFrameType frame_type = DATA; | 258 SpdyFrameType frame_type = DATA; |
| 259 std::unique_ptr<SpdyBufferProducer> frame_producer; | 259 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 260 base::WeakPtr<SpdyStream> stream; | 260 base::WeakPtr<SpdyStream> stream; |
| 261 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 261 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 262 } | 262 } |
| 263 | 263 |
| 264 // Enqueue a bunch of writes and then call Clear(). The write queue | 264 // Enqueue a bunch of writes and then call Clear(). The write queue |
| 265 // should clean up the memory properly, and Dequeue() should return | 265 // should clean up the memory properly, and Dequeue() should return |
| 266 // false. | 266 // false. |
| 267 TEST_F(SpdyWriteQueueTest, Clear) { | 267 TEST_F(SpdyWriteQueueTest, Clear) { |
| 268 SpdyWriteQueue write_queue; | 268 SpdyWriteQueue write_queue; |
| 269 | 269 |
| 270 for (int i = 0; i < 100; ++i) { | 270 for (int i = 0; i < 100; ++i) { |
| 271 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, IntToProducer(i), | 271 write_queue.Enqueue(DEFAULT_PRIORITY, HEADERS, IntToProducer(i), |
| 272 base::WeakPtr<SpdyStream>()); | 272 base::WeakPtr<SpdyStream>()); |
| 273 } | 273 } |
| 274 | 274 |
| 275 write_queue.Clear(); | 275 write_queue.Clear(); |
| 276 | 276 |
| 277 SpdyFrameType frame_type = DATA; | 277 SpdyFrameType frame_type = DATA; |
| 278 std::unique_ptr<SpdyBufferProducer> frame_producer; | 278 std::unique_ptr<SpdyBufferProducer> frame_producer; |
| 279 base::WeakPtr<SpdyStream> stream; | 279 base::WeakPtr<SpdyStream> stream; |
| 280 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 280 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 281 } | 281 } |
| 282 | 282 |
| 283 TEST_F(SpdyWriteQueueTest, RequeingProducerWithoutReentrance) { | 283 TEST_F(SpdyWriteQueueTest, RequeingProducerWithoutReentrance) { |
| 284 SpdyWriteQueue queue; | 284 SpdyWriteQueue queue; |
| 285 queue.Enqueue( | 285 queue.Enqueue( |
| 286 DEFAULT_PRIORITY, SYN_STREAM, | 286 DEFAULT_PRIORITY, HEADERS, |
| 287 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), | 287 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), |
| 288 base::WeakPtr<SpdyStream>()); | 288 base::WeakPtr<SpdyStream>()); |
| 289 { | 289 { |
| 290 SpdyFrameType frame_type; | 290 SpdyFrameType frame_type; |
| 291 std::unique_ptr<SpdyBufferProducer> producer; | 291 std::unique_ptr<SpdyBufferProducer> producer; |
| 292 base::WeakPtr<SpdyStream> stream; | 292 base::WeakPtr<SpdyStream> stream; |
| 293 | 293 |
| 294 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); | 294 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); |
| 295 EXPECT_TRUE(queue.IsEmpty()); | 295 EXPECT_TRUE(queue.IsEmpty()); |
| 296 EXPECT_EQ(string(kOriginal), producer->ProduceBuffer()->GetRemainingData()); | 296 EXPECT_EQ(string(kOriginal), producer->ProduceBuffer()->GetRemainingData()); |
| 297 } | 297 } |
| 298 // |producer| was destroyed, and a buffer is re-queued. | 298 // |producer| was destroyed, and a buffer is re-queued. |
| 299 EXPECT_FALSE(queue.IsEmpty()); | 299 EXPECT_FALSE(queue.IsEmpty()); |
| 300 | 300 |
| 301 SpdyFrameType frame_type; | 301 SpdyFrameType frame_type; |
| 302 std::unique_ptr<SpdyBufferProducer> producer; | 302 std::unique_ptr<SpdyBufferProducer> producer; |
| 303 base::WeakPtr<SpdyStream> stream; | 303 base::WeakPtr<SpdyStream> stream; |
| 304 | 304 |
| 305 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); | 305 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); |
| 306 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); | 306 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); |
| 307 } | 307 } |
| 308 | 308 |
| 309 TEST_F(SpdyWriteQueueTest, ReentranceOnClear) { | 309 TEST_F(SpdyWriteQueueTest, ReentranceOnClear) { |
| 310 SpdyWriteQueue queue; | 310 SpdyWriteQueue queue; |
| 311 queue.Enqueue( | 311 queue.Enqueue( |
| 312 DEFAULT_PRIORITY, SYN_STREAM, | 312 DEFAULT_PRIORITY, HEADERS, |
| 313 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), | 313 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), |
| 314 base::WeakPtr<SpdyStream>()); | 314 base::WeakPtr<SpdyStream>()); |
| 315 | 315 |
| 316 queue.Clear(); | 316 queue.Clear(); |
| 317 EXPECT_FALSE(queue.IsEmpty()); | 317 EXPECT_FALSE(queue.IsEmpty()); |
| 318 | 318 |
| 319 SpdyFrameType frame_type; | 319 SpdyFrameType frame_type; |
| 320 std::unique_ptr<SpdyBufferProducer> producer; | 320 std::unique_ptr<SpdyBufferProducer> producer; |
| 321 base::WeakPtr<SpdyStream> stream; | 321 base::WeakPtr<SpdyStream> stream; |
| 322 | 322 |
| 323 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); | 323 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &stream)); |
| 324 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); | 324 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); |
| 325 } | 325 } |
| 326 | 326 |
| 327 TEST_F(SpdyWriteQueueTest, ReentranceOnRemovePendingWritesAfter) { | 327 TEST_F(SpdyWriteQueueTest, ReentranceOnRemovePendingWritesAfter) { |
| 328 std::unique_ptr<SpdyStream> stream(MakeTestStream(DEFAULT_PRIORITY)); | 328 std::unique_ptr<SpdyStream> stream(MakeTestStream(DEFAULT_PRIORITY)); |
| 329 stream->set_stream_id(2); | 329 stream->set_stream_id(2); |
| 330 | 330 |
| 331 SpdyWriteQueue queue; | 331 SpdyWriteQueue queue; |
| 332 queue.Enqueue( | 332 queue.Enqueue( |
| 333 DEFAULT_PRIORITY, SYN_STREAM, | 333 DEFAULT_PRIORITY, HEADERS, |
| 334 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), | 334 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), |
| 335 stream->GetWeakPtr()); | 335 stream->GetWeakPtr()); |
| 336 | 336 |
| 337 queue.RemovePendingWritesForStreamsAfter(1); | 337 queue.RemovePendingWritesForStreamsAfter(1); |
| 338 EXPECT_FALSE(queue.IsEmpty()); | 338 EXPECT_FALSE(queue.IsEmpty()); |
| 339 | 339 |
| 340 SpdyFrameType frame_type; | 340 SpdyFrameType frame_type; |
| 341 std::unique_ptr<SpdyBufferProducer> producer; | 341 std::unique_ptr<SpdyBufferProducer> producer; |
| 342 base::WeakPtr<SpdyStream> weak_stream; | 342 base::WeakPtr<SpdyStream> weak_stream; |
| 343 | 343 |
| 344 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); | 344 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); |
| 345 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); | 345 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); |
| 346 } | 346 } |
| 347 | 347 |
| 348 TEST_F(SpdyWriteQueueTest, ReentranceOnRemovePendingWritesForStream) { | 348 TEST_F(SpdyWriteQueueTest, ReentranceOnRemovePendingWritesForStream) { |
| 349 std::unique_ptr<SpdyStream> stream(MakeTestStream(DEFAULT_PRIORITY)); | 349 std::unique_ptr<SpdyStream> stream(MakeTestStream(DEFAULT_PRIORITY)); |
| 350 stream->set_stream_id(2); | 350 stream->set_stream_id(2); |
| 351 | 351 |
| 352 SpdyWriteQueue queue; | 352 SpdyWriteQueue queue; |
| 353 queue.Enqueue( | 353 queue.Enqueue( |
| 354 DEFAULT_PRIORITY, SYN_STREAM, | 354 DEFAULT_PRIORITY, HEADERS, |
| 355 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), | 355 std::unique_ptr<SpdyBufferProducer>(new RequeingBufferProducer(&queue)), |
| 356 stream->GetWeakPtr()); | 356 stream->GetWeakPtr()); |
| 357 | 357 |
| 358 queue.RemovePendingWritesForStream(stream->GetWeakPtr()); | 358 queue.RemovePendingWritesForStream(stream->GetWeakPtr()); |
| 359 EXPECT_FALSE(queue.IsEmpty()); | 359 EXPECT_FALSE(queue.IsEmpty()); |
| 360 | 360 |
| 361 SpdyFrameType frame_type; | 361 SpdyFrameType frame_type; |
| 362 std::unique_ptr<SpdyBufferProducer> producer; | 362 std::unique_ptr<SpdyBufferProducer> producer; |
| 363 base::WeakPtr<SpdyStream> weak_stream; | 363 base::WeakPtr<SpdyStream> weak_stream; |
| 364 | 364 |
| 365 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); | 365 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); |
| 366 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); | 366 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); |
| 367 } | 367 } |
| 368 | 368 |
| 369 } // namespace | 369 } // namespace |
| 370 | 370 |
| 371 } // namespace net | 371 } // namespace net |
| OLD | NEW |