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 3 // found in the LICENSE file. 4 5 #include "content/browser/byte_stream.h" 6 7 #include <deque> 8 #include <limits> 9 10 #include "base/bind.h" 11 #include "base/callback.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" 15 #include "net/base/io_buffer.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 18 namespace content { 19 namespace { 20 21 void CountCallbacks(int* counter) { 22 ++*counter; 23 } 24 25 } // namespace 26 27 class ByteStreamTest : public testing::Test { 28 public: 29 ByteStreamTest(); 30 31 // Create a new IO buffer of the given |buffer_size|. Details of the 32 // contents of the created buffer will be kept, and can be validated 33 // by ValidateIOBuffer. 34 scoped_refptr<net::IOBuffer> NewIOBuffer(size_t buffer_size) { 35 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(buffer_size)); 36 char *bufferp = buffer->data(); 37 for (size_t i = 0; i < buffer_size; i++) 38 bufferp[i] = (i + producing_seed_key_) % (1 << sizeof(char)); 39 pointer_queue_.push_back(bufferp); 40 length_queue_.push_back(buffer_size); 41 ++producing_seed_key_; 42 return buffer; 43 } 44 45 // Create an IOBuffer of the appropriate size and add it to the 46 // ByteStream, returning the result of the ByteStream::Write. 47 // Separate function to avoid duplication of buffer_size in test 48 // calls. 49 bool Write(ByteStreamWriter* byte_stream_input, size_t buffer_size) { 50 return byte_stream_input->Write(NewIOBuffer(buffer_size), buffer_size); 51 } 52 53 // Validate that we have the IOBuffer we expect. This routine must be 54 // called on buffers that were allocated from NewIOBuffer, and in the 55 // order that they were allocated. Calls to NewIOBuffer && 56 // ValidateIOBuffer may be interleaved. 57 bool ValidateIOBuffer( 58 scoped_refptr<net::IOBuffer> buffer, size_t buffer_size) { 59 char *bufferp = buffer->data(); 60 61 char *expected_ptr = pointer_queue_.front(); 62 size_t expected_length = length_queue_.front(); 63 pointer_queue_.pop_front(); 64 length_queue_.pop_front(); 65 ++consuming_seed_key_; 66 67 EXPECT_EQ(expected_ptr, bufferp); 68 if (expected_ptr != bufferp) 69 return false; 70 71 EXPECT_EQ(expected_length, buffer_size); 72 if (expected_length != buffer_size) 73 return false; 74 75 for (size_t i = 0; i < buffer_size; i++) { 76 // Already incremented, so subtract one from the key. 77 EXPECT_EQ(static_cast<int>((i + consuming_seed_key_ - 1) 78 % (1 << sizeof(char))), 79 bufferp[i]); 80 if (static_cast<int>((i + consuming_seed_key_ - 1) % 81 (1 << sizeof(char))) != bufferp[i]) { 82 return false; 83 } 84 } 85 return true; 86 } 87 88 protected: 89 base::MessageLoop message_loop_; 90 91 private: 92 int producing_seed_key_; 93 int consuming_seed_key_; 94 std::deque<char*> pointer_queue_; 95 std::deque<size_t> length_queue_; 96 }; 97 98 ByteStreamTest::ByteStreamTest() 99 : producing_seed_key_(0), 100 consuming_seed_key_(0) { } 101 102 // Confirm that filling and emptying the stream works properly, and that 103 // we get full triggers when we expect. 104 TEST_F(ByteStreamTest, ByteStream_PushBack) { 105 scoped_ptr<ByteStreamWriter> byte_stream_input; 106 scoped_ptr<ByteStreamReader> byte_stream_output; 107 CreateByteStream( 108 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 109 3 * 1024, &byte_stream_input, &byte_stream_output); 110 111 // Push a series of IO buffers on; test pushback happening and 112 // that it's advisory. 113 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 114 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 115 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 116 EXPECT_FALSE(Write(byte_stream_input.get(), 1)); 117 EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); 118 // Flush 119 byte_stream_input->Close(0); 120 EXPECT_EQ(4 * 1024U + 1U, byte_stream_input->GetTotalBufferedBytes()); 121 message_loop_.RunUntilIdle(); 122 // Data already sent to reader is also counted in. 123 EXPECT_EQ(4 * 1024U + 1U, byte_stream_input->GetTotalBufferedBytes()); 124 125 // Pull the IO buffers out; do we get the same buffers and do they 126 // have the same contents? 127 scoped_refptr<net::IOBuffer> output_io_buffer; 128 size_t output_length; 129 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 130 byte_stream_output->Read(&output_io_buffer, &output_length)); 131 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 132 133 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 134 byte_stream_output->Read(&output_io_buffer, &output_length)); 135 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 136 137 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 138 byte_stream_output->Read(&output_io_buffer, &output_length)); 139 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 140 141 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 142 byte_stream_output->Read(&output_io_buffer, &output_length)); 143 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 144 145 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 146 byte_stream_output->Read(&output_io_buffer, &output_length)); 147 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 148 149 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 150 byte_stream_output->Read(&output_io_buffer, &output_length)); 151 152 message_loop_.RunUntilIdle(); 153 // Reader now knows that all data is read out. 154 EXPECT_EQ(1024U, byte_stream_input->GetTotalBufferedBytes()); 155 } 156 157 // Confirm that Flush() method makes the writer to send written contents to 158 // the reader. 159 TEST_F(ByteStreamTest, ByteStream_Flush) { 160 scoped_ptr<ByteStreamWriter> byte_stream_input; 161 scoped_ptr<ByteStreamReader> byte_stream_output; 162 CreateByteStream( 163 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 164 1024, &byte_stream_input, &byte_stream_output); 165 166 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); 167 message_loop_.RunUntilIdle(); 168 169 scoped_refptr<net::IOBuffer> output_io_buffer; 170 size_t output_length = 0; 171 // Check that data is not sent to the reader yet. 172 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 173 byte_stream_output->Read(&output_io_buffer, &output_length)); 174 175 byte_stream_input->Flush(); 176 message_loop_.RunUntilIdle(); 177 178 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 179 byte_stream_output->Read(&output_io_buffer, &output_length)); 180 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 181 182 // Check that it's ok to Flush() an empty writer. 183 byte_stream_input->Flush(); 184 message_loop_.RunUntilIdle(); 185 186 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 187 byte_stream_output->Read(&output_io_buffer, &output_length)); 188 189 byte_stream_input->Close(0); 190 message_loop_.RunUntilIdle(); 191 192 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 193 byte_stream_output->Read(&output_io_buffer, &output_length)); 194 } 195 196 // 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 198 // objects 199 TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { 200 scoped_ptr<ByteStreamWriter> byte_stream_input; 201 scoped_ptr<ByteStreamReader> byte_stream_output; 202 CreateByteStream( 203 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 204 9 * 1024, &byte_stream_input, &byte_stream_output); 205 206 // Push a series of IO buffers on; test pushback happening and 207 // that it's advisory. 208 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 209 message_loop_.RunUntilIdle(); 210 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 211 message_loop_.RunUntilIdle(); 212 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 213 message_loop_.RunUntilIdle(); 214 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 215 message_loop_.RunUntilIdle(); 216 EXPECT_FALSE(Write(byte_stream_input.get(), 6 * 1024)); 217 message_loop_.RunUntilIdle(); 218 219 // Pull the IO buffers out; do we get the same buffers and do they 220 // have the same contents? 221 scoped_refptr<net::IOBuffer> output_io_buffer; 222 size_t output_length; 223 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 224 byte_stream_output->Read(&output_io_buffer, &output_length)); 225 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 226 227 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 228 byte_stream_output->Read(&output_io_buffer, &output_length)); 229 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 230 231 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 232 byte_stream_output->Read(&output_io_buffer, &output_length)); 233 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 234 235 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 236 byte_stream_output->Read(&output_io_buffer, &output_length)); 237 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 238 239 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 240 byte_stream_output->Read(&output_io_buffer, &output_length)); 241 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 242 243 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 244 byte_stream_output->Read(&output_io_buffer, &output_length)); 245 } 246 247 // Confirm that a Close() notification transmits in-order 248 // with data on the stream. 249 TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { 250 scoped_ptr<ByteStreamWriter> byte_stream_input; 251 scoped_ptr<ByteStreamReader> byte_stream_output; 252 253 scoped_refptr<net::IOBuffer> output_io_buffer; 254 size_t output_length; 255 256 // Empty stream, non-error case. 257 CreateByteStream( 258 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 259 3 * 1024, &byte_stream_input, &byte_stream_output); 260 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 261 byte_stream_output->Read(&output_io_buffer, &output_length)); 262 byte_stream_input->Close(0); 263 message_loop_.RunUntilIdle(); 264 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 265 byte_stream_output->Read(&output_io_buffer, &output_length)); 266 EXPECT_EQ(0, byte_stream_output->GetStatus()); 267 268 // Non-empty stream, non-error case. 269 CreateByteStream( 270 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 271 3 * 1024, &byte_stream_input, &byte_stream_output); 272 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 273 byte_stream_output->Read(&output_io_buffer, &output_length)); 274 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 275 byte_stream_input->Close(0); 276 message_loop_.RunUntilIdle(); 277 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 278 byte_stream_output->Read(&output_io_buffer, &output_length)); 279 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 280 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 281 byte_stream_output->Read(&output_io_buffer, &output_length)); 282 EXPECT_EQ(0, byte_stream_output->GetStatus()); 283 284 const int kFakeErrorCode = 22; 285 286 // Empty stream, error case. 287 CreateByteStream( 288 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 289 3 * 1024, &byte_stream_input, &byte_stream_output); 290 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 291 byte_stream_output->Read(&output_io_buffer, &output_length)); 292 byte_stream_input->Close(kFakeErrorCode); 293 message_loop_.RunUntilIdle(); 294 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 295 byte_stream_output->Read(&output_io_buffer, &output_length)); 296 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); 297 298 // Non-empty stream, error case. 299 CreateByteStream( 300 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 301 3 * 1024, &byte_stream_input, &byte_stream_output); 302 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 303 byte_stream_output->Read(&output_io_buffer, &output_length)); 304 EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 305 byte_stream_input->Close(kFakeErrorCode); 306 message_loop_.RunUntilIdle(); 307 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 308 byte_stream_output->Read(&output_io_buffer, &output_length)); 309 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 310 ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 311 byte_stream_output->Read(&output_io_buffer, &output_length)); 312 EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); 313 } 314 315 // Confirm that callbacks on the sink side are triggered when they should be. 316 TEST_F(ByteStreamTest, ByteStream_SinkCallback) { 317 scoped_refptr<base::TestSimpleTaskRunner> task_runner( 318 new base::TestSimpleTaskRunner()); 319 320 scoped_ptr<ByteStreamWriter> byte_stream_input; 321 scoped_ptr<ByteStreamReader> byte_stream_output; 322 CreateByteStream( 323 message_loop_.message_loop_proxy(), task_runner, 324 10000, &byte_stream_input, &byte_stream_output); 325 326 scoped_refptr<net::IOBuffer> output_io_buffer; 327 size_t output_length; 328 329 // 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 331 // of the interface contract. If it becomes part of the contract, the 332 // tests below should get much more precise. 333 334 // Confirm callback called when you add more than 33% of the buffer. 335 336 // Setup callback 337 int num_callbacks = 0; 338 byte_stream_output->RegisterCallback( 339 base::Bind(CountCallbacks, &num_callbacks)); 340 341 EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); 342 message_loop_.RunUntilIdle(); 343 344 EXPECT_EQ(0, num_callbacks); 345 task_runner->RunUntilIdle(); 346 EXPECT_EQ(1, num_callbacks); 347 348 // Check data and stream state. 349 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 350 byte_stream_output->Read(&output_io_buffer, &output_length)); 351 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 352 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 353 byte_stream_output->Read(&output_io_buffer, &output_length)); 354 355 // Confirm callback *isn't* called at less than 33% (by lack of 356 // unexpected call on task runner). 357 EXPECT_TRUE(Write(byte_stream_input.get(), 3000)); 358 message_loop_.RunUntilIdle(); 359 360 // This reflects an implementation artifact that data goes with callbacks, 361 // which should not be considered part of the interface guarantee. 362 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 363 byte_stream_output->Read(&output_io_buffer, &output_length)); 364 } 365 366 // Confirm that callbacks on the source side are triggered when they should 367 // be. 368 TEST_F(ByteStreamTest, ByteStream_SourceCallback) { 369 scoped_refptr<base::TestSimpleTaskRunner> task_runner( 370 new base::TestSimpleTaskRunner()); 371 372 scoped_ptr<ByteStreamWriter> byte_stream_input; 373 scoped_ptr<ByteStreamReader> byte_stream_output; 374 CreateByteStream( 375 task_runner, message_loop_.message_loop_proxy(), 376 10000, &byte_stream_input, &byte_stream_output); 377 378 scoped_refptr<net::IOBuffer> output_io_buffer; 379 size_t output_length; 380 381 // 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 383 // of the interface contract. If it becomes part of the contract, the 384 // tests below should get much more precise. 385 386 // Confirm callback called when about 33% space available, and not 387 // at other transitions. 388 389 // Add data. 390 int num_callbacks = 0; 391 byte_stream_input->RegisterCallback( 392 base::Bind(CountCallbacks, &num_callbacks)); 393 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); 394 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); 395 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); 396 397 // Allow bytes to transition (needed for message passing implementation), 398 // and get and validate the data. 399 message_loop_.RunUntilIdle(); 400 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 401 byte_stream_output->Read(&output_io_buffer, &output_length)); 402 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 403 404 // Grab data, triggering callback. Recorded on dispatch, but doesn't 405 // happen because it's caught by the mock. 406 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 407 byte_stream_output->Read(&output_io_buffer, &output_length)); 408 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 409 410 // Confirm that the callback passed to the mock does what we expect. 411 EXPECT_EQ(0, num_callbacks); 412 task_runner->RunUntilIdle(); 413 EXPECT_EQ(1, num_callbacks); 414 415 // Same drill with final buffer. 416 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 417 byte_stream_output->Read(&output_io_buffer, &output_length)); 418 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 419 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 420 byte_stream_output->Read(&output_io_buffer, &output_length)); 421 EXPECT_EQ(1, num_callbacks); 422 task_runner->RunUntilIdle(); 423 // Should have updated the internal structures but not called the 424 // callback. 425 EXPECT_EQ(1, num_callbacks); 426 } 427 428 // Confirm that racing a change to a sink callback with a post results 429 // in the new callback being called. 430 TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { 431 scoped_refptr<base::TestSimpleTaskRunner> task_runner( 432 new base::TestSimpleTaskRunner()); 433 434 scoped_ptr<ByteStreamWriter> byte_stream_input; 435 scoped_ptr<ByteStreamReader> byte_stream_output; 436 CreateByteStream( 437 message_loop_.message_loop_proxy(), task_runner, 438 10000, &byte_stream_input, &byte_stream_output); 439 440 scoped_refptr<net::IOBuffer> output_io_buffer; 441 size_t output_length; 442 base::Closure intermediate_callback; 443 444 // Record initial state. 445 int num_callbacks = 0; 446 byte_stream_output->RegisterCallback( 447 base::Bind(CountCallbacks, &num_callbacks)); 448 449 // Add data, and pass it across. 450 EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); 451 message_loop_.RunUntilIdle(); 452 453 // The task runner should have been hit, but the callback count 454 // isn't changed until we actually run the callback. 455 EXPECT_EQ(0, num_callbacks); 456 457 // If we change the callback now, the new one should be run 458 // (simulates race with post task). 459 int num_alt_callbacks = 0; 460 byte_stream_output->RegisterCallback( 461 base::Bind(CountCallbacks, &num_alt_callbacks)); 462 task_runner->RunUntilIdle(); 463 EXPECT_EQ(0, num_callbacks); 464 EXPECT_EQ(1, num_alt_callbacks); 465 466 // Final cleanup. 467 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 468 byte_stream_output->Read(&output_io_buffer, &output_length)); 469 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 470 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 471 byte_stream_output->Read(&output_io_buffer, &output_length)); 472 473 } 474 475 // Confirm that racing a change to a source callback with a post results 476 // in the new callback being called. 477 TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { 478 scoped_refptr<base::TestSimpleTaskRunner> task_runner( 479 new base::TestSimpleTaskRunner()); 480 481 scoped_ptr<ByteStreamWriter> byte_stream_input; 482 scoped_ptr<ByteStreamReader> byte_stream_output; 483 CreateByteStream( 484 task_runner, message_loop_.message_loop_proxy(), 485 10000, &byte_stream_input, &byte_stream_output); 486 487 scoped_refptr<net::IOBuffer> output_io_buffer; 488 size_t output_length; 489 base::Closure intermediate_callback; 490 491 // Setup state for test. 492 int num_callbacks = 0; 493 byte_stream_input->RegisterCallback( 494 base::Bind(CountCallbacks, &num_callbacks)); 495 EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); 496 EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); 497 EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); 498 message_loop_.RunUntilIdle(); 499 500 // Initial get should not trigger callback. 501 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 502 byte_stream_output->Read(&output_io_buffer, &output_length)); 503 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 504 message_loop_.RunUntilIdle(); 505 506 // Second get *should* trigger callback. 507 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 508 byte_stream_output->Read(&output_io_buffer, &output_length)); 509 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 510 511 // Which should do the right thing when it's run. 512 int num_alt_callbacks = 0; 513 byte_stream_input->RegisterCallback( 514 base::Bind(CountCallbacks, &num_alt_callbacks)); 515 task_runner->RunUntilIdle(); 516 EXPECT_EQ(0, num_callbacks); 517 EXPECT_EQ(1, num_alt_callbacks); 518 519 // Third get should also trigger callback. 520 EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 521 byte_stream_output->Read(&output_io_buffer, &output_length)); 522 EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 523 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 524 byte_stream_output->Read(&output_io_buffer, &output_length)); 525 } 526 527 // Confirm that callback is called on zero data transfer but source 528 // complete. 529 TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { 530 scoped_refptr<base::TestSimpleTaskRunner> task_runner( 531 new base::TestSimpleTaskRunner()); 532 533 scoped_ptr<ByteStreamWriter> byte_stream_input; 534 scoped_ptr<ByteStreamReader> byte_stream_output; 535 CreateByteStream( 536 message_loop_.message_loop_proxy(), task_runner, 537 10000, &byte_stream_input, &byte_stream_output); 538 539 base::Closure intermediate_callback; 540 541 // Record initial state. 542 int num_callbacks = 0; 543 byte_stream_output->RegisterCallback( 544 base::Bind(CountCallbacks, &num_callbacks)); 545 546 // Immediately close the stream. 547 byte_stream_input->Close(0); 548 task_runner->RunUntilIdle(); 549 EXPECT_EQ(1, num_callbacks); 550 } 551 552 TEST_F(ByteStreamTest, ByteStream_CloseWithoutAnyWrite) { 553 scoped_ptr<ByteStreamWriter> byte_stream_input; 554 scoped_ptr<ByteStreamReader> byte_stream_output; 555 CreateByteStream( 556 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 557 3 * 1024, &byte_stream_input, &byte_stream_output); 558 559 byte_stream_input->Close(0); 560 message_loop_.RunUntilIdle(); 561 562 scoped_refptr<net::IOBuffer> output_io_buffer; 563 size_t output_length; 564 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 565 byte_stream_output->Read(&output_io_buffer, &output_length)); 566 } 567 568 TEST_F(ByteStreamTest, ByteStream_FlushWithoutAnyWrite) { 569 scoped_ptr<ByteStreamWriter> byte_stream_input; 570 scoped_ptr<ByteStreamReader> byte_stream_output; 571 CreateByteStream( 572 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 573 3 * 1024, &byte_stream_input, &byte_stream_output); 574 575 byte_stream_input->Flush(); 576 message_loop_.RunUntilIdle(); 577 578 scoped_refptr<net::IOBuffer> output_io_buffer; 579 size_t output_length; 580 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 581 byte_stream_output->Read(&output_io_buffer, &output_length)); 582 583 byte_stream_input->Close(0); 584 message_loop_.RunUntilIdle(); 585 586 EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 587 byte_stream_output->Read(&output_io_buffer, &output_length)); 588 } 589 590 TEST_F(ByteStreamTest, ByteStream_WriteOverflow) { 591 scoped_ptr<ByteStreamWriter> byte_stream_input; 592 scoped_ptr<ByteStreamReader> byte_stream_output; 593 CreateByteStream( 594 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 595 std::numeric_limits<size_t>::max(), 596 &byte_stream_input, &byte_stream_output); 597 598 EXPECT_TRUE(Write(byte_stream_input.get(), 1)); 599 // 1 + size_t max -> Overflow. 600 scoped_refptr<net::IOBuffer> empty_io_buffer; 601 EXPECT_FALSE(byte_stream_input->Write(empty_io_buffer, 602 std::numeric_limits<size_t>::max())); 603 message_loop_.RunUntilIdle(); 604 605 // The first write is below PostToPeer threshold. We shouldn't get anything 606 // from the output. 607 scoped_refptr<net::IOBuffer> output_io_buffer; 608 size_t output_length; 609 EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 610 byte_stream_output->Read(&output_io_buffer, &output_length)); 611 } 612 613 } // namespace content 614