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 "content/browser/byte_stream.h" | 5 #include "content/browser/byte_stream.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/callback.h" | 11 #include "base/callback.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/message_loop/message_loop.h" | |
14 #include "base/test/test_simple_task_runner.h" | 13 #include "base/test/test_simple_task_runner.h" |
15 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
17 | 16 |
18 namespace content { | 17 namespace content { |
19 namespace { | 18 namespace { |
20 | 19 |
21 void CountCallbacks(int* counter) { | 20 void CountCallbacks(int* counter) { |
22 ++*counter; | 21 ++*counter; |
23 } | 22 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 96 |
98 ByteStreamTest::ByteStreamTest() | 97 ByteStreamTest::ByteStreamTest() |
99 : producing_seed_key_(0), | 98 : producing_seed_key_(0), |
100 consuming_seed_key_(0) { } | 99 consuming_seed_key_(0) { } |
101 | 100 |
102 // Confirm that filling and emptying the stream works properly, and that | 101 // Confirm that filling and emptying the stream works properly, and that |
103 // we get full triggers when we expect. | 102 // we get full triggers when we expect. |
104 TEST_F(ByteStreamTest, ByteStream_PushBack) { | 103 TEST_F(ByteStreamTest, ByteStream_PushBack) { |
105 scoped_ptr<ByteStreamWriter> byte_stream_input; | 104 scoped_ptr<ByteStreamWriter> byte_stream_input; |
106 scoped_ptr<ByteStreamReader> byte_stream_output; | 105 scoped_ptr<ByteStreamReader> byte_stream_output; |
107 CreateByteStream( | 106 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
108 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 107 3 * 1024, &byte_stream_input, &byte_stream_output); |
109 3 * 1024, &byte_stream_input, &byte_stream_output); | |
110 | 108 |
111 // Push a series of IO buffers on; test pushback happening and | 109 // Push a series of IO buffers on; test pushback happening and |
112 // that it's advisory. | 110 // that it's advisory. |
113 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 111 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
114 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 112 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
115 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 113 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
116 EXPECT_FALSE(Write(byte_stream_input.get(), 1)); | 114 EXPECT_FALSE(Write(byte_stream_input.get(), 1)); |
117 EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); | 115 EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); |
118 // Flush | 116 // Flush |
119 byte_stream_input->Close(0); | 117 byte_stream_input->Close(0); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 message_loop_.RunUntilIdle(); | 150 message_loop_.RunUntilIdle(); |
153 // Reader now knows that all data is read out. | 151 // Reader now knows that all data is read out. |
154 EXPECT_EQ(1024U, byte_stream_input->GetTotalBufferedBytes()); | 152 EXPECT_EQ(1024U, byte_stream_input->GetTotalBufferedBytes()); |
155 } | 153 } |
156 | 154 |
157 // Confirm that Flush() method makes the writer to send written contents to | 155 // Confirm that Flush() method makes the writer to send written contents to |
158 // the reader. | 156 // the reader. |
159 TEST_F(ByteStreamTest, ByteStream_Flush) { | 157 TEST_F(ByteStreamTest, ByteStream_Flush) { |
160 scoped_ptr<ByteStreamWriter> byte_stream_input; | 158 scoped_ptr<ByteStreamWriter> byte_stream_input; |
161 scoped_ptr<ByteStreamReader> byte_stream_output; | 159 scoped_ptr<ByteStreamReader> byte_stream_output; |
162 CreateByteStream( | 160 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
163 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 161 1024, &byte_stream_input, &byte_stream_output); |
164 1024, &byte_stream_input, &byte_stream_output); | |
165 | 162 |
166 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); | 163 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); |
167 message_loop_.RunUntilIdle(); | 164 message_loop_.RunUntilIdle(); |
168 | 165 |
169 scoped_refptr<net::IOBuffer> output_io_buffer; | 166 scoped_refptr<net::IOBuffer> output_io_buffer; |
170 size_t output_length = 0; | 167 size_t output_length = 0; |
171 // Check that data is not sent to the reader yet. | 168 // Check that data is not sent to the reader yet. |
172 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 169 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
173 byte_stream_output->Read(&output_io_buffer, &output_length)); | 170 byte_stream_output->Read(&output_io_buffer, &output_length)); |
174 | 171 |
(...skipping 17 matching lines...) Expand all Loading... |
192 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, | 189 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, |
193 byte_stream_output->Read(&output_io_buffer, &output_length)); | 190 byte_stream_output->Read(&output_io_buffer, &output_length)); |
194 } | 191 } |
195 | 192 |
196 // Same as above, only use knowledge of the internals to confirm | 193 // Same as above, only use knowledge of the internals to confirm |
197 // that we're getting pushback even when data's split across the two | 194 // that we're getting pushback even when data's split across the two |
198 // objects | 195 // objects |
199 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { | 196 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { |
200 scoped_ptr<ByteStreamWriter> byte_stream_input; | 197 scoped_ptr<ByteStreamWriter> byte_stream_input; |
201 scoped_ptr<ByteStreamReader> byte_stream_output; | 198 scoped_ptr<ByteStreamReader> byte_stream_output; |
202 CreateByteStream( | 199 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
203 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 200 9 * 1024, &byte_stream_input, &byte_stream_output); |
204 9 * 1024, &byte_stream_input, &byte_stream_output); | |
205 | 201 |
206 // Push a series of IO buffers on; test pushback happening and | 202 // Push a series of IO buffers on; test pushback happening and |
207 // that it's advisory. | 203 // that it's advisory. |
208 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 204 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
209 message_loop_.RunUntilIdle(); | 205 message_loop_.RunUntilIdle(); |
210 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 206 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
211 message_loop_.RunUntilIdle(); | 207 message_loop_.RunUntilIdle(); |
212 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 208 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
213 message_loop_.RunUntilIdle(); | 209 message_loop_.RunUntilIdle(); |
214 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 210 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 // Confirm that a Close() notification transmits in-order | 243 // Confirm that a Close() notification transmits in-order |
248 // with data on the stream. | 244 // with data on the stream. |
249 TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { | 245 TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { |
250 scoped_ptr<ByteStreamWriter> byte_stream_input; | 246 scoped_ptr<ByteStreamWriter> byte_stream_input; |
251 scoped_ptr<ByteStreamReader> byte_stream_output; | 247 scoped_ptr<ByteStreamReader> byte_stream_output; |
252 | 248 |
253 scoped_refptr<net::IOBuffer> output_io_buffer; | 249 scoped_refptr<net::IOBuffer> output_io_buffer; |
254 size_t output_length; | 250 size_t output_length; |
255 | 251 |
256 // Empty stream, non-error case. | 252 // Empty stream, non-error case. |
257 CreateByteStream( | 253 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
258 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 254 3 * 1024, &byte_stream_input, &byte_stream_output); |
259 3 * 1024, &byte_stream_input, &byte_stream_output); | |
260 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 255 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
261 byte_stream_output->Read(&output_io_buffer, &output_length)); | 256 byte_stream_output->Read(&output_io_buffer, &output_length)); |
262 byte_stream_input->Close(0); | 257 byte_stream_input->Close(0); |
263 message_loop_.RunUntilIdle(); | 258 message_loop_.RunUntilIdle(); |
264 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 259 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, |
265 byte_stream_output->Read(&output_io_buffer, &output_length)); | 260 byte_stream_output->Read(&output_io_buffer, &output_length)); |
266 EXPECT_EQ(0, byte_stream_output->GetStatus()); | 261 EXPECT_EQ(0, byte_stream_output->GetStatus()); |
267 | 262 |
268 // Non-empty stream, non-error case. | 263 // Non-empty stream, non-error case. |
269 CreateByteStream( | 264 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
270 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 265 3 * 1024, &byte_stream_input, &byte_stream_output); |
271 3 * 1024, &byte_stream_input, &byte_stream_output); | |
272 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 266 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
273 byte_stream_output->Read(&output_io_buffer, &output_length)); | 267 byte_stream_output->Read(&output_io_buffer, &output_length)); |
274 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 268 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
275 byte_stream_input->Close(0); | 269 byte_stream_input->Close(0); |
276 message_loop_.RunUntilIdle(); | 270 message_loop_.RunUntilIdle(); |
277 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 271 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, |
278 byte_stream_output->Read(&output_io_buffer, &output_length)); | 272 byte_stream_output->Read(&output_io_buffer, &output_length)); |
279 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 273 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
280 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 274 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, |
281 byte_stream_output->Read(&output_io_buffer, &output_length)); | 275 byte_stream_output->Read(&output_io_buffer, &output_length)); |
282 EXPECT_EQ(0, byte_stream_output->GetStatus()); | 276 EXPECT_EQ(0, byte_stream_output->GetStatus()); |
283 | 277 |
284 const int kFakeErrorCode = 22; | 278 const int kFakeErrorCode = 22; |
285 | 279 |
286 // Empty stream, error case. | 280 // Empty stream, error case. |
287 CreateByteStream( | 281 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
288 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 282 3 * 1024, &byte_stream_input, &byte_stream_output); |
289 3 * 1024, &byte_stream_input, &byte_stream_output); | |
290 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 283 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
291 byte_stream_output->Read(&output_io_buffer, &output_length)); | 284 byte_stream_output->Read(&output_io_buffer, &output_length)); |
292 byte_stream_input->Close(kFakeErrorCode); | 285 byte_stream_input->Close(kFakeErrorCode); |
293 message_loop_.RunUntilIdle(); | 286 message_loop_.RunUntilIdle(); |
294 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 287 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, |
295 byte_stream_output->Read(&output_io_buffer, &output_length)); | 288 byte_stream_output->Read(&output_io_buffer, &output_length)); |
296 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); | 289 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); |
297 | 290 |
298 // Non-empty stream, error case. | 291 // Non-empty stream, error case. |
299 CreateByteStream( | 292 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
300 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 293 3 * 1024, &byte_stream_input, &byte_stream_output); |
301 3 * 1024, &byte_stream_input, &byte_stream_output); | |
302 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 294 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
303 byte_stream_output->Read(&output_io_buffer, &output_length)); | 295 byte_stream_output->Read(&output_io_buffer, &output_length)); |
304 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); | 296 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); |
305 byte_stream_input->Close(kFakeErrorCode); | 297 byte_stream_input->Close(kFakeErrorCode); |
306 message_loop_.RunUntilIdle(); | 298 message_loop_.RunUntilIdle(); |
307 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, | 299 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, |
308 byte_stream_output->Read(&output_io_buffer, &output_length)); | 300 byte_stream_output->Read(&output_io_buffer, &output_length)); |
309 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); | 301 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); |
310 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, | 302 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, |
311 byte_stream_output->Read(&output_io_buffer, &output_length)); | 303 byte_stream_output->Read(&output_io_buffer, &output_length)); |
312 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); | 304 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); |
313 } | 305 } |
314 | 306 |
315 // Confirm that callbacks on the sink side are triggered when they should be. | 307 // Confirm that callbacks on the sink side are triggered when they should be. |
316 TEST_F(ByteStreamTest, ByteStream_SinkCallback) { | 308 TEST_F(ByteStreamTest, ByteStream_SinkCallback) { |
317 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 309 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
318 new base::TestSimpleTaskRunner()); | 310 new base::TestSimpleTaskRunner()); |
319 | 311 |
320 scoped_ptr<ByteStreamWriter> byte_stream_input; | 312 scoped_ptr<ByteStreamWriter> byte_stream_input; |
321 scoped_ptr<ByteStreamReader> byte_stream_output; | 313 scoped_ptr<ByteStreamReader> byte_stream_output; |
322 CreateByteStream( | 314 CreateByteStream(message_loop_.task_runner(), task_runner, 10000, |
323 message_loop_.message_loop_proxy(), task_runner, | 315 &byte_stream_input, &byte_stream_output); |
324 10000, &byte_stream_input, &byte_stream_output); | |
325 | 316 |
326 scoped_refptr<net::IOBuffer> output_io_buffer; | 317 scoped_refptr<net::IOBuffer> output_io_buffer; |
327 size_t output_length; | 318 size_t output_length; |
328 | 319 |
329 // Note that the specifics of when the callbacks are called with regard | 320 // Note that the specifics of when the callbacks are called with regard |
330 // to how much data is pushed onto the stream is not (currently) part | 321 // to how much data is pushed onto the stream is not (currently) part |
331 // of the interface contract. If it becomes part of the contract, the | 322 // of the interface contract. If it becomes part of the contract, the |
332 // tests below should get much more precise. | 323 // tests below should get much more precise. |
333 | 324 |
334 // Confirm callback called when you add more than 33% of the buffer. | 325 // Confirm callback called when you add more than 33% of the buffer. |
(...skipping 29 matching lines...) Expand all Loading... |
364 } | 355 } |
365 | 356 |
366 // Confirm that callbacks on the source side are triggered when they should | 357 // Confirm that callbacks on the source side are triggered when they should |
367 // be. | 358 // be. |
368 TEST_F(ByteStreamTest, ByteStream_SourceCallback) { | 359 TEST_F(ByteStreamTest, ByteStream_SourceCallback) { |
369 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 360 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
370 new base::TestSimpleTaskRunner()); | 361 new base::TestSimpleTaskRunner()); |
371 | 362 |
372 scoped_ptr<ByteStreamWriter> byte_stream_input; | 363 scoped_ptr<ByteStreamWriter> byte_stream_input; |
373 scoped_ptr<ByteStreamReader> byte_stream_output; | 364 scoped_ptr<ByteStreamReader> byte_stream_output; |
374 CreateByteStream( | 365 CreateByteStream(task_runner, message_loop_.task_runner(), 10000, |
375 task_runner, message_loop_.message_loop_proxy(), | 366 &byte_stream_input, &byte_stream_output); |
376 10000, &byte_stream_input, &byte_stream_output); | |
377 | 367 |
378 scoped_refptr<net::IOBuffer> output_io_buffer; | 368 scoped_refptr<net::IOBuffer> output_io_buffer; |
379 size_t output_length; | 369 size_t output_length; |
380 | 370 |
381 // Note that the specifics of when the callbacks are called with regard | 371 // Note that the specifics of when the callbacks are called with regard |
382 // to how much data is pulled from the stream is not (currently) part | 372 // to how much data is pulled from the stream is not (currently) part |
383 // of the interface contract. If it becomes part of the contract, the | 373 // of the interface contract. If it becomes part of the contract, the |
384 // tests below should get much more precise. | 374 // tests below should get much more precise. |
385 | 375 |
386 // Confirm callback called when about 33% space available, and not | 376 // Confirm callback called when about 33% space available, and not |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 } | 416 } |
427 | 417 |
428 // Confirm that racing a change to a sink callback with a post results | 418 // Confirm that racing a change to a sink callback with a post results |
429 // in the new callback being called. | 419 // in the new callback being called. |
430 TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { | 420 TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { |
431 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 421 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
432 new base::TestSimpleTaskRunner()); | 422 new base::TestSimpleTaskRunner()); |
433 | 423 |
434 scoped_ptr<ByteStreamWriter> byte_stream_input; | 424 scoped_ptr<ByteStreamWriter> byte_stream_input; |
435 scoped_ptr<ByteStreamReader> byte_stream_output; | 425 scoped_ptr<ByteStreamReader> byte_stream_output; |
436 CreateByteStream( | 426 CreateByteStream(message_loop_.task_runner(), task_runner, 10000, |
437 message_loop_.message_loop_proxy(), task_runner, | 427 &byte_stream_input, &byte_stream_output); |
438 10000, &byte_stream_input, &byte_stream_output); | |
439 | 428 |
440 scoped_refptr<net::IOBuffer> output_io_buffer; | 429 scoped_refptr<net::IOBuffer> output_io_buffer; |
441 size_t output_length; | 430 size_t output_length; |
442 base::Closure intermediate_callback; | 431 base::Closure intermediate_callback; |
443 | 432 |
444 // Record initial state. | 433 // Record initial state. |
445 int num_callbacks = 0; | 434 int num_callbacks = 0; |
446 byte_stream_output->RegisterCallback( | 435 byte_stream_output->RegisterCallback( |
447 base::Bind(CountCallbacks, &num_callbacks)); | 436 base::Bind(CountCallbacks, &num_callbacks)); |
448 | 437 |
(...skipping 24 matching lines...) Expand all Loading... |
473 } | 462 } |
474 | 463 |
475 // Confirm that racing a change to a source callback with a post results | 464 // Confirm that racing a change to a source callback with a post results |
476 // in the new callback being called. | 465 // in the new callback being called. |
477 TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { | 466 TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { |
478 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 467 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
479 new base::TestSimpleTaskRunner()); | 468 new base::TestSimpleTaskRunner()); |
480 | 469 |
481 scoped_ptr<ByteStreamWriter> byte_stream_input; | 470 scoped_ptr<ByteStreamWriter> byte_stream_input; |
482 scoped_ptr<ByteStreamReader> byte_stream_output; | 471 scoped_ptr<ByteStreamReader> byte_stream_output; |
483 CreateByteStream( | 472 CreateByteStream(task_runner, message_loop_.task_runner(), 10000, |
484 task_runner, message_loop_.message_loop_proxy(), | 473 &byte_stream_input, &byte_stream_output); |
485 10000, &byte_stream_input, &byte_stream_output); | |
486 | 474 |
487 scoped_refptr<net::IOBuffer> output_io_buffer; | 475 scoped_refptr<net::IOBuffer> output_io_buffer; |
488 size_t output_length; | 476 size_t output_length; |
489 base::Closure intermediate_callback; | 477 base::Closure intermediate_callback; |
490 | 478 |
491 // Setup state for test. | 479 // Setup state for test. |
492 int num_callbacks = 0; | 480 int num_callbacks = 0; |
493 byte_stream_input->RegisterCallback( | 481 byte_stream_input->RegisterCallback( |
494 base::Bind(CountCallbacks, &num_callbacks)); | 482 base::Bind(CountCallbacks, &num_callbacks)); |
495 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); | 483 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); |
(...skipping 29 matching lines...) Expand all Loading... |
525 } | 513 } |
526 | 514 |
527 // Confirm that callback is called on zero data transfer but source | 515 // Confirm that callback is called on zero data transfer but source |
528 // complete. | 516 // complete. |
529 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { | 517 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { |
530 scoped_refptr<base::TestSimpleTaskRunner> task_runner( | 518 scoped_refptr<base::TestSimpleTaskRunner> task_runner( |
531 new base::TestSimpleTaskRunner()); | 519 new base::TestSimpleTaskRunner()); |
532 | 520 |
533 scoped_ptr<ByteStreamWriter> byte_stream_input; | 521 scoped_ptr<ByteStreamWriter> byte_stream_input; |
534 scoped_ptr<ByteStreamReader> byte_stream_output; | 522 scoped_ptr<ByteStreamReader> byte_stream_output; |
535 CreateByteStream( | 523 CreateByteStream(message_loop_.task_runner(), task_runner, 10000, |
536 message_loop_.message_loop_proxy(), task_runner, | 524 &byte_stream_input, &byte_stream_output); |
537 10000, &byte_stream_input, &byte_stream_output); | |
538 | 525 |
539 base::Closure intermediate_callback; | 526 base::Closure intermediate_callback; |
540 | 527 |
541 // Record initial state. | 528 // Record initial state. |
542 int num_callbacks = 0; | 529 int num_callbacks = 0; |
543 byte_stream_output->RegisterCallback( | 530 byte_stream_output->RegisterCallback( |
544 base::Bind(CountCallbacks, &num_callbacks)); | 531 base::Bind(CountCallbacks, &num_callbacks)); |
545 | 532 |
546 // Immediately close the stream. | 533 // Immediately close the stream. |
547 byte_stream_input->Close(0); | 534 byte_stream_input->Close(0); |
548 task_runner->RunUntilIdle(); | 535 task_runner->RunUntilIdle(); |
549 EXPECT_EQ(1, num_callbacks); | 536 EXPECT_EQ(1, num_callbacks); |
550 } | 537 } |
551 | 538 |
552 TEST_F(ByteStreamTest, ByteStream_CloseWithoutAnyWrite) { | 539 TEST_F(ByteStreamTest, ByteStream_CloseWithoutAnyWrite) { |
553 scoped_ptr<ByteStreamWriter> byte_stream_input; | 540 scoped_ptr<ByteStreamWriter> byte_stream_input; |
554 scoped_ptr<ByteStreamReader> byte_stream_output; | 541 scoped_ptr<ByteStreamReader> byte_stream_output; |
555 CreateByteStream( | 542 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
556 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 543 3 * 1024, &byte_stream_input, &byte_stream_output); |
557 3 * 1024, &byte_stream_input, &byte_stream_output); | |
558 | 544 |
559 byte_stream_input->Close(0); | 545 byte_stream_input->Close(0); |
560 message_loop_.RunUntilIdle(); | 546 message_loop_.RunUntilIdle(); |
561 | 547 |
562 scoped_refptr<net::IOBuffer> output_io_buffer; | 548 scoped_refptr<net::IOBuffer> output_io_buffer; |
563 size_t output_length; | 549 size_t output_length; |
564 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, | 550 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, |
565 byte_stream_output->Read(&output_io_buffer, &output_length)); | 551 byte_stream_output->Read(&output_io_buffer, &output_length)); |
566 } | 552 } |
567 | 553 |
568 TEST_F(ByteStreamTest, ByteStream_FlushWithoutAnyWrite) { | 554 TEST_F(ByteStreamTest, ByteStream_FlushWithoutAnyWrite) { |
569 scoped_ptr<ByteStreamWriter> byte_stream_input; | 555 scoped_ptr<ByteStreamWriter> byte_stream_input; |
570 scoped_ptr<ByteStreamReader> byte_stream_output; | 556 scoped_ptr<ByteStreamReader> byte_stream_output; |
571 CreateByteStream( | 557 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
572 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 558 3 * 1024, &byte_stream_input, &byte_stream_output); |
573 3 * 1024, &byte_stream_input, &byte_stream_output); | |
574 | 559 |
575 byte_stream_input->Flush(); | 560 byte_stream_input->Flush(); |
576 message_loop_.RunUntilIdle(); | 561 message_loop_.RunUntilIdle(); |
577 | 562 |
578 scoped_refptr<net::IOBuffer> output_io_buffer; | 563 scoped_refptr<net::IOBuffer> output_io_buffer; |
579 size_t output_length; | 564 size_t output_length; |
580 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 565 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
581 byte_stream_output->Read(&output_io_buffer, &output_length)); | 566 byte_stream_output->Read(&output_io_buffer, &output_length)); |
582 | 567 |
583 byte_stream_input->Close(0); | 568 byte_stream_input->Close(0); |
584 message_loop_.RunUntilIdle(); | 569 message_loop_.RunUntilIdle(); |
585 | 570 |
586 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, | 571 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, |
587 byte_stream_output->Read(&output_io_buffer, &output_length)); | 572 byte_stream_output->Read(&output_io_buffer, &output_length)); |
588 } | 573 } |
589 | 574 |
590 TEST_F(ByteStreamTest, ByteStream_WriteOverflow) { | 575 TEST_F(ByteStreamTest, ByteStream_WriteOverflow) { |
591 scoped_ptr<ByteStreamWriter> byte_stream_input; | 576 scoped_ptr<ByteStreamWriter> byte_stream_input; |
592 scoped_ptr<ByteStreamReader> byte_stream_output; | 577 scoped_ptr<ByteStreamReader> byte_stream_output; |
593 CreateByteStream( | 578 CreateByteStream(message_loop_.task_runner(), message_loop_.task_runner(), |
594 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 579 std::numeric_limits<size_t>::max(), &byte_stream_input, |
595 std::numeric_limits<size_t>::max(), | 580 &byte_stream_output); |
596 &byte_stream_input, &byte_stream_output); | |
597 | 581 |
598 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); | 582 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); |
599 // 1 + size_t max -> Overflow. | 583 // 1 + size_t max -> Overflow. |
600 scoped_refptr<net::IOBuffer> empty_io_buffer; | 584 scoped_refptr<net::IOBuffer> empty_io_buffer; |
601 EXPECT_FALSE(byte_stream_input->Write(empty_io_buffer, | 585 EXPECT_FALSE(byte_stream_input->Write(empty_io_buffer, |
602 std::numeric_limits<size_t>::max())); | 586 std::numeric_limits<size_t>::max())); |
603 message_loop_.RunUntilIdle(); | 587 message_loop_.RunUntilIdle(); |
604 | 588 |
605 // The first write is below PostToPeer threshold. We shouldn't get anything | 589 // The first write is below PostToPeer threshold. We shouldn't get anything |
606 // from the output. | 590 // from the output. |
607 scoped_refptr<net::IOBuffer> output_io_buffer; | 591 scoped_refptr<net::IOBuffer> output_io_buffer; |
608 size_t output_length; | 592 size_t output_length; |
609 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, | 593 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, |
610 byte_stream_output->Read(&output_io_buffer, &output_length)); | 594 byte_stream_output->Read(&output_io_buffer, &output_length)); |
611 } | 595 } |
612 | 596 |
613 } // namespace content | 597 } // namespace content |
OLD | NEW |