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