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