15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/byte_stream.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <limits> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_simple_task_runner.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CountCallbacks(int* counter) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++*counter; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteStreamTest : public testing::Test { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ByteStreamTest(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new IO buffer of the given |buffer_size|. Details of the 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contents of the created buffer will be kept, and can be validated 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by ValidateIOBuffer. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> NewIOBuffer(size_t buffer_size) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(buffer_size)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *bufferp = buffer->data(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < buffer_size; i++) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bufferp[i] = (i + producing_seed_key_) % (1 << sizeof(char)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer_queue_.push_back(bufferp); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length_queue_.push_back(buffer_size); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++producing_seed_key_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an IOBuffer of the appropriate size and add it to the 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ByteStream, returning the result of the ByteStream::Write. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Separate function to avoid duplication of buffer_size in test 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Write(ByteStreamWriter* byte_stream_input, size_t buffer_size) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return byte_stream_input->Write(NewIOBuffer(buffer_size), buffer_size); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate that we have the IOBuffer we expect. This routine must be 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called on buffers that were allocated from NewIOBuffer, and in the 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // order that they were allocated. Calls to NewIOBuffer && 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ValidateIOBuffer may be interleaved. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ValidateIOBuffer( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer, size_t buffer_size) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *bufferp = buffer->data(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *expected_ptr = pointer_queue_.front(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t expected_length = length_queue_.front(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer_queue_.pop_front(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length_queue_.pop_front(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++consuming_seed_key_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_ptr, bufferp); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_ptr != bufferp) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_length, buffer_size); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected_length != buffer_size) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < buffer_size; i++) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Already incremented, so subtract one from the key. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>((i + consuming_seed_key_ - 1) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) % (1 << sizeof(char))), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bufferp[i]); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<int>((i + consuming_seed_key_ - 1) % 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (1 << sizeof(char))) != bufferp[i]) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int producing_seed_key_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int consuming_seed_key_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<char*> pointer_queue_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<size_t> length_queue_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ByteStreamTest::ByteStreamTest() 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : producing_seed_key_(0), 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consuming_seed_key_(0) { } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that filling and emptying the stream works properly, and that 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we get full triggers when we expect. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_PushBack) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * 1024, &byte_stream_input, &byte_stream_output); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push a series of IO buffers on; test pushback happening and 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's advisory. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Write(byte_stream_input.get(), 1)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Write(byte_stream_input.get(), 1024)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flush 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(0); 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(4 * 1024U + 1U, byte_stream_input->GetTotalBufferedBytes()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Data already sent to reader is also counted in. 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(4 * 1024U + 1U, byte_stream_input->GetTotalBufferedBytes()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pull the IO buffers out; do we get the same buffers and do they 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the same contents? 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) message_loop_.RunUntilIdle(); 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Reader now knows that all data is read out. 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1024U, byte_stream_input->GetTotalBufferedBytes()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Confirm that Flush() method makes the writer to send written contents to 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the reader. 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_Flush) { 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CreateByteStream( 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1024, &byte_stream_input, &byte_stream_output); 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1)); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t output_length = 0; 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check that data is not sent to the reader yet. 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Flush(); 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check that it's ok to Flush() an empty writer. 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Flush(); 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(0); 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) message_loop_.RunUntilIdle(); 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as above, only use knowledge of the internals to confirm 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that we're getting pushback even when data's split across the two 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// objects 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_PushBackSplit) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9 * 1024, &byte_stream_input, &byte_stream_output); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Push a series of IO buffers on; test pushback happening and 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's advisory. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Write(byte_stream_input.get(), 6 * 1024)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pull the IO buffers out; do we get the same buffers and do they 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the same contents? 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that a Close() notification transmits in-order 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with data on the stream. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_CompleteTransmits) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty stream, non-error case. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * 1024, &byte_stream_input, &byte_stream_output); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(0); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, byte_stream_output->GetStatus()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-empty stream, non-error case. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * 1024, &byte_stream_input, &byte_stream_output); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(0); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, byte_stream_output->GetStatus()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const int kFakeErrorCode = 22; 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Empty stream, error case. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * 1024, &byte_stream_input, &byte_stream_output); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(kFakeErrorCode); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Non-empty stream, error case. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * 1024, &byte_stream_input, &byte_stream_output); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1024)); 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(kFakeErrorCode); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ByteStreamReader::STREAM_COMPLETE, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(kFakeErrorCode, byte_stream_output->GetStatus()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that callbacks on the sink side are triggered when they should be. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_SinkCallback) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner( 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::TestSimpleTaskRunner()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), task_runner, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, &byte_stream_input, &byte_stream_output); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the specifics of when the callbacks are called with regard 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to how much data is pushed onto the stream is not (currently) part 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the interface contract. If it becomes part of the contract, the 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tests below should get much more precise. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm callback called when you add more than 33% of the buffer. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup callback 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_callbacks = 0; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->RegisterCallback( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_callbacks)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_callbacks); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_callbacks); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check data and stream state. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm callback *isn't* called at less than 33% (by lack of 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unexpected call on task runner). 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 3000)); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This reflects an implementation artifact that data goes with callbacks, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which should not be considered part of the interface guarantee. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that callbacks on the source side are triggered when they should 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_SourceCallback) { 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner( 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::TestSimpleTaskRunner()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_runner, message_loop_.message_loop_proxy(), 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, &byte_stream_input, &byte_stream_output); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the specifics of when the callbacks are called with regard 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to how much data is pulled from the stream is not (currently) part 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the interface contract. If it becomes part of the contract, the 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tests below should get much more precise. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm callback called when about 33% space available, and not 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at other transitions. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add data. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_callbacks = 0; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_input->RegisterCallback( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_callbacks)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow bytes to transition (needed for message passing implementation), 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and get and validate the data. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Grab data, triggering callback. Recorded on dispatch, but doesn't 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happen because it's caught by the mock. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Confirm that the callback passed to the mock does what we expect. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_callbacks); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_callbacks); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same drill with final buffer. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_callbacks); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should have updated the internal structures but not called the 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_callbacks); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that racing a change to a sink callback with a post results 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the new callback being called. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_SinkInterrupt) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner( 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::TestSimpleTaskRunner()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), task_runner, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, &byte_stream_input, &byte_stream_output); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure intermediate_callback; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Record initial state. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_callbacks = 0; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->RegisterCallback( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_callbacks)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add data, and pass it across. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 4000)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The task runner should have been hit, but the callback count 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // isn't changed until we actually run the callback. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_callbacks); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we change the callback now, the new one should be run 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (simulates race with post task). 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_alt_callbacks = 0; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->RegisterCallback( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_alt_callbacks)); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_callbacks); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_alt_callbacks); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Final cleanup. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that racing a change to a source callback with a post results 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the new callback being called. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_SourceInterrupt) { 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner( 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::TestSimpleTaskRunner()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_runner, message_loop_.message_loop_proxy(), 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, &byte_stream_input, &byte_stream_output); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t output_length; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure intermediate_callback; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Setup state for test. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_callbacks = 0; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_input->RegisterCallback( 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_callbacks)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 2000)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 2001)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(Write(byte_stream_input.get(), 6000)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initial get should not trigger callback. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Second get *should* trigger callback. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Which should do the right thing when it's run. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_alt_callbacks = 0; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_input->RegisterCallback( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_alt_callbacks)); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, num_callbacks); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_alt_callbacks); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Third get should also trigger callback. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_HAS_DATA, 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ValidateIOBuffer(output_io_buffer, output_length)); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that callback is called on zero data transfer but source 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// complete. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_ZeroCallback) { 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner( 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::TestSimpleTaskRunner()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateByteStream( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.message_loop_proxy(), task_runner, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10000, &byte_stream_input, &byte_stream_output); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure intermediate_callback; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Record initial state. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_callbacks = 0; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_stream_output->RegisterCallback( 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(CountCallbacks, &num_callbacks)); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Immediately close the stream. 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) byte_stream_input->Close(0); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->RunUntilIdle(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_callbacks); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(ByteStreamTest, ByteStream_CloseWithoutAnyWrite) { 5533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<ByteStreamWriter> byte_stream_input; 5543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<ByteStreamReader> byte_stream_output; 5553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch CreateByteStream( 5563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 5573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3 * 1024, &byte_stream_input, &byte_stream_output); 5583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_input->Close(0); 5603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch message_loop_.RunUntilIdle(); 5613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<net::IOBuffer> output_io_buffer; 5633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch size_t output_length; 5643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 5653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_output->Read(&output_io_buffer, &output_length)); 5663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 5673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(ByteStreamTest, ByteStream_FlushWithoutAnyWrite) { 5693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<ByteStreamWriter> byte_stream_input; 5703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_ptr<ByteStreamReader> byte_stream_output; 5713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch CreateByteStream( 5723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 5733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3 * 1024, &byte_stream_input, &byte_stream_output); 5743240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5753240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_input->Flush(); 5763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch message_loop_.RunUntilIdle(); 5773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch scoped_refptr<net::IOBuffer> output_io_buffer; 5793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch size_t output_length; 5803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 5813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_output->Read(&output_io_buffer, &output_length)); 5823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_input->Close(0); 5843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch message_loop_.RunUntilIdle(); 5853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch EXPECT_EQ(ByteStreamReader::STREAM_COMPLETE, 5873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch byte_stream_output->Read(&output_io_buffer, &output_length)); 5883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch} 5893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ByteStreamTest, ByteStream_WriteOverflow) { 5913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<ByteStreamWriter> byte_stream_input; 5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<ByteStreamReader> byte_stream_output; 5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CreateByteStream( 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::numeric_limits<size_t>::max(), 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &byte_stream_input, &byte_stream_output); 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(Write(byte_stream_input.get(), 1)); 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // 1 + size_t max -> Overflow. 6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<net::IOBuffer> empty_io_buffer; 6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_FALSE(byte_stream_input->Write(empty_io_buffer, 6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::numeric_limits<size_t>::max())); 6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) message_loop_.RunUntilIdle(); 6043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The first write is below PostToPeer threshold. We shouldn't get anything 6063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // from the output. 6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<net::IOBuffer> output_io_buffer; 6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t output_length; 6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(ByteStreamReader::STREAM_EMPTY, 6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) byte_stream_output->Read(&output_io_buffer, &output_length)); 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 614