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 "extensions/browser/api/socket/tcp_socket.h" | 5 #include <memory> |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "extensions/browser/api/socket/tcp_socket.h" |
9 #include "net/base/address_list.h" | 9 #include "net/base/address_list.h" |
10 #include "net/base/completion_callback.h" | 10 #include "net/base/completion_callback.h" |
11 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
13 #include "net/base/rand_callback.h" | 13 #include "net/base/rand_callback.h" |
14 #include "net/socket/tcp_client_socket.h" | 14 #include "net/socket/tcp_client_socket.h" |
15 #include "net/socket/tcp_server_socket.h" | 15 #include "net/socket/tcp_server_socket.h" |
16 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
17 | 17 |
18 using testing::_; | 18 using testing::_; |
(...skipping 20 matching lines...) Expand all Loading... |
39 } | 39 } |
40 | 40 |
41 private: | 41 private: |
42 DISALLOW_COPY_AND_ASSIGN(MockTCPSocket); | 42 DISALLOW_COPY_AND_ASSIGN(MockTCPSocket); |
43 }; | 43 }; |
44 | 44 |
45 class MockTCPServerSocket : public net::TCPServerSocket { | 45 class MockTCPServerSocket : public net::TCPServerSocket { |
46 public: | 46 public: |
47 MockTCPServerSocket() : net::TCPServerSocket(NULL, net::NetLog::Source()) {} | 47 MockTCPServerSocket() : net::TCPServerSocket(NULL, net::NetLog::Source()) {} |
48 MOCK_METHOD2(Listen, int(const net::IPEndPoint& address, int backlog)); | 48 MOCK_METHOD2(Listen, int(const net::IPEndPoint& address, int backlog)); |
49 MOCK_METHOD2(Accept, int(scoped_ptr<net::StreamSocket>* socket, | 49 MOCK_METHOD2(Accept, |
50 const net::CompletionCallback& callback)); | 50 int(std::unique_ptr<net::StreamSocket>* socket, |
| 51 const net::CompletionCallback& callback)); |
51 | 52 |
52 private: | 53 private: |
53 DISALLOW_COPY_AND_ASSIGN(MockTCPServerSocket); | 54 DISALLOW_COPY_AND_ASSIGN(MockTCPServerSocket); |
54 }; | 55 }; |
55 | 56 |
56 class CompleteHandler { | 57 class CompleteHandler { |
57 public: | 58 public: |
58 CompleteHandler() {} | 59 CompleteHandler() {} |
59 MOCK_METHOD1(OnComplete, void(int result_code)); | 60 MOCK_METHOD1(OnComplete, void(int result_code)); |
60 MOCK_METHOD2(OnReadComplete, void(int result_code, | 61 MOCK_METHOD2(OnReadComplete, void(int result_code, |
61 scoped_refptr<net::IOBuffer> io_buffer)); | 62 scoped_refptr<net::IOBuffer> io_buffer)); |
62 | 63 |
63 // MOCK_METHOD cannot mock a scoped_ptr argument. | 64 // MOCK_METHOD cannot mock a scoped_ptr argument. |
64 MOCK_METHOD2(OnAcceptMock, void(int, net::TCPClientSocket*)); | 65 MOCK_METHOD2(OnAcceptMock, void(int, net::TCPClientSocket*)); |
65 void OnAccept(int count, scoped_ptr<net::TCPClientSocket> socket) { | 66 void OnAccept(int count, std::unique_ptr<net::TCPClientSocket> socket) { |
66 OnAcceptMock(count, socket.get()); | 67 OnAcceptMock(count, socket.get()); |
67 } | 68 } |
68 | 69 |
69 private: | 70 private: |
70 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 71 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
71 }; | 72 }; |
72 | 73 |
73 const std::string FAKE_ID = "abcdefghijklmnopqrst"; | 74 const std::string FAKE_ID = "abcdefghijklmnopqrst"; |
74 | 75 |
75 TEST(SocketTest, TestTCPSocketRead) { | 76 TEST(SocketTest, TestTCPSocketRead) { |
76 net::AddressList address_list; | 77 net::AddressList address_list; |
77 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 78 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 79 new MockTCPSocket(address_list)); |
78 CompleteHandler handler; | 80 CompleteHandler handler; |
79 | 81 |
80 EXPECT_CALL(*tcp_client_socket, Read(_, _, _)) | 82 EXPECT_CALL(*tcp_client_socket, Read(_, _, _)) |
81 .Times(1); | 83 .Times(1); |
82 EXPECT_CALL(handler, OnReadComplete(_, _)) | 84 EXPECT_CALL(handler, OnReadComplete(_, _)) |
83 .Times(1); | 85 .Times(1); |
84 | 86 |
85 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 87 std::unique_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
86 std::move(tcp_client_socket), FAKE_ID, true)); | 88 std::move(tcp_client_socket), FAKE_ID, true)); |
87 | 89 |
88 const int count = 512; | 90 const int count = 512; |
89 socket->Read(count, base::Bind(&CompleteHandler::OnReadComplete, | 91 socket->Read(count, base::Bind(&CompleteHandler::OnReadComplete, |
90 base::Unretained(&handler))); | 92 base::Unretained(&handler))); |
91 } | 93 } |
92 | 94 |
93 TEST(SocketTest, TestTCPSocketWrite) { | 95 TEST(SocketTest, TestTCPSocketWrite) { |
94 net::AddressList address_list; | 96 net::AddressList address_list; |
95 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 97 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 98 new MockTCPSocket(address_list)); |
96 CompleteHandler handler; | 99 CompleteHandler handler; |
97 | 100 |
98 net::CompletionCallback callback; | 101 net::CompletionCallback callback; |
99 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 102 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
100 .Times(2) | 103 .Times(2) |
101 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 104 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
102 Return(128))); | 105 Return(128))); |
103 EXPECT_CALL(handler, OnComplete(_)) | 106 EXPECT_CALL(handler, OnComplete(_)) |
104 .Times(1); | 107 .Times(1); |
105 | 108 |
106 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 109 std::unique_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
107 std::move(tcp_client_socket), FAKE_ID, true)); | 110 std::move(tcp_client_socket), FAKE_ID, true)); |
108 | 111 |
109 scoped_refptr<net::IOBufferWithSize> io_buffer( | 112 scoped_refptr<net::IOBufferWithSize> io_buffer( |
110 new net::IOBufferWithSize(256)); | 113 new net::IOBufferWithSize(256)); |
111 socket->Write(io_buffer.get(), io_buffer->size(), | 114 socket->Write(io_buffer.get(), io_buffer->size(), |
112 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); | 115 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); |
113 } | 116 } |
114 | 117 |
115 TEST(SocketTest, TestTCPSocketBlockedWrite) { | 118 TEST(SocketTest, TestTCPSocketBlockedWrite) { |
116 net::AddressList address_list; | 119 net::AddressList address_list; |
117 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 120 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 121 new MockTCPSocket(address_list)); |
118 CompleteHandler handler; | 122 CompleteHandler handler; |
119 | 123 |
120 net::CompletionCallback callback; | 124 net::CompletionCallback callback; |
121 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 125 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
122 .Times(2) | 126 .Times(2) |
123 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 127 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
124 Return(net::ERR_IO_PENDING))); | 128 Return(net::ERR_IO_PENDING))); |
125 | 129 |
126 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 130 std::unique_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
127 std::move(tcp_client_socket), FAKE_ID, true)); | 131 std::move(tcp_client_socket), FAKE_ID, true)); |
128 | 132 |
129 scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(42)); | 133 scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(42)); |
130 socket->Write(io_buffer.get(), io_buffer->size(), | 134 socket->Write(io_buffer.get(), io_buffer->size(), |
131 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); | 135 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); |
132 | 136 |
133 // Good. Original call came back unable to complete. Now pretend the socket | 137 // Good. Original call came back unable to complete. Now pretend the socket |
134 // finished, and confirm that we passed the error back. | 138 // finished, and confirm that we passed the error back. |
135 EXPECT_CALL(handler, OnComplete(42)) | 139 EXPECT_CALL(handler, OnComplete(42)) |
136 .Times(1); | 140 .Times(1); |
137 callback.Run(40); | 141 callback.Run(40); |
138 callback.Run(2); | 142 callback.Run(2); |
139 } | 143 } |
140 | 144 |
141 TEST(SocketTest, TestTCPSocketBlockedWriteReentry) { | 145 TEST(SocketTest, TestTCPSocketBlockedWriteReentry) { |
142 net::AddressList address_list; | 146 net::AddressList address_list; |
143 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 147 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 148 new MockTCPSocket(address_list)); |
144 CompleteHandler handlers[5]; | 149 CompleteHandler handlers[5]; |
145 | 150 |
146 net::CompletionCallback callback; | 151 net::CompletionCallback callback; |
147 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 152 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
148 .Times(5) | 153 .Times(5) |
149 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 154 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
150 Return(net::ERR_IO_PENDING))); | 155 Return(net::ERR_IO_PENDING))); |
151 | 156 |
152 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 157 std::unique_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
153 std::move(tcp_client_socket), FAKE_ID, true)); | 158 std::move(tcp_client_socket), FAKE_ID, true)); |
154 | 159 |
155 scoped_refptr<net::IOBufferWithSize> io_buffers[5]; | 160 scoped_refptr<net::IOBufferWithSize> io_buffers[5]; |
156 int i; | 161 int i; |
157 for (i = 0; i < 5; i++) { | 162 for (i = 0; i < 5; i++) { |
158 io_buffers[i] = new net::IOBufferWithSize(128 + i * 50); | 163 io_buffers[i] = new net::IOBufferWithSize(128 + i * 50); |
159 scoped_refptr<net::IOBufferWithSize> io_buffer1( | 164 scoped_refptr<net::IOBufferWithSize> io_buffer1( |
160 new net::IOBufferWithSize(42)); | 165 new net::IOBufferWithSize(42)); |
161 socket->Write(io_buffers[i].get(), io_buffers[i]->size(), | 166 socket->Write(io_buffers[i].get(), io_buffers[i]->size(), |
162 base::Bind(&CompleteHandler::OnComplete, | 167 base::Bind(&CompleteHandler::OnComplete, |
163 base::Unretained(&handlers[i]))); | 168 base::Unretained(&handlers[i]))); |
164 | 169 |
165 EXPECT_CALL(handlers[i], OnComplete(io_buffers[i]->size())) | 170 EXPECT_CALL(handlers[i], OnComplete(io_buffers[i]->size())) |
166 .Times(1); | 171 .Times(1); |
167 } | 172 } |
168 | 173 |
169 for (i = 0; i < 5; i++) { | 174 for (i = 0; i < 5; i++) { |
170 callback.Run(128 + i * 50); | 175 callback.Run(128 + i * 50); |
171 } | 176 } |
172 } | 177 } |
173 | 178 |
174 TEST(SocketTest, TestTCPSocketSetNoDelay) { | 179 TEST(SocketTest, TestTCPSocketSetNoDelay) { |
175 net::AddressList address_list; | 180 net::AddressList address_list; |
176 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 181 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 182 new MockTCPSocket(address_list)); |
177 | 183 |
178 bool no_delay = false; | 184 bool no_delay = false; |
179 { | 185 { |
180 testing::InSequence dummy; | 186 testing::InSequence dummy; |
181 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) | 187 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) |
182 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(true))); | 188 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(true))); |
183 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) | 189 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) |
184 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(false))); | 190 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(false))); |
185 } | 191 } |
186 | 192 |
187 scoped_ptr<TCPSocket> socket( | 193 std::unique_ptr<TCPSocket> socket( |
188 TCPSocket::CreateSocketForTesting(std::move(tcp_client_socket), FAKE_ID)); | 194 TCPSocket::CreateSocketForTesting(std::move(tcp_client_socket), FAKE_ID)); |
189 | 195 |
190 EXPECT_FALSE(no_delay); | 196 EXPECT_FALSE(no_delay); |
191 int result = socket->SetNoDelay(true); | 197 int result = socket->SetNoDelay(true); |
192 EXPECT_TRUE(result); | 198 EXPECT_TRUE(result); |
193 EXPECT_TRUE(no_delay); | 199 EXPECT_TRUE(no_delay); |
194 | 200 |
195 result = socket->SetNoDelay(false); | 201 result = socket->SetNoDelay(false); |
196 EXPECT_FALSE(result); | 202 EXPECT_FALSE(result); |
197 EXPECT_FALSE(no_delay); | 203 EXPECT_FALSE(no_delay); |
198 } | 204 } |
199 | 205 |
200 TEST(SocketTest, TestTCPSocketSetKeepAlive) { | 206 TEST(SocketTest, TestTCPSocketSetKeepAlive) { |
201 net::AddressList address_list; | 207 net::AddressList address_list; |
202 scoped_ptr<MockTCPSocket> tcp_client_socket(new MockTCPSocket(address_list)); | 208 std::unique_ptr<MockTCPSocket> tcp_client_socket( |
| 209 new MockTCPSocket(address_list)); |
203 | 210 |
204 bool enable = false; | 211 bool enable = false; |
205 int delay = 0; | 212 int delay = 0; |
206 { | 213 { |
207 testing::InSequence dummy; | 214 testing::InSequence dummy; |
208 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) | 215 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) |
209 .WillOnce(testing::DoAll(SaveArg<0>(&enable), SaveArg<1>(&delay), | 216 .WillOnce(testing::DoAll(SaveArg<0>(&enable), SaveArg<1>(&delay), |
210 Return(true))); | 217 Return(true))); |
211 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) | 218 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) |
212 .WillOnce(testing::DoAll(SaveArg<0>(&enable), SaveArg<1>(&delay), | 219 .WillOnce(testing::DoAll(SaveArg<0>(&enable), SaveArg<1>(&delay), |
213 Return(false))); | 220 Return(false))); |
214 } | 221 } |
215 | 222 |
216 scoped_ptr<TCPSocket> socket( | 223 std::unique_ptr<TCPSocket> socket( |
217 TCPSocket::CreateSocketForTesting(std::move(tcp_client_socket), FAKE_ID)); | 224 TCPSocket::CreateSocketForTesting(std::move(tcp_client_socket), FAKE_ID)); |
218 | 225 |
219 EXPECT_FALSE(enable); | 226 EXPECT_FALSE(enable); |
220 int result = socket->SetKeepAlive(true, 4500); | 227 int result = socket->SetKeepAlive(true, 4500); |
221 EXPECT_TRUE(result); | 228 EXPECT_TRUE(result); |
222 EXPECT_TRUE(enable); | 229 EXPECT_TRUE(enable); |
223 EXPECT_EQ(4500, delay); | 230 EXPECT_EQ(4500, delay); |
224 | 231 |
225 result = socket->SetKeepAlive(false, 0); | 232 result = socket->SetKeepAlive(false, 0); |
226 EXPECT_FALSE(result); | 233 EXPECT_FALSE(result); |
227 EXPECT_FALSE(enable); | 234 EXPECT_FALSE(enable); |
228 EXPECT_EQ(0, delay); | 235 EXPECT_EQ(0, delay); |
229 } | 236 } |
230 | 237 |
231 TEST(SocketTest, TestTCPServerSocketListenAccept) { | 238 TEST(SocketTest, TestTCPServerSocketListenAccept) { |
232 scoped_ptr<MockTCPServerSocket> tcp_server_socket(new MockTCPServerSocket()); | 239 std::unique_ptr<MockTCPServerSocket> tcp_server_socket( |
| 240 new MockTCPServerSocket()); |
233 CompleteHandler handler; | 241 CompleteHandler handler; |
234 | 242 |
235 EXPECT_CALL(*tcp_server_socket, Accept(_, _)).Times(1); | 243 EXPECT_CALL(*tcp_server_socket, Accept(_, _)).Times(1); |
236 EXPECT_CALL(*tcp_server_socket, Listen(_, _)).Times(1); | 244 EXPECT_CALL(*tcp_server_socket, Listen(_, _)).Times(1); |
237 | 245 |
238 scoped_ptr<TCPSocket> socket(TCPSocket::CreateServerSocketForTesting( | 246 std::unique_ptr<TCPSocket> socket(TCPSocket::CreateServerSocketForTesting( |
239 std::move(tcp_server_socket), FAKE_ID)); | 247 std::move(tcp_server_socket), FAKE_ID)); |
240 | 248 |
241 EXPECT_CALL(handler, OnAcceptMock(_, _)); | 249 EXPECT_CALL(handler, OnAcceptMock(_, _)); |
242 | 250 |
243 std::string err_msg; | 251 std::string err_msg; |
244 EXPECT_EQ(net::OK, socket->Listen("127.0.0.1", 9999, 10, &err_msg)); | 252 EXPECT_EQ(net::OK, socket->Listen("127.0.0.1", 9999, 10, &err_msg)); |
245 socket->Accept(base::Bind(&CompleteHandler::OnAccept, | 253 socket->Accept(base::Bind(&CompleteHandler::OnAccept, |
246 base::Unretained(&handler))); | 254 base::Unretained(&handler))); |
247 } | 255 } |
248 | 256 |
249 } // namespace extensions | 257 } // namespace extensions |
OLD | NEW |