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