1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/socket/buffered_write_stream_socket.h" 6 7 #include "base/memory/ref_counted.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/message_loop/message_loop.h" 10 #include "net/base/net_errors.h" 11 #include "net/base/net_log.h" 12 #include "net/socket/socket_test_util.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 namespace net { 16 17 namespace { 18 19 class BufferedWriteStreamSocketTest : public testing::Test { 20 public: 21 void Finish() { 22 base::MessageLoop::current()->RunUntilIdle(); 23 EXPECT_TRUE(data_->at_read_eof()); 24 EXPECT_TRUE(data_->at_write_eof()); 25 } 26 27 void Initialize(MockWrite* writes, size_t writes_count) { 28 data_.reset(new DeterministicSocketData(NULL, 0, writes, writes_count)); 29 data_->set_connect_data(MockConnect(SYNCHRONOUS, 0)); 30 if (writes_count) { 31 data_->StopAfter(writes_count); 32 } 33 DeterministicMockTCPClientSocket* wrapped_socket = 34 new DeterministicMockTCPClientSocket(net_log_.net_log(), data_.get()); 35 data_->set_delegate(wrapped_socket->AsWeakPtr()); 36 socket_.reset(new BufferedWriteStreamSocket(wrapped_socket)); 37 socket_->Connect(callback_.callback()); 38 } 39 40 void TestWrite(const char* text) { 41 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(text)); 42 EXPECT_EQ(buf->size(), 43 socket_->Write(buf.get(), buf->size(), callback_.callback())); 44 } 45 46 scoped_ptr<BufferedWriteStreamSocket> socket_; 47 scoped_ptr<DeterministicSocketData> data_; 48 BoundNetLog net_log_; 49 TestCompletionCallback callback_; 50 }; 51 52 TEST_F(BufferedWriteStreamSocketTest, SingleWrite) { 53 MockWrite writes[] = { 54 MockWrite(SYNCHRONOUS, 0, "abc"), 55 }; 56 Initialize(writes, arraysize(writes)); 57 TestWrite("abc"); 58 Finish(); 59 } 60 61 TEST_F(BufferedWriteStreamSocketTest, AsyncWrite) { 62 MockWrite writes[] = { 63 MockWrite(ASYNC, 0, "abc"), 64 }; 65 Initialize(writes, arraysize(writes)); 66 TestWrite("abc"); 67 data_->Run(); 68 Finish(); 69 } 70 71 TEST_F(BufferedWriteStreamSocketTest, TwoWritesIntoOne) { 72 MockWrite writes[] = { 73 MockWrite(SYNCHRONOUS, 0, "abcdef"), 74 }; 75 Initialize(writes, arraysize(writes)); 76 TestWrite("abc"); 77 TestWrite("def"); 78 Finish(); 79 } 80 81 TEST_F(BufferedWriteStreamSocketTest, WriteWhileBlocked) { 82 MockWrite writes[] = { 83 MockWrite(ASYNC, 0, "abc"), 84 MockWrite(ASYNC, 1, "def"), 85 MockWrite(ASYNC, 2, "ghi"), 86 }; 87 Initialize(writes, arraysize(writes)); 88 TestWrite("abc"); 89 base::MessageLoop::current()->RunUntilIdle(); 90 TestWrite("def"); 91 data_->RunFor(1); 92 TestWrite("ghi"); 93 data_->RunFor(1); 94 Finish(); 95 } 96 97 TEST_F(BufferedWriteStreamSocketTest, ContinuesPartialWrite) { 98 MockWrite writes[] = { 99 MockWrite(ASYNC, 0, "abc"), 100 MockWrite(ASYNC, 1, "def"), 101 }; 102 Initialize(writes, arraysize(writes)); 103 TestWrite("abcdef"); 104 data_->Run(); 105 Finish(); 106 } 107 108 TEST_F(BufferedWriteStreamSocketTest, TwoSeparateWrites) { 109 MockWrite writes[] = { 110 MockWrite(ASYNC, 0, "abc"), 111 MockWrite(ASYNC, 1, "def"), 112 }; 113 Initialize(writes, arraysize(writes)); 114 TestWrite("abc"); 115 data_->RunFor(1); 116 TestWrite("def"); 117 data_->RunFor(1); 118 Finish(); 119 } 120 121 } // anonymous namespace 122 123 } // namespace net 124