| 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 <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 write_queue.Enqueue( | 120 write_queue.Enqueue( |
| 121 HIGHEST, RST_STREAM, producer_highest.Pass(), | 121 HIGHEST, RST_STREAM, producer_highest.Pass(), |
| 122 stream_highest->GetWeakPtr()); | 122 stream_highest->GetWeakPtr()); |
| 123 | 123 |
| 124 SpdyFrameType frame_type = DATA; | 124 SpdyFrameType frame_type = DATA; |
| 125 scoped_ptr<SpdyBufferProducer> frame_producer; | 125 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 126 base::WeakPtr<SpdyStream> stream; | 126 base::WeakPtr<SpdyStream> stream; |
| 127 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 127 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 128 EXPECT_EQ(RST_STREAM, frame_type); | 128 EXPECT_EQ(RST_STREAM, frame_type); |
| 129 EXPECT_EQ("HIGHEST", ProducerToString(frame_producer.Pass())); | 129 EXPECT_EQ("HIGHEST", ProducerToString(frame_producer.Pass())); |
| 130 EXPECT_EQ(stream_highest, stream.get()); | 130 EXPECT_EQ(stream_highest.get(), stream.get()); |
| 131 | 131 |
| 132 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 132 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 133 EXPECT_EQ(SYN_REPLY, frame_type); | 133 EXPECT_EQ(SYN_REPLY, frame_type); |
| 134 EXPECT_EQ("MEDIUM", ProducerToString(frame_producer.Pass())); | 134 EXPECT_EQ("MEDIUM", ProducerToString(frame_producer.Pass())); |
| 135 EXPECT_EQ(stream_medium, stream.get()); | 135 EXPECT_EQ(stream_medium.get(), stream.get()); |
| 136 | 136 |
| 137 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 137 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 138 EXPECT_EQ(SYN_STREAM, frame_type); | 138 EXPECT_EQ(SYN_STREAM, frame_type); |
| 139 EXPECT_EQ("LOW", ProducerToString(frame_producer.Pass())); | 139 EXPECT_EQ("LOW", ProducerToString(frame_producer.Pass())); |
| 140 EXPECT_EQ(NULL, stream.get()); | 140 EXPECT_EQ(nullptr, stream.get()); |
| 141 | 141 |
| 142 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 142 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Add some frame producers with the same priority. The producers | 145 // Add some frame producers with the same priority. The producers |
| 146 // should be dequeued in FIFO order with their associated stream. | 146 // should be dequeued in FIFO order with their associated stream. |
| 147 TEST_F(SpdyWriteQueueTest, DequeuesFIFO) { | 147 TEST_F(SpdyWriteQueueTest, DequeuesFIFO) { |
| 148 SpdyWriteQueue write_queue; | 148 SpdyWriteQueue write_queue; |
| 149 | 149 |
| 150 scoped_ptr<SpdyBufferProducer> producer1 = IntToProducer(1); | 150 scoped_ptr<SpdyBufferProducer> producer1 = IntToProducer(1); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 161 stream2->GetWeakPtr()); | 161 stream2->GetWeakPtr()); |
| 162 write_queue.Enqueue(DEFAULT_PRIORITY, RST_STREAM, producer3.Pass(), | 162 write_queue.Enqueue(DEFAULT_PRIORITY, RST_STREAM, producer3.Pass(), |
| 163 stream3->GetWeakPtr()); | 163 stream3->GetWeakPtr()); |
| 164 | 164 |
| 165 SpdyFrameType frame_type = DATA; | 165 SpdyFrameType frame_type = DATA; |
| 166 scoped_ptr<SpdyBufferProducer> frame_producer; | 166 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 167 base::WeakPtr<SpdyStream> stream; | 167 base::WeakPtr<SpdyStream> stream; |
| 168 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 168 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 169 EXPECT_EQ(SYN_STREAM, frame_type); | 169 EXPECT_EQ(SYN_STREAM, frame_type); |
| 170 EXPECT_EQ(1, ProducerToInt(frame_producer.Pass())); | 170 EXPECT_EQ(1, ProducerToInt(frame_producer.Pass())); |
| 171 EXPECT_EQ(stream1, stream.get()); | 171 EXPECT_EQ(stream1.get(), stream.get()); |
| 172 | 172 |
| 173 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 173 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 174 EXPECT_EQ(SYN_REPLY, frame_type); | 174 EXPECT_EQ(SYN_REPLY, frame_type); |
| 175 EXPECT_EQ(2, ProducerToInt(frame_producer.Pass())); | 175 EXPECT_EQ(2, ProducerToInt(frame_producer.Pass())); |
| 176 EXPECT_EQ(stream2, stream.get()); | 176 EXPECT_EQ(stream2.get(), stream.get()); |
| 177 | 177 |
| 178 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 178 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 179 EXPECT_EQ(RST_STREAM, frame_type); | 179 EXPECT_EQ(RST_STREAM, frame_type); |
| 180 EXPECT_EQ(3, ProducerToInt(frame_producer.Pass())); | 180 EXPECT_EQ(3, ProducerToInt(frame_producer.Pass())); |
| 181 EXPECT_EQ(stream3, stream.get()); | 181 EXPECT_EQ(stream3.get(), stream.get()); |
| 182 | 182 |
| 183 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 183 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 184 } | 184 } |
| 185 | 185 |
| 186 // Enqueue a bunch of writes and then call | 186 // Enqueue a bunch of writes and then call |
| 187 // RemovePendingWritesForStream() on one of the streams. No dequeued | 187 // RemovePendingWritesForStream() on one of the streams. No dequeued |
| 188 // write should be for that stream. | 188 // write should be for that stream. |
| 189 TEST_F(SpdyWriteQueueTest, RemovePendingWritesForStream) { | 189 TEST_F(SpdyWriteQueueTest, RemovePendingWritesForStream) { |
| 190 SpdyWriteQueue write_queue; | 190 SpdyWriteQueue write_queue; |
| 191 | 191 |
| 192 scoped_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); | 192 scoped_ptr<SpdyStream> stream1(MakeTestStream(DEFAULT_PRIORITY)); |
| 193 scoped_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); | 193 scoped_ptr<SpdyStream> stream2(MakeTestStream(DEFAULT_PRIORITY)); |
| 194 | 194 |
| 195 for (int i = 0; i < 100; ++i) { | 195 for (int i = 0; i < 100; ++i) { |
| 196 base::WeakPtr<SpdyStream> stream = | 196 base::WeakPtr<SpdyStream> stream = |
| 197 (((i % 3) == 0) ? stream1 : stream2)->GetWeakPtr(); | 197 (((i % 3) == 0) ? stream1 : stream2)->GetWeakPtr(); |
| 198 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, IntToProducer(i), stream); | 198 write_queue.Enqueue(DEFAULT_PRIORITY, SYN_STREAM, IntToProducer(i), stream); |
| 199 } | 199 } |
| 200 | 200 |
| 201 write_queue.RemovePendingWritesForStream(stream2->GetWeakPtr()); | 201 write_queue.RemovePendingWritesForStream(stream2->GetWeakPtr()); |
| 202 | 202 |
| 203 for (int i = 0; i < 100; i += 3) { | 203 for (int i = 0; i < 100; i += 3) { |
| 204 SpdyFrameType frame_type = DATA; | 204 SpdyFrameType frame_type = DATA; |
| 205 scoped_ptr<SpdyBufferProducer> frame_producer; | 205 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 206 base::WeakPtr<SpdyStream> stream; | 206 base::WeakPtr<SpdyStream> stream; |
| 207 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 207 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 208 EXPECT_EQ(SYN_STREAM, frame_type); | 208 EXPECT_EQ(SYN_STREAM, frame_type); |
| 209 EXPECT_EQ(i, ProducerToInt(frame_producer.Pass())); | 209 EXPECT_EQ(i, ProducerToInt(frame_producer.Pass())); |
| 210 EXPECT_EQ(stream1, stream.get()); | 210 EXPECT_EQ(stream1.get(), stream.get()); |
| 211 } | 211 } |
| 212 | 212 |
| 213 SpdyFrameType frame_type = DATA; | 213 SpdyFrameType frame_type = DATA; |
| 214 scoped_ptr<SpdyBufferProducer> frame_producer; | 214 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 215 base::WeakPtr<SpdyStream> stream; | 215 base::WeakPtr<SpdyStream> stream; |
| 216 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 216 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 217 } | 217 } |
| 218 | 218 |
| 219 // Enqueue a bunch of writes and then call | 219 // Enqueue a bunch of writes and then call |
| 220 // RemovePendingWritesForStreamsAfter(). No dequeued write should be for | 220 // RemovePendingWritesForStreamsAfter(). No dequeued write should be for |
| (...skipping 23 matching lines...) Expand all Loading... |
| 244 write_queue.RemovePendingWritesForStreamsAfter(stream1->stream_id()); | 244 write_queue.RemovePendingWritesForStreamsAfter(stream1->stream_id()); |
| 245 | 245 |
| 246 for (int i = 0; i < 100; i += arraysize(streams)) { | 246 for (int i = 0; i < 100; i += arraysize(streams)) { |
| 247 SpdyFrameType frame_type = DATA; | 247 SpdyFrameType frame_type = DATA; |
| 248 scoped_ptr<SpdyBufferProducer> frame_producer; | 248 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 249 base::WeakPtr<SpdyStream> stream; | 249 base::WeakPtr<SpdyStream> stream; |
| 250 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)) | 250 ASSERT_TRUE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)) |
| 251 << "Unable to Dequeue i: " << i; | 251 << "Unable to Dequeue i: " << i; |
| 252 EXPECT_EQ(SYN_STREAM, frame_type); | 252 EXPECT_EQ(SYN_STREAM, frame_type); |
| 253 EXPECT_EQ(i, ProducerToInt(frame_producer.Pass())); | 253 EXPECT_EQ(i, ProducerToInt(frame_producer.Pass())); |
| 254 EXPECT_EQ(stream1, stream.get()); | 254 EXPECT_EQ(stream1.get(), stream.get()); |
| 255 } | 255 } |
| 256 | 256 |
| 257 SpdyFrameType frame_type = DATA; | 257 SpdyFrameType frame_type = DATA; |
| 258 scoped_ptr<SpdyBufferProducer> frame_producer; | 258 scoped_ptr<SpdyBufferProducer> frame_producer; |
| 259 base::WeakPtr<SpdyStream> stream; | 259 base::WeakPtr<SpdyStream> stream; |
| 260 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); | 260 EXPECT_FALSE(write_queue.Dequeue(&frame_type, &frame_producer, &stream)); |
| 261 } | 261 } |
| 262 | 262 |
| 263 // Enqueue a bunch of writes and then call Clear(). The write queue | 263 // Enqueue a bunch of writes and then call Clear(). The write queue |
| 264 // should clean up the memory properly, and Dequeue() should return | 264 // should clean up the memory properly, and Dequeue() should return |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 scoped_ptr<SpdyBufferProducer> producer; | 365 scoped_ptr<SpdyBufferProducer> producer; |
| 366 base::WeakPtr<SpdyStream> weak_stream; | 366 base::WeakPtr<SpdyStream> weak_stream; |
| 367 | 367 |
| 368 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); | 368 EXPECT_TRUE(queue.Dequeue(&frame_type, &producer, &weak_stream)); |
| 369 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); | 369 EXPECT_EQ(string(kRequeued), producer->ProduceBuffer()->GetRemainingData()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 } // namespace | 372 } // namespace |
| 373 | 373 |
| 374 } // namespace net | 374 } // namespace net |
| OLD | NEW |