| 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 |