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 |