| 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 "chrome/browser/extensions/api/socket/tcp_socket.h" | 5 #include "chrome/browser/extensions/api/socket/tcp_socket.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "chrome/browser/extensions/api/api_resource_event_notifier.h" | 8 #include "chrome/browser/extensions/api/api_resource_event_notifier.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" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 MOCK_METHOD2(SetKeepAlive, bool(bool enable, int delay)); | 34 MOCK_METHOD2(SetKeepAlive, bool(bool enable, int delay)); |
| 35 MOCK_METHOD1(SetNoDelay, bool(bool no_delay)); | 35 MOCK_METHOD1(SetNoDelay, bool(bool no_delay)); |
| 36 virtual bool IsConnected() const OVERRIDE { | 36 virtual bool IsConnected() const OVERRIDE { |
| 37 return true; | 37 return true; |
| 38 } | 38 } |
| 39 | 39 |
| 40 private: | 40 private: |
| 41 DISALLOW_COPY_AND_ASSIGN(MockTCPSocket); | 41 DISALLOW_COPY_AND_ASSIGN(MockTCPSocket); |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 class MockAPIResourceEventNotifier : public APIResourceEventNotifier { | 44 class MockApiResourceEventNotifier : public ApiResourceEventNotifier { |
| 45 public: | 45 public: |
| 46 MockAPIResourceEventNotifier() : APIResourceEventNotifier(NULL, NULL, | 46 MockApiResourceEventNotifier() : ApiResourceEventNotifier(NULL, NULL, |
| 47 std::string(), | 47 std::string(), |
| 48 0, GURL()) {} | 48 0, GURL()) {} |
| 49 | 49 |
| 50 MOCK_METHOD2(OnReadComplete, void(int result_code, | 50 MOCK_METHOD2(OnReadComplete, void(int result_code, |
| 51 const std::string& message)); | 51 const std::string& message)); |
| 52 MOCK_METHOD1(OnWriteComplete, void(int result_code)); | 52 MOCK_METHOD1(OnWriteComplete, void(int result_code)); |
| 53 | 53 |
| 54 protected: | 54 protected: |
| 55 virtual ~MockAPIResourceEventNotifier() {} | 55 virtual ~MockApiResourceEventNotifier() {} |
| 56 }; | 56 }; |
| 57 | 57 |
| 58 class CompleteHandler { | 58 class CompleteHandler { |
| 59 public: | 59 public: |
| 60 CompleteHandler() {} | 60 CompleteHandler() {} |
| 61 MOCK_METHOD1(OnComplete, void(int result_code)); | 61 MOCK_METHOD1(OnComplete, void(int result_code)); |
| 62 MOCK_METHOD2(OnReadComplete, void(int result_code, | 62 MOCK_METHOD2(OnReadComplete, void(int result_code, |
| 63 scoped_refptr<net::IOBuffer> io_buffer)); | 63 scoped_refptr<net::IOBuffer> io_buffer)); |
| 64 private: | 64 private: |
| 65 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 65 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 | 68 |
| 69 TEST(SocketTest, TestTCPSocketRead) { | 69 TEST(SocketTest, TestTCPSocketRead) { |
| 70 net::AddressList address_list; | 70 net::AddressList address_list; |
| 71 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 71 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 72 APIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 72 ApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 73 CompleteHandler handler; | 73 CompleteHandler handler; |
| 74 | 74 |
| 75 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 75 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 76 tcp_client_socket, notifier)); | 76 tcp_client_socket, notifier)); |
| 77 | 77 |
| 78 EXPECT_CALL(*tcp_client_socket, Read(_, _, _)) | 78 EXPECT_CALL(*tcp_client_socket, Read(_, _, _)) |
| 79 .Times(1); | 79 .Times(1); |
| 80 EXPECT_CALL(handler, OnReadComplete(_, _)) | 80 EXPECT_CALL(handler, OnReadComplete(_, _)) |
| 81 .Times(1); | 81 .Times(1); |
| 82 | 82 |
| 83 const int count = 512; | 83 const int count = 512; |
| 84 socket->Read(count, base::Bind(&CompleteHandler::OnReadComplete, | 84 socket->Read(count, base::Bind(&CompleteHandler::OnReadComplete, |
| 85 base::Unretained(&handler))); | 85 base::Unretained(&handler))); |
| 86 } | 86 } |
| 87 | 87 |
| 88 TEST(SocketTest, TestTCPSocketWrite) { | 88 TEST(SocketTest, TestTCPSocketWrite) { |
| 89 net::AddressList address_list; | 89 net::AddressList address_list; |
| 90 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 90 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 91 APIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 91 ApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 92 CompleteHandler handler; | 92 CompleteHandler handler; |
| 93 | 93 |
| 94 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 94 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 95 tcp_client_socket, notifier)); | 95 tcp_client_socket, notifier)); |
| 96 | 96 |
| 97 net::CompletionCallback callback; | 97 net::CompletionCallback callback; |
| 98 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 98 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
| 99 .Times(2) | 99 .Times(2) |
| 100 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 100 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
| 101 Return(128))); | 101 Return(128))); |
| 102 EXPECT_CALL(handler, OnComplete(_)) | 102 EXPECT_CALL(handler, OnComplete(_)) |
| 103 .Times(1); | 103 .Times(1); |
| 104 | 104 |
| 105 scoped_refptr<net::IOBufferWithSize> io_buffer( | 105 scoped_refptr<net::IOBufferWithSize> io_buffer( |
| 106 new net::IOBufferWithSize(256)); | 106 new net::IOBufferWithSize(256)); |
| 107 socket->Write(io_buffer.get(), io_buffer->size(), | 107 socket->Write(io_buffer.get(), io_buffer->size(), |
| 108 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); | 108 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); |
| 109 } | 109 } |
| 110 | 110 |
| 111 TEST(SocketTest, TestTCPSocketBlockedWrite) { | 111 TEST(SocketTest, TestTCPSocketBlockedWrite) { |
| 112 net::AddressList address_list; | 112 net::AddressList address_list; |
| 113 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 113 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 114 MockAPIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 114 MockApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 115 CompleteHandler handler; | 115 CompleteHandler handler; |
| 116 | 116 |
| 117 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 117 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 118 tcp_client_socket, notifier)); | 118 tcp_client_socket, notifier)); |
| 119 | 119 |
| 120 net::CompletionCallback callback; | 120 net::CompletionCallback callback; |
| 121 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 121 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
| 122 .Times(2) | 122 .Times(2) |
| 123 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 123 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
| 124 Return(net::ERR_IO_PENDING))); | 124 Return(net::ERR_IO_PENDING))); |
| 125 scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(42)); | 125 scoped_refptr<net::IOBufferWithSize> io_buffer(new net::IOBufferWithSize(42)); |
| 126 socket->Write(io_buffer.get(), io_buffer->size(), | 126 socket->Write(io_buffer.get(), io_buffer->size(), |
| 127 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); | 127 base::Bind(&CompleteHandler::OnComplete, base::Unretained(&handler))); |
| 128 | 128 |
| 129 // Good. Original call came back unable to complete. Now pretend the socket | 129 // Good. Original call came back unable to complete. Now pretend the socket |
| 130 // finished, and confirm that we passed the error back. | 130 // finished, and confirm that we passed the error back. |
| 131 EXPECT_CALL(handler, OnComplete(42)) | 131 EXPECT_CALL(handler, OnComplete(42)) |
| 132 .Times(1); | 132 .Times(1); |
| 133 callback.Run(40); | 133 callback.Run(40); |
| 134 callback.Run(2); | 134 callback.Run(2); |
| 135 } | 135 } |
| 136 | 136 |
| 137 TEST(SocketTest, TestTCPSocketBlockedWriteReentry) { | 137 TEST(SocketTest, TestTCPSocketBlockedWriteReentry) { |
| 138 net::AddressList address_list; | 138 net::AddressList address_list; |
| 139 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 139 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 140 MockAPIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 140 MockApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 141 CompleteHandler handlers[5]; | 141 CompleteHandler handlers[5]; |
| 142 | 142 |
| 143 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 143 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 144 tcp_client_socket, notifier)); | 144 tcp_client_socket, notifier)); |
| 145 | 145 |
| 146 net::CompletionCallback callback; | 146 net::CompletionCallback callback; |
| 147 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) | 147 EXPECT_CALL(*tcp_client_socket, Write(_, _, _)) |
| 148 .Times(5) | 148 .Times(5) |
| 149 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), | 149 .WillRepeatedly(testing::DoAll(SaveArg<2>(&callback), |
| 150 Return(net::ERR_IO_PENDING))); | 150 Return(net::ERR_IO_PENDING))); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 163 } | 163 } |
| 164 | 164 |
| 165 for (i = 0; i < 5; i++) { | 165 for (i = 0; i < 5; i++) { |
| 166 callback.Run(128 + i * 50); | 166 callback.Run(128 + i * 50); |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| 170 TEST(SocketTest, TestTCPSocketSetNoDelay) { | 170 TEST(SocketTest, TestTCPSocketSetNoDelay) { |
| 171 net::AddressList address_list; | 171 net::AddressList address_list; |
| 172 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 172 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 173 MockAPIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 173 MockApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 174 | 174 |
| 175 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 175 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 176 tcp_client_socket, notifier)); | 176 tcp_client_socket, notifier)); |
| 177 | 177 |
| 178 bool no_delay = false; | 178 bool no_delay = false; |
| 179 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) | 179 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) |
| 180 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(true))); | 180 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(true))); |
| 181 int result = socket->SetNoDelay(true); | 181 int result = socket->SetNoDelay(true); |
| 182 EXPECT_TRUE(result); | 182 EXPECT_TRUE(result); |
| 183 EXPECT_TRUE(no_delay); | 183 EXPECT_TRUE(no_delay); |
| 184 | 184 |
| 185 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) | 185 EXPECT_CALL(*tcp_client_socket, SetNoDelay(_)) |
| 186 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(false))); | 186 .WillOnce(testing::DoAll(SaveArg<0>(&no_delay), Return(false))); |
| 187 | 187 |
| 188 result = socket->SetNoDelay(false); | 188 result = socket->SetNoDelay(false); |
| 189 EXPECT_FALSE(result); | 189 EXPECT_FALSE(result); |
| 190 EXPECT_FALSE(no_delay); | 190 EXPECT_FALSE(no_delay); |
| 191 } | 191 } |
| 192 | 192 |
| 193 TEST(SocketTest, TestTCPSocketSetKeepAlive) { | 193 TEST(SocketTest, TestTCPSocketSetKeepAlive) { |
| 194 net::AddressList address_list; | 194 net::AddressList address_list; |
| 195 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); | 195 MockTCPSocket* tcp_client_socket = new MockTCPSocket(address_list); |
| 196 MockAPIResourceEventNotifier* notifier = new MockAPIResourceEventNotifier(); | 196 MockApiResourceEventNotifier* notifier = new MockApiResourceEventNotifier(); |
| 197 | 197 |
| 198 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( | 198 scoped_ptr<TCPSocket> socket(TCPSocket::CreateSocketForTesting( |
| 199 tcp_client_socket, notifier)); | 199 tcp_client_socket, notifier)); |
| 200 | 200 |
| 201 bool enable = false; | 201 bool enable = false; |
| 202 int delay = 0; | 202 int delay = 0; |
| 203 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) | 203 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) |
| 204 .WillOnce(testing::DoAll(SaveArg<0>(&enable), | 204 .WillOnce(testing::DoAll(SaveArg<0>(&enable), |
| 205 SaveArg<1>(&delay), | 205 SaveArg<1>(&delay), |
| 206 Return(true))); | 206 Return(true))); |
| 207 int result = socket->SetKeepAlive(true, 4500); | 207 int result = socket->SetKeepAlive(true, 4500); |
| 208 EXPECT_TRUE(result); | 208 EXPECT_TRUE(result); |
| 209 EXPECT_TRUE(enable); | 209 EXPECT_TRUE(enable); |
| 210 EXPECT_EQ(4500, delay); | 210 EXPECT_EQ(4500, delay); |
| 211 | 211 |
| 212 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) | 212 EXPECT_CALL(*tcp_client_socket, SetKeepAlive(_, _)) |
| 213 .WillOnce(testing::DoAll(SaveArg<0>(&enable), | 213 .WillOnce(testing::DoAll(SaveArg<0>(&enable), |
| 214 SaveArg<1>(&delay), | 214 SaveArg<1>(&delay), |
| 215 Return(false))); | 215 Return(false))); |
| 216 result = socket->SetKeepAlive(false, 0); | 216 result = socket->SetKeepAlive(false, 0); |
| 217 EXPECT_FALSE(result); | 217 EXPECT_FALSE(result); |
| 218 EXPECT_FALSE(enable); | 218 EXPECT_FALSE(enable); |
| 219 EXPECT_EQ(0, delay); | 219 EXPECT_EQ(0, delay); |
| 220 } | 220 } |
| 221 | 221 |
| 222 } // namespace extensions | 222 } // namespace extensions |
| OLD | NEW |