| Index: blimp/net/stream_packet_writer_unittest.cc
|
| diff --git a/blimp/net/stream_packet_writer_unittest.cc b/blimp/net/stream_packet_writer_unittest.cc
|
| deleted file mode 100644
|
| index 41b3d5f53414b846268e78683a3e8c071b3f27df..0000000000000000000000000000000000000000
|
| --- a/blimp/net/stream_packet_writer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,304 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <memory>
|
| -#include <string>
|
| -
|
| -#include "base/at_exit.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "blimp/net/blimp_stats.h"
|
| -#include "blimp/net/common.h"
|
| -#include "blimp/net/stream_packet_writer.h"
|
| -#include "blimp/net/test_common.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/test_completion_callback.h"
|
| -#include "net/socket/socket.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using testing::_;
|
| -using testing::DoAll;
|
| -using testing::InSequence;
|
| -using testing::Mock;
|
| -using testing::NotNull;
|
| -using testing::Return;
|
| -using testing::SaveArg;
|
| -
|
| -namespace blimp {
|
| -namespace {
|
| -
|
| -class StreamPacketWriterTest : public testing::Test {
|
| - public:
|
| - StreamPacketWriterTest()
|
| - : test_data_(
|
| - new net::DrainableIOBuffer(new net::StringIOBuffer(test_data_str_),
|
| - test_data_str_.size())),
|
| - message_writer_(&socket_) {}
|
| -
|
| - protected:
|
| - const std::string test_data_str_ = "U WOT M8";
|
| -
|
| - base::ShadowingAtExitManager at_exit_manager_;
|
| - base::MessageLoop message_loop_;
|
| - MockStreamSocket socket_;
|
| - scoped_refptr<net::DrainableIOBuffer> test_data_;
|
| - StreamPacketWriter message_writer_;
|
| - testing::InSequence mock_sequence_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(StreamPacketWriterTest);
|
| -};
|
| -
|
| -// Successful write with 1 async header write and 1 async payload write.
|
| -TEST_F(StreamPacketWriterTest, TestWriteAsync) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
|
| -
|
| - header_cb.Run(kPacketHeaderSizeBytes);
|
| - payload_cb.Run(test_data_str_.size());
|
| - EXPECT_EQ(net::OK, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Successful write with 2 async header writes and 2 async payload writes.
|
| -TEST_F(StreamPacketWriterTest, TestPartialWriteAsync) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| -
|
| - std::string header = EncodeHeader(test_data_str_.size());
|
| - std::string payload = test_data_str_;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(header), kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size())),
|
| - header.size() - 1, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)))
|
| - .RetiresOnSaturation();
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(payload.substr(1, payload.size() - 1)),
|
| - payload.size() - 1, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)))
|
| - .RetiresOnSaturation();
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| -
|
| - EXPECT_EQ(static_cast<int>(payload.size()),
|
| - BlimpStats::GetInstance()->Get(BlimpStats::BYTES_SENT));
|
| -
|
| - // Header is written - first one byte, then the remainder.
|
| - header_cb.Run(1);
|
| - header_cb.Run(header.size() - 1);
|
| -
|
| - // Payload is written - first one byte, then the remainder.
|
| - payload_cb.Run(1);
|
| - payload_cb.Run(payload.size() - 1);
|
| -
|
| - EXPECT_EQ(net::OK, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Async socket error while writing data.
|
| -TEST_F(StreamPacketWriterTest, TestWriteErrorAsync) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - header_cb.Run(kPacketHeaderSizeBytes);
|
| - payload_cb.Run(net::ERR_CONNECTION_RESET);
|
| -
|
| - EXPECT_EQ(net::ERR_CONNECTION_RESET, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Successful write with 1 sync header write and 1 sync payload write.
|
| -TEST_F(StreamPacketWriterTest, TestWriteSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(Return(kPacketHeaderSizeBytes));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(Return(test_data_str_.size()));
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - EXPECT_EQ(net::OK, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Successful write with 2 sync header writes and 2 sync payload writes.
|
| -TEST_F(StreamPacketWriterTest, TestPartialWriteSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - std::string header = EncodeHeader(test_data_str_.size());
|
| - std::string payload = test_data_str_;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(header), header.size(), _))
|
| - .WillOnce(Return(1));
|
| - EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size() - 1)),
|
| - header.size() - 1, _))
|
| - .WillOnce(Return(header.size() - 1));
|
| - EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _))
|
| - .WillOnce(Return(1));
|
| - EXPECT_CALL(socket_, Write(BufferEquals(payload.substr(1, payload.size())),
|
| - payload.size() - 1, _))
|
| - .WillOnce(Return(payload.size() - 1));
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - EXPECT_EQ(net::OK, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Sync socket error while writing header data.
|
| -TEST_F(StreamPacketWriterTest, TestWriteHeaderErrorSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(Return(net::ERR_FAILED));
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult());
|
| - EXPECT_EQ(net::ERR_EMPTY_RESPONSE,
|
| - writer_cb.GetResult(net::ERR_EMPTY_RESPONSE));
|
| - EXPECT_FALSE(writer_cb.have_result());
|
| -}
|
| -
|
| -// Sync socket error while writing payload data.
|
| -TEST_F(StreamPacketWriterTest, TestWritePayloadErrorSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(Return(kPacketHeaderSizeBytes));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(Return(net::ERR_FAILED));
|
| -
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -// Verify that asynchronous header write completions don't cause a
|
| -// use-after-free error if the writer object is deleted.
|
| -TEST_F(StreamPacketWriterTest, DeletedDuringHeaderWrite) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| - std::unique_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_));
|
| -
|
| - // Write header.
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - writer->WritePacket(test_data_, writer_cb.callback());
|
| - Mock::VerifyAndClearExpectations(&socket_);
|
| -
|
| - // Header write completion callback is invoked after the writer died.
|
| - writer.reset();
|
| - header_cb.Run(kPacketHeaderSizeBytes);
|
| -}
|
| -
|
| -// Verify that asynchronous payload write completions don't cause a
|
| -// use-after-free error if the writer object is deleted.
|
| -TEST_F(StreamPacketWriterTest, DeletedDuringPayloadWrite) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| - std::unique_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_));
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
|
| -
|
| - writer->WritePacket(test_data_, writer_cb.callback());
|
| -
|
| - // Header write completes successfully.
|
| - header_cb.Run(kPacketHeaderSizeBytes);
|
| -
|
| - // Payload write completion callback is invoked after the writer died.
|
| - writer.reset();
|
| - payload_cb.Run(test_data_str_.size());
|
| -}
|
| -
|
| -TEST_F(StreamPacketWriterTest, TestWriteHeaderEOFSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(Return(net::OK));
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| -
|
| - EXPECT_EQ(net::ERR_CONNECTION_CLOSED, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(StreamPacketWriterTest, TestWritePayloadEOFSync) {
|
| - net::TestCompletionCallback writer_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(Return(kPacketHeaderSizeBytes));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(Return(0));
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| -
|
| - EXPECT_EQ(net::ERR_CONNECTION_CLOSED, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(StreamPacketWriterTest, TestWriteHeaderEOFAsync) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - header_cb.Run(0);
|
| -
|
| - EXPECT_EQ(net::ERR_CONNECTION_CLOSED, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -TEST_F(StreamPacketWriterTest, TestWritePayloadEOFAsync) {
|
| - net::TestCompletionCallback writer_cb;
|
| - net::CompletionCallback header_cb;
|
| - net::CompletionCallback payload_cb;
|
| -
|
| - EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
|
| - kPacketHeaderSizeBytes, _))
|
| - .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
|
| - EXPECT_CALL(socket_,
|
| - Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
|
| - .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
|
| - message_writer_.WritePacket(test_data_, writer_cb.callback());
|
| - header_cb.Run(kPacketHeaderSizeBytes);
|
| - payload_cb.Run(0);
|
| -
|
| - EXPECT_EQ(net::ERR_CONNECTION_CLOSED, writer_cb.WaitForResult());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace blimp
|
|
|