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