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 |