OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/cast_channel/cast_socket.h" | 5 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h" |
6 | 6 |
| 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/run_loop.h" |
| 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/sys_byteorder.h" |
7 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" | 11 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" |
8 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" | 12 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" |
9 #include "net/base/address_list.h" | 13 #include "net/base/address_list.h" |
10 #include "net/base/capturing_net_log.h" | 14 #include "net/base/capturing_net_log.h" |
11 #include "net/base/io_buffer.h" | 15 #include "net/base/io_buffer.h" |
12 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
13 #include "net/base/net_log.h" | 17 #include "net/base/net_log.h" |
14 #include "net/socket/socket_test_util.h" | 18 #include "net/socket/socket_test_util.h" |
15 #include "net/socket/ssl_client_socket.h" | 19 #include "net/socket/ssl_client_socket.h" |
16 #include "net/socket/tcp_client_socket.h" | 20 #include "net/socket/tcp_client_socket.h" |
17 #include "net/ssl/ssl_info.h" | 21 #include "net/ssl/ssl_info.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
20 | 24 |
21 using ::testing::_; | 25 using ::testing::_; |
22 using ::testing::A; | 26 using ::testing::A; |
23 using ::testing::DoAll; | 27 using ::testing::DoAll; |
24 using ::testing::Return; | 28 using ::testing::Return; |
25 using ::testing::SaveArg; | 29 using ::testing::SaveArg; |
26 | 30 |
| 31 namespace { |
| 32 const char* kTestData[4] = { |
| 33 "Hello, World!", |
| 34 "Goodbye, World!", |
| 35 "Hello, Sky!", |
| 36 "Goodbye, Volcano!", |
| 37 }; |
| 38 } // namespace |
| 39 |
27 namespace extensions { | 40 namespace extensions { |
28 namespace api { | 41 namespace api { |
29 namespace cast_channel { | 42 namespace cast_channel { |
30 | 43 |
| 44 // Fills in |message| with a string message. |
| 45 static void CreateStringMessage(const std::string& namespace_, |
| 46 const std::string& source_id, |
| 47 const std::string& destination_id, |
| 48 const std::string& data, |
| 49 MessageInfo* message) { |
| 50 message->namespace_ = namespace_; |
| 51 message->source_id = source_id; |
| 52 message->destination_id = destination_id; |
| 53 message->data.reset(new base::StringValue(data)); |
| 54 } |
| 55 |
| 56 // Fills in |message| with a binary message. |
| 57 static void CreateBinaryMessage(const std::string& namespace_, |
| 58 const std::string& source_id, |
| 59 const std::string& destination_id, |
| 60 const std::string& data, |
| 61 MessageInfo* message) { |
| 62 message->namespace_ = namespace_; |
| 63 message->source_id = source_id; |
| 64 message->destination_id = destination_id; |
| 65 message->data.reset(base::BinaryValue::CreateWithCopiedBuffer( |
| 66 data.c_str(), data.size())); |
| 67 } |
| 68 |
| 69 // Returns the size of the body (in bytes) of the given serialized message. |
| 70 static size_t ComputeBodySize(const std::string& msg) { |
| 71 return msg.length() - kMessageHeaderSize; |
| 72 } |
| 73 |
31 class MockCastSocketDelegate : public CastSocket::Delegate { | 74 class MockCastSocketDelegate : public CastSocket::Delegate { |
32 public: | 75 public: |
33 MOCK_METHOD2(OnError, void(const CastSocket* socket, | 76 MOCK_METHOD2(OnError, void(const CastSocket* socket, |
34 ChannelError error)); | 77 ChannelError error)); |
35 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, | 78 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, |
36 const MessageInfo& message)); | 79 const MessageInfo& message)); |
37 }; | 80 }; |
38 | 81 |
39 class MockTCPClientSocket : public net::TCPClientSocket { | 82 class MockTCPSocket : public net::TCPClientSocket { |
40 public: | 83 public: |
41 explicit MockTCPClientSocket() : | 84 explicit MockTCPSocket(const net::MockConnect& connect_data) : |
42 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()) { } | 85 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()), |
43 virtual ~MockTCPClientSocket() { } | 86 connect_data_(connect_data) { } |
44 | 87 |
45 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); | 88 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE { |
46 MOCK_METHOD2(SetKeepAlive, bool(bool, int)); | 89 if (connect_data_.mode == net::ASYNC) { |
47 MOCK_METHOD1(SetNoDelay, bool(bool)); | 90 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING); |
48 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, | 91 base::MessageLoop::current()->PostTask( |
49 const net::CompletionCallback& callback)); | 92 FROM_HERE, |
50 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, | 93 base::Bind(callback, connect_data_.result)); |
51 const net::CompletionCallback& callback)); | 94 return net::ERR_IO_PENDING; |
52 MOCK_METHOD0(Disconnect, void()); | 95 } else { |
53 }; | 96 return connect_data_.result; |
| 97 } |
| 98 } |
54 | 99 |
55 class MockSSLClientSocket : public net::MockClientSocket { | 100 virtual bool SetKeepAlive(bool enable, int delay) OVERRIDE { |
56 public: | 101 // Always return true in tests |
57 MockSSLClientSocket() : MockClientSocket(net::BoundNetLog()) { } | 102 return true; |
58 virtual ~MockSSLClientSocket() { } | 103 } |
59 | 104 |
60 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); | 105 virtual bool SetNoDelay(bool no_delay) OVERRIDE { |
61 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, | 106 // Always return true in tests |
62 const net::CompletionCallback& callback)); | 107 return true; |
63 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, | 108 } |
64 const net::CompletionCallback& callback)); | 109 |
65 MOCK_METHOD0(Disconnect, void()); | 110 MOCK_METHOD3(Read, |
66 MOCK_CONST_METHOD0(WasEverUsed, bool()); | 111 int(net::IOBuffer*, int, const net::CompletionCallback&)); |
67 MOCK_CONST_METHOD0(UsingTCPFastOpen, bool()); | 112 MOCK_METHOD3(Write, |
68 MOCK_CONST_METHOD0(WasNpnNegotiated, bool()); | 113 int(net::IOBuffer*, int, const net::CompletionCallback&)); |
69 MOCK_METHOD1(GetSSLInfo, bool(net::SSLInfo*)); | 114 |
| 115 virtual void Disconnect() OVERRIDE { |
| 116 // Do nothing in tests |
| 117 } |
| 118 |
| 119 private: |
| 120 net::MockConnect connect_data_; |
70 }; | 121 }; |
71 | 122 |
72 class CompleteHandler { | 123 class CompleteHandler { |
73 public: | 124 public: |
74 CompleteHandler() {} | 125 CompleteHandler() {} |
75 MOCK_METHOD1(OnCloseComplete, void(int result)); | 126 MOCK_METHOD1(OnCloseComplete, void(int result)); |
76 MOCK_METHOD1(OnConnectComplete, void(int result)); | 127 MOCK_METHOD1(OnConnectComplete, void(int result)); |
77 MOCK_METHOD1(OnWriteComplete, void(int result)); | 128 MOCK_METHOD1(OnWriteComplete, void(int result)); |
78 private: | 129 private: |
79 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 130 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
80 }; | 131 }; |
81 | 132 |
82 class TestCastSocket : public CastSocket { | 133 class TestCastSocket : public CastSocket { |
83 public: | 134 public: |
84 static scoped_ptr<TestCastSocket> Create( | 135 static scoped_ptr<TestCastSocket> Create( |
85 MockCastSocketDelegate* delegate) { | 136 MockCastSocketDelegate* delegate) { |
86 return scoped_ptr<TestCastSocket>( | 137 return scoped_ptr<TestCastSocket>( |
87 new TestCastSocket(delegate, "cast://192.0.0.1:8009")); | 138 new TestCastSocket(delegate, "cast://192.0.0.1:8009")); |
88 } | 139 } |
89 | 140 |
90 static scoped_ptr<TestCastSocket> CreateSecure( | 141 static scoped_ptr<TestCastSocket> CreateSecure( |
91 MockCastSocketDelegate* delegate) { | 142 MockCastSocketDelegate* delegate) { |
92 return scoped_ptr<TestCastSocket>( | 143 return scoped_ptr<TestCastSocket>( |
93 new TestCastSocket(delegate, "casts://192.0.0.1:8009")); | 144 new TestCastSocket(delegate, "casts://192.0.0.1:8009")); |
94 } | 145 } |
95 | 146 |
96 explicit TestCastSocket(MockCastSocketDelegate* delegate, | 147 explicit TestCastSocket(MockCastSocketDelegate* delegate, |
97 const std::string& url) : | 148 const std::string& url) : |
98 CastSocket("abcdefg", GURL(url), delegate, | 149 CastSocket("abcdefg", GURL(url), delegate, |
99 &capturing_net_log_), | 150 &capturing_net_log_), |
100 mock_tcp_socket_(new MockTCPClientSocket()), | 151 ip_(CreateIPEndPoint()), |
101 mock_ssl_socket_(new MockSSLClientSocket()), | 152 connect_index_(0), |
102 owns_tcp_socket_(true), | 153 extract_cert_result_(true), |
103 owns_ssl_socket_(true), | 154 verify_challenge_result_(true) { |
104 extract_cert_result_(true), | 155 } |
105 send_auth_challenge_result_(net::ERR_IO_PENDING), | 156 |
106 read_auth_challenge_reply_result_(net::ERR_IO_PENDING), | 157 static net::IPEndPoint CreateIPEndPoint() { |
107 challenge_reply_result_(true) { | 158 net::IPAddressNumber number; |
| 159 number.push_back(192); |
| 160 number.push_back(0); |
| 161 number.push_back(0); |
| 162 number.push_back(1); |
| 163 return net::IPEndPoint(number, 8009); |
108 } | 164 } |
109 | 165 |
110 virtual ~TestCastSocket() { | 166 virtual ~TestCastSocket() { |
111 if (owns_tcp_socket_) { | 167 } |
112 DCHECK(mock_tcp_socket_); | 168 |
113 delete mock_tcp_socket_; | 169 // Helpers to set mock results for various operations. |
114 } | 170 void SetupTcp1Connect(net::IoMode mode, int result) { |
115 if (owns_ssl_socket_) { | 171 tcp_connect_data_[0].reset(new net::MockConnect(mode, result)); |
116 DCHECK(mock_ssl_socket_); | 172 } |
117 delete mock_ssl_socket_; | 173 void SetupSsl1Connect(net::IoMode mode, int result) { |
| 174 ssl_connect_data_[0].reset(new net::MockConnect(mode, result)); |
| 175 } |
| 176 void SetupTcp2Connect(net::IoMode mode, int result) { |
| 177 tcp_connect_data_[1].reset(new net::MockConnect(mode, result)); |
| 178 } |
| 179 void SetupSsl2Connect(net::IoMode mode, int result) { |
| 180 ssl_connect_data_[1].reset(new net::MockConnect(mode, result)); |
| 181 } |
| 182 void AddWriteResult(const net::MockWrite& write) { |
| 183 writes_.push_back(write); |
| 184 } |
| 185 void AddWriteResult(net::IoMode mode, int result) { |
| 186 AddWriteResult(net::MockWrite(mode, result)); |
| 187 } |
| 188 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) { |
| 189 AddWriteResult(mode, msg.size()); |
| 190 } |
| 191 void AddWriteResultForMessage(net::IoMode mode, |
| 192 const std::string& msg, |
| 193 size_t ch_size) { |
| 194 size_t msg_size = msg.size(); |
| 195 for (size_t offset = 0; offset < msg_size; offset += ch_size) { |
| 196 if (offset + ch_size > msg_size) |
| 197 ch_size = msg_size - offset; |
| 198 AddWriteResult(mode, ch_size); |
118 } | 199 } |
119 } | 200 } |
120 | 201 |
121 virtual void Close(const net::CompletionCallback& callback) OVERRIDE { | 202 void AddReadResult(const net::MockRead& read) { |
122 if (!owns_tcp_socket_) | 203 reads_.push_back(read); |
123 mock_tcp_socket_ = NULL; | |
124 if (!owns_ssl_socket_) | |
125 mock_ssl_socket_ = NULL; | |
126 CastSocket::Close(callback); | |
127 } | 204 } |
128 | 205 void AddReadResult(net::IoMode mode, int result) { |
129 void CreateNewSockets() { | 206 AddReadResult(net::MockRead(mode, result)); |
130 owns_tcp_socket_ = true; | 207 } |
131 mock_tcp_socket_ = new MockTCPClientSocket(); | 208 void AddReadResult(net::IoMode mode, const char* data, int data_len) { |
132 owns_ssl_socket_ = true; | 209 AddReadResult(net::MockRead(mode, data, data_len)); |
133 mock_ssl_socket_ = new MockSSLClientSocket(); | 210 } |
| 211 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) { |
| 212 size_t body_size = ComputeBodySize(msg); |
| 213 const char* data = msg.c_str(); |
| 214 AddReadResult(mode, data, kMessageHeaderSize); |
| 215 AddReadResult(mode, data + kMessageHeaderSize, body_size); |
| 216 } |
| 217 void AddReadResultForMessage(net::IoMode mode, |
| 218 const std::string& msg, |
| 219 size_t ch_size) { |
| 220 size_t msg_size = msg.size(); |
| 221 const char* data = msg.c_str(); |
| 222 for (size_t offset = 0; offset < msg_size; offset += ch_size) { |
| 223 if (offset + ch_size > msg_size) |
| 224 ch_size = msg_size - offset; |
| 225 AddReadResult(mode, data + offset, ch_size); |
| 226 } |
134 } | 227 } |
135 | 228 |
136 void SetExtractCertResult(bool value) { | 229 void SetExtractCertResult(bool value) { |
137 extract_cert_result_ = value; | 230 extract_cert_result_ = value; |
138 } | 231 } |
139 | 232 void SetVerifyChallengeResult(bool value) { |
140 void SetSendAuthChallengeResult(int result) { | 233 verify_challenge_result_ = value; |
141 send_auth_challenge_result_ = result; | |
142 } | 234 } |
143 | 235 |
144 void SetReadAuthChallengeReplyResult(int result) { | 236 private: |
145 read_auth_challenge_reply_result_ = result; | 237 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { |
| 238 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get(); |
| 239 connect_data->peer_addr = ip_; |
| 240 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data)); |
146 } | 241 } |
147 | 242 |
148 void SetChallengeReplyResult(bool value) { | 243 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( |
149 challenge_reply_result_ = value; | 244 scoped_ptr<net::StreamSocket> socket) OVERRIDE { |
150 } | 245 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get(); |
| 246 connect_data->peer_addr = ip_; |
| 247 ++connect_index_; |
151 | 248 |
152 MockTCPClientSocket* mock_tcp_socket_; | 249 ssl_data_.reset(new net::StaticSocketDataProvider( |
153 MockSSLClientSocket* mock_ssl_socket_; | 250 reads_.data(), reads_.size(), writes_.data(), writes_.size())); |
154 | 251 ssl_data_->set_connect_data(*connect_data); |
155 protected: | 252 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! |
156 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { | 253 return scoped_ptr<net::SSLClientSocket>( |
157 owns_tcp_socket_ = false; | 254 new net::MockTCPClientSocket( |
158 return scoped_ptr<net::TCPClientSocket>(mock_tcp_socket_); | 255 net::AddressList(), &capturing_net_log_, ssl_data_.get())); |
159 } | |
160 | |
161 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket() OVERRIDE { | |
162 owns_ssl_socket_ = false; | |
163 return scoped_ptr<net::SSLClientSocket>(mock_ssl_socket_); | |
164 } | 256 } |
165 | 257 |
166 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { | 258 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { |
167 if (extract_cert_result_) | 259 if (extract_cert_result_) |
168 cert->assign("dummy_test_cert"); | 260 cert->assign("dummy_test_cert"); |
169 return extract_cert_result_; | 261 return extract_cert_result_; |
170 } | 262 } |
171 | 263 |
172 virtual int SendAuthChallenge() OVERRIDE { | 264 virtual bool VerifyChallengeReply() OVERRIDE { |
173 return send_auth_challenge_result_; | 265 return verify_challenge_result_; |
174 } | 266 } |
175 | 267 |
176 virtual int ReadAuthChallengeReply() OVERRIDE { | |
177 return read_auth_challenge_reply_result_; | |
178 } | |
179 | |
180 virtual bool VerifyChallengeReply() OVERRIDE { | |
181 return challenge_reply_result_; | |
182 } | |
183 | |
184 private: | |
185 net::CapturingNetLog capturing_net_log_; | 268 net::CapturingNetLog capturing_net_log_; |
186 // Whether this object or the parent owns |mock_tcp_socket_|. | 269 net::IPEndPoint ip_; |
187 bool owns_tcp_socket_; | 270 // Simulated connect data |
188 // Whether this object or the parent owns |mock_ssl_socket_|. | 271 scoped_ptr<net::MockConnect> tcp_connect_data_[2]; |
189 bool owns_ssl_socket_; | 272 scoped_ptr<net::MockConnect> ssl_connect_data_[2]; |
| 273 // Simulated read / write data |
| 274 std::vector<net::MockWrite> writes_; |
| 275 std::vector<net::MockRead> reads_; |
| 276 scoped_ptr<net::SocketDataProvider> ssl_data_; |
| 277 // Number of times Connect method is called |
| 278 size_t connect_index_; |
190 // Simulated result of peer cert extraction. | 279 // Simulated result of peer cert extraction. |
191 bool extract_cert_result_; | 280 bool extract_cert_result_; |
192 // Simulated result to be returned by SendAuthChallenge. | |
193 int send_auth_challenge_result_; | |
194 // Simulated result to be returned by ReadAuthChallengeReply. | |
195 int read_auth_challenge_reply_result_; | |
196 // Simulated result of verifying challenge reply. | 281 // Simulated result of verifying challenge reply. |
197 bool challenge_reply_result_; | 282 bool verify_challenge_result_; |
198 }; | 283 }; |
199 | 284 |
200 class CastSocketTest : public testing::Test { | 285 class CastSocketTest : public testing::Test { |
201 public: | 286 public: |
202 CastSocketTest() {} | 287 CastSocketTest() {} |
203 virtual ~CastSocketTest() {} | 288 virtual ~CastSocketTest() {} |
204 | 289 |
205 virtual void SetUp() OVERRIDE { | 290 virtual void SetUp() OVERRIDE { |
206 test_message_.namespace_ = "urn:test"; | 291 // Create a few test messages |
207 test_message_.source_id = "1"; | 292 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
208 test_message_.destination_id = "2"; | 293 CreateStringMessage("urn:cast", "1", "2", kTestData[i], |
209 test_message_.data.reset(new base::StringValue("Hello, World!")); | 294 &test_messages_[i]); |
210 ASSERT_TRUE(MessageInfoToCastMessage(test_message_, &test_proto_)); | 295 ASSERT_TRUE(MessageInfoToCastMessage( |
| 296 test_messages_[i], &test_protos_[i])); |
| 297 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i])); |
| 298 } |
| 299 |
| 300 // Create a test auth request. |
| 301 CastMessage request; |
| 302 CreateAuthChallengeMessage(&request); |
| 303 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_)); |
| 304 |
| 305 // Create a test auth reply. |
| 306 MessageInfo reply; |
| 307 CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth", |
| 308 "sender-0", |
| 309 "receiver-0", |
| 310 "abcd", |
| 311 &reply); |
| 312 CastMessage reply_msg; |
| 313 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg)); |
| 314 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_)); |
211 } | 315 } |
212 | 316 |
213 virtual void TearDown() OVERRIDE { | 317 virtual void TearDown() OVERRIDE { |
214 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 318 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
215 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 319 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
216 base::Unretained(&handler_))); | 320 base::Unretained(&handler_))); |
217 } | 321 } |
218 | 322 |
219 void CreateCastSocket() { | 323 void CreateCastSocket() { |
220 socket_ = TestCastSocket::Create(&mock_delegate_); | 324 socket_ = TestCastSocket::Create(&mock_delegate_); |
221 } | 325 } |
222 | 326 |
223 void CreateCastSocketSecure() { | 327 void CreateCastSocketSecure() { |
224 socket_ = TestCastSocket::CreateSecure(&mock_delegate_); | 328 socket_ = TestCastSocket::CreateSecure(&mock_delegate_); |
225 } | 329 } |
226 | 330 |
227 // Sets an expectation that TCPClientSocket::Connect is called and | 331 // Sets up CastSocket::Connect to succeed. |
228 // returns |result| and stores the callback passed to it in |callback|. | 332 // Connecting the socket also starts the read loop; so we add a mock |
229 void ExpectTcpConnect(net::CompletionCallback* callback, int result) { | 333 // read result that returns IO_PENDING and callback is never fired. |
230 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) | 334 void ConnectHelper() { |
231 .Times(1) | 335 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
232 .WillOnce(DoAll(SaveArg<0>(callback), Return(result))); | 336 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); |
233 EXPECT_CALL(mock_tcp_socket(), SetKeepAlive(_, _)) | 337 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
234 .WillOnce(Return(true)); | |
235 } | |
236 | 338 |
237 // Same as ExpectTcpConnect but to return net::ERR_IO_PENDING. | |
238 void ExpectTcpConnectPending(net::CompletionCallback* callback) { | |
239 ExpectTcpConnect(callback, net::ERR_IO_PENDING); | |
240 } | |
241 | |
242 // Sets an expectation that SSLClientSocket::Connect is called and | |
243 // returns |result| and stores the callback passed to it in |callback|. | |
244 void ExpectSslConnect(net::CompletionCallback* callback, int result) { | |
245 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>())) | |
246 .Times(1) | |
247 .WillOnce(DoAll(SaveArg<0>(callback), Return(result))); | |
248 } | |
249 | |
250 // Same as ExpectSslConnect but to return net::ERR_IO_PENDING. | |
251 void ExpectSslConnectPending(net::CompletionCallback* callback) { | |
252 ExpectSslConnect(callback, net::ERR_IO_PENDING); | |
253 } | |
254 | |
255 // Sets an expectation that SSLClientSocket::Read is called |times| number | |
256 // of times and returns net::ERR_IO_PENDING. | |
257 void ExpectSslRead(int times) { | |
258 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), | |
259 A<int>(), | |
260 A<const net::CompletionCallback&>())) | |
261 .Times(times) | |
262 .WillOnce(Return(net::ERR_IO_PENDING)); | |
263 } | |
264 | |
265 // Sets up CastSocket::Connect to succeed. | |
266 // Connecting the socket also starts the read loop; we expect the call to | |
267 // Read(), but never fire the read callback. | |
268 void ConnectHelper() { | |
269 net::CompletionCallback connect_callback1; | |
270 net::CompletionCallback connect_callback2; | |
271 | |
272 ExpectTcpConnect(&connect_callback1, net::OK); | |
273 ExpectSslConnect(&connect_callback2, net::OK); | |
274 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 339 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
275 ExpectSslRead(1); | |
276 | |
277 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 340 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
278 base::Unretained(&handler_))); | 341 base::Unretained(&handler_))); |
279 | 342 RunPendingTasks(); |
280 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
281 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
282 } | 343 } |
283 | 344 |
284 protected: | 345 protected: |
285 MockTCPClientSocket& mock_tcp_socket() { | 346 // Runs all pending tasks in the message loop. |
286 MockTCPClientSocket* mock_socket = socket_->mock_tcp_socket_; | 347 void RunPendingTasks() { |
287 DCHECK(mock_socket); | 348 base::RunLoop run_loop; |
288 return *mock_socket; | 349 run_loop.RunUntilIdle(); |
289 } | 350 } |
290 | 351 |
291 MockSSLClientSocket& mock_ssl_socket() { | 352 base::MessageLoop message_loop_; |
292 MockSSLClientSocket* mock_socket = socket_->mock_ssl_socket_; | |
293 DCHECK(mock_socket); | |
294 return *mock_socket; | |
295 } | |
296 | |
297 void CallOnChallengeEvent(int result) { | |
298 socket_->OnChallengeEvent(result); | |
299 } | |
300 | |
301 MockCastSocketDelegate mock_delegate_; | 353 MockCastSocketDelegate mock_delegate_; |
302 scoped_ptr<TestCastSocket> socket_; | 354 scoped_ptr<TestCastSocket> socket_; |
303 CompleteHandler handler_; | 355 CompleteHandler handler_; |
304 MessageInfo test_message_; | 356 MessageInfo test_messages_[arraysize(kTestData)]; |
305 CastMessage test_proto_; | 357 CastMessage test_protos_[arraysize(kTestData)]; |
| 358 std::string test_proto_strs_[arraysize(kTestData)]; |
| 359 std::string auth_request_; |
| 360 std::string auth_reply_; |
306 }; | 361 }; |
307 | 362 |
308 // Tests URL parsing and validation. | 363 // Tests URL parsing and validation. |
309 TEST_F(CastSocketTest, TestCastURLs) { | 364 TEST_F(CastSocketTest, TestCastURLs) { |
310 CreateCastSocket(); | 365 CreateCastSocket(); |
311 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); | 366 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); |
312 EXPECT_FALSE(socket_->auth_required()); | 367 EXPECT_FALSE(socket_->auth_required()); |
313 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); | 368 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); |
314 | 369 |
315 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); | 370 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); |
(...skipping 12 matching lines...) Expand all Loading... |
328 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); | 383 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); |
329 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); | 384 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); |
330 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); | 385 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); |
331 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); | 386 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); |
332 } | 387 } |
333 | 388 |
334 // Tests connecting and closing the socket. | 389 // Tests connecting and closing the socket. |
335 TEST_F(CastSocketTest, TestConnectAndClose) { | 390 TEST_F(CastSocketTest, TestConnectAndClose) { |
336 CreateCastSocket(); | 391 CreateCastSocket(); |
337 ConnectHelper(); | 392 ConnectHelper(); |
| 393 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 394 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
338 | 395 |
339 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 396 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
340 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 397 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
341 base::Unretained(&handler_))); | 398 base::Unretained(&handler_))); |
342 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 399 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
343 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 400 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
344 } | 401 } |
345 | 402 |
346 // Tests that the following connection flow works: | 403 // Tests that the following connection flow works: |
347 // - TCP connection succeeds (async) | 404 // - TCP connection succeeds (async) |
348 // - SSL connection succeeds (async) | 405 // - SSL connection succeeds (async) |
349 TEST_F(CastSocketTest, TestConnect) { | 406 TEST_F(CastSocketTest, TestConnect) { |
350 CreateCastSocket(); | 407 CreateCastSocket(); |
| 408 socket_->SetupTcp1Connect(net::ASYNC, net::OK); |
| 409 socket_->SetupSsl1Connect(net::ASYNC, net::OK); |
| 410 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
351 | 411 |
352 net::CompletionCallback connect_callback1; | |
353 net::CompletionCallback connect_callback2; | |
354 | |
355 ExpectTcpConnectPending(&connect_callback1); | |
356 ExpectSslConnectPending(&connect_callback2); | |
357 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 412 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
358 ExpectSslRead(1); | |
359 | |
360 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 413 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
361 base::Unretained(&handler_))); | 414 base::Unretained(&handler_))); |
362 connect_callback1.Run(net::OK); | 415 RunPendingTasks(); |
363 connect_callback2.Run(net::OK); | |
364 | 416 |
365 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 417 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
366 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 418 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
367 } | 419 } |
368 | 420 |
369 // Test that the following connection flow works: | 421 // Test that the following connection flow works: |
370 // - TCP connection succeeds (async) | 422 // - TCP connection succeeds (async) |
371 // - SSL connection fails with cert error (async) | 423 // - SSL connection fails with cert error (async) |
372 // - Cert is extracted successfully | 424 // - Cert is extracted successfully |
373 // - Second TCP connection succeeds (async) | 425 // - Second TCP connection succeeds (async) |
374 // - Second SSL connection succeeds (async) | 426 // - Second SSL connection succeeds (async) |
375 TEST_F(CastSocketTest, TestTwoStepConnect) { | 427 TEST_F(CastSocketTest, TestConnectTwoStep) { |
376 CreateCastSocket(); | 428 CreateCastSocket(); |
| 429 socket_->SetupTcp1Connect(net::ASYNC, net::OK); |
| 430 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); |
| 431 socket_->SetupTcp2Connect(net::ASYNC, net::OK); |
| 432 socket_->SetupSsl2Connect(net::ASYNC, net::OK); |
| 433 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
377 | 434 |
378 // Expectations for the initial connect call | 435 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
379 net::CompletionCallback tcp_connect_callback1; | |
380 net::CompletionCallback ssl_connect_callback1; | |
381 | |
382 ExpectTcpConnectPending(&tcp_connect_callback1); | |
383 ExpectSslConnectPending(&ssl_connect_callback1); | |
384 | |
385 // Start connect flow | |
386 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 436 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
387 base::Unretained(&handler_))); | 437 base::Unretained(&handler_))); |
388 tcp_connect_callback1.Run(net::OK); | 438 RunPendingTasks(); |
389 | |
390 // Expectations for the second connect call | |
391 socket_->CreateNewSockets(); | |
392 net::CompletionCallback tcp_connect_callback2; | |
393 net::CompletionCallback ssl_connect_callback2; | |
394 ExpectTcpConnectPending(&tcp_connect_callback2); | |
395 ExpectSslConnectPending(&ssl_connect_callback2); | |
396 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | |
397 ExpectSslRead(1); | |
398 | |
399 // Trigger callbacks for the first connect | |
400 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); | |
401 | |
402 // Trigger callbacks for the second connect | |
403 tcp_connect_callback2.Run(net::OK); | |
404 ssl_connect_callback2.Run(net::OK); | |
405 | 439 |
406 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 440 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
407 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 441 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
408 } | 442 } |
409 | 443 |
410 // Test that the following connection flow works: | 444 // Test that the following connection flow works: |
411 // - TCP connection succeeds (async) | 445 // - TCP connection succeeds (async) |
412 // - SSL connection fails with cert error (async) | 446 // - SSL connection fails with cert error (async) |
413 // - Cert is extracted successfully | 447 // - Cert is extracted successfully |
414 // - Second TCP connection succeeds (async) | 448 // - Second TCP connection succeeds (async) |
415 // - Second SSL connection fails (async) | 449 // - Second SSL connection fails (async) |
416 // - The flow should NOT be tried again | 450 // - The flow should NOT be tried again |
417 TEST_F(CastSocketTest, TestMaxTwoConnectAttempts) { | 451 TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) { |
418 CreateCastSocket(); | 452 CreateCastSocket(); |
419 | 453 socket_->SetupTcp1Connect(net::ASYNC, net::OK); |
420 net::CompletionCallback tcp_connect_callback1; | 454 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); |
421 net::CompletionCallback ssl_connect_callback1; | 455 socket_->SetupTcp2Connect(net::ASYNC, net::OK); |
422 | 456 socket_->SetupSsl2Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); |
423 // Expectations for the initial connect call | 457 |
424 ExpectTcpConnectPending(&tcp_connect_callback1); | |
425 ExpectSslConnectPending(&ssl_connect_callback1); | |
426 | |
427 // Start connect flow | |
428 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
429 base::Unretained(&handler_))); | |
430 tcp_connect_callback1.Run(net::OK); | |
431 | |
432 socket_->CreateNewSockets(); | |
433 net::CompletionCallback tcp_connect_callback2; | |
434 net::CompletionCallback ssl_connect_callback2; | |
435 | |
436 // Expectations for the second connect call | |
437 ExpectTcpConnectPending(&tcp_connect_callback2); | |
438 ExpectSslConnectPending(&ssl_connect_callback2); | |
439 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); | 458 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); |
440 | 459 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
441 // Trigger callbacks for the first connect | 460 base::Unretained(&handler_))); |
442 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); | 461 RunPendingTasks(); |
443 | |
444 // Trigger callbacks for the second connect | |
445 tcp_connect_callback2.Run(net::OK); | |
446 ssl_connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); | |
447 | |
448 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
449 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
450 } | |
451 | |
452 // Test that when cert extraction fails the connection flow stops. | |
453 TEST_F(CastSocketTest, TestCertExtractionFailure) { | |
454 CreateCastSocket(); | |
455 | |
456 net::CompletionCallback connect_callback1; | |
457 net::CompletionCallback connect_callback2; | |
458 | |
459 ExpectTcpConnectPending(&connect_callback1); | |
460 ExpectSslConnectPending(&connect_callback2); | |
461 | |
462 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
463 base::Unretained(&handler_))); | |
464 connect_callback1.Run(net::OK); | |
465 | |
466 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); | |
467 | |
468 // Set cert extraction to fail | |
469 socket_->SetExtractCertResult(false); | |
470 // Attempt to connect results in ERR_CERT_AUTHORTY_INVALID | |
471 connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); | |
472 | 462 |
473 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 463 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
474 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | 464 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
475 } | 465 } |
476 | 466 |
477 // Tests that the following connection flow works: | 467 // Tests that the following connection flow works: |
478 // - TCP connection succeeds (async) | 468 // - TCP connection succeeds (async) |
479 // - SSL connection fails with cert error (async) | 469 // - SSL connection fails with cert error (async) |
480 // - Cert is extracted successfully | 470 // - Cert is extracted successfully |
481 // - Second TCP connection succeeds (async) | 471 // - Second TCP connection succeeds (async) |
482 // - Second SSL connection succeeds (async) | 472 // - Second SSL connection succeeds (async) |
483 // - Challenge request is sent (async) | 473 // - Challenge request is sent (async) |
484 // - Challenge response is received (async) | 474 // - Challenge response is received (async) |
485 // - Credentials are verified successfuly | 475 // - Credentials are verified successfuly |
486 TEST_F(CastSocketTest, TestFullSecureConnectionFlowAsync) { | 476 TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) { |
487 CreateCastSocketSecure(); | 477 CreateCastSocketSecure(); |
488 | 478 |
489 net::CompletionCallback tcp_connect_callback1; | 479 socket_->SetupTcp1Connect(net::ASYNC, net::OK); |
490 net::CompletionCallback ssl_connect_callback1; | 480 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); |
491 | 481 socket_->SetupTcp2Connect(net::ASYNC, net::OK); |
492 // Expectations for the initial connect call | 482 socket_->SetupSsl2Connect(net::ASYNC, net::OK); |
493 ExpectTcpConnectPending(&tcp_connect_callback1); | 483 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); |
494 ExpectSslConnectPending(&ssl_connect_callback1); | 484 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_); |
495 | 485 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
496 // Start connect flow | 486 |
497 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
498 base::Unretained(&handler_))); | |
499 tcp_connect_callback1.Run(net::OK); | |
500 | |
501 socket_->CreateNewSockets(); | |
502 net::CompletionCallback tcp_connect_callback2; | |
503 net::CompletionCallback ssl_connect_callback2; | |
504 | |
505 // Expectations for the second connect call | |
506 ExpectTcpConnectPending(&tcp_connect_callback2); | |
507 ExpectSslConnectPending(&ssl_connect_callback2); | |
508 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 487 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
509 | 488 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
510 // Trigger callbacks for the first connect | 489 base::Unretained(&handler_))); |
511 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); | 490 RunPendingTasks(); |
512 | 491 |
513 // Trigger callbacks for the second connect | 492 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
514 tcp_connect_callback2.Run(net::OK); | 493 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
515 ssl_connect_callback2.Run(net::OK); | 494 } |
516 | 495 |
517 // Trigger callbacks for auth events. | 496 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous. |
518 CallOnChallengeEvent(net::OK); // Sent challenge | 497 TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) { |
519 CallOnChallengeEvent(net::OK); // Received reply | 498 CreateCastSocketSecure(); |
520 | 499 |
521 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 500 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
522 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 501 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID); |
523 } | 502 socket_->SetupTcp2Connect(net::SYNCHRONOUS, net::OK); |
524 | 503 socket_->SetupSsl2Connect(net::SYNCHRONOUS, net::OK); |
525 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous. | 504 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, auth_request_); |
526 TEST_F(CastSocketTest, TestFullSecureConnectionFlowSync) { | 505 socket_->AddReadResultForMessage(net::SYNCHRONOUS, auth_reply_); |
527 CreateCastSocketSecure(); | 506 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
528 | 507 |
529 net::CompletionCallback tcp_connect_callback; | |
530 net::CompletionCallback ssl_connect_callback; | |
531 | |
532 // Expectations for the connect calls | |
533 ExpectTcpConnect(&tcp_connect_callback, net::OK); | |
534 ExpectSslConnect(&ssl_connect_callback, net::OK); | |
535 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 508 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
536 | 509 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
537 socket_->SetSendAuthChallengeResult(net::OK); | 510 base::Unretained(&handler_))); |
538 socket_->SetReadAuthChallengeReplyResult(net::OK); | 511 RunPendingTasks(); |
539 | 512 |
540 // Start connect flow | 513 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
541 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 514 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
542 base::Unretained(&handler_))); | 515 } |
543 | 516 |
544 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 517 // Test connection error - TCP connect fails (async) |
545 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 518 TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) { |
546 } | 519 CreateCastSocketSecure(); |
547 | 520 |
548 // Tests writing a single message where the completion is signaled via | 521 socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED); |
549 // callback. | 522 |
550 TEST_F(CastSocketTest, TestWriteViaCallback) { | 523 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
551 CreateCastSocket(); | 524 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
552 ConnectHelper(); | 525 base::Unretained(&handler_))); |
553 | 526 RunPendingTasks(); |
554 net::CompletionCallback write_callback; | 527 |
555 | 528 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
556 EXPECT_CALL(mock_ssl_socket(), | 529 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
557 Write(A<net::IOBuffer*>(), | 530 } |
558 39, | 531 |
559 A<const net::CompletionCallback&>())) | 532 // Test connection error - TCP connect fails (sync) |
560 .Times(1) | 533 TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) { |
561 .WillOnce(DoAll(SaveArg<2>(&write_callback), | 534 CreateCastSocketSecure(); |
562 Return(net::ERR_IO_PENDING))); | 535 |
563 EXPECT_CALL(handler_, OnWriteComplete(39)); | 536 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED); |
564 socket_->SendMessage(test_message_, | 537 |
565 base::Bind(&CompleteHandler::OnWriteComplete, | 538 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
566 base::Unretained(&handler_))); | 539 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
567 write_callback.Run(39); | 540 base::Unretained(&handler_))); |
568 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 541 RunPendingTasks(); |
569 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 542 |
570 } | 543 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
571 | 544 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
572 // Tests writing a single message where the Write() returns directly. | 545 } |
573 TEST_F(CastSocketTest, TestWrite) { | 546 |
574 CreateCastSocket(); | 547 // Test connection error - SSL connect fails (async) |
575 ConnectHelper(); | 548 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) { |
576 | 549 CreateCastSocketSecure(); |
577 EXPECT_CALL(mock_ssl_socket(), | 550 |
578 Write(A<net::IOBuffer*>(), | 551 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
579 39, | 552 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED); |
580 A<const net::CompletionCallback&>())) | 553 |
581 .Times(1) | 554 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
582 .WillOnce(Return(39)); | 555 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
583 EXPECT_CALL(handler_, OnWriteComplete(39)); | 556 base::Unretained(&handler_))); |
584 socket_->SendMessage(test_message_, | 557 RunPendingTasks(); |
585 base::Bind(&CompleteHandler::OnWriteComplete, | 558 |
586 base::Unretained(&handler_))); | 559 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
587 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 560 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
588 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 561 } |
589 } | 562 |
590 | 563 // Test connection error - SSL connect fails (async) |
591 // Tests writing multiple messages. | 564 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) { |
592 TEST_F(CastSocketTest, TestWriteMany) { | 565 CreateCastSocketSecure(); |
593 CreateCastSocket(); | 566 |
594 ConnectHelper(); | 567 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
595 std::string messages[4]; | 568 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED); |
596 messages[0] = "Hello, World!"; | 569 |
597 messages[1] = "Goodbye, World!"; | 570 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
598 messages[2] = "Hello, Sky!"; | 571 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
599 messages[3] = "Goodbye, Volcano!"; | 572 base::Unretained(&handler_))); |
600 int sizes[4] = {39, 41, 37, 43}; | 573 RunPendingTasks(); |
601 MessageInfo message_info[4]; | 574 |
602 net::CompletionCallback write_callback; | 575 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
603 | 576 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
604 for (int i = 0; i < 4; i++) { | 577 } |
605 EXPECT_CALL(mock_ssl_socket(), | 578 |
606 Write(A<net::IOBuffer*>(), | 579 // Test connection error - cert extraction error (async) |
607 sizes[i], | 580 TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) { |
608 A<const net::CompletionCallback&>())) | 581 CreateCastSocket(); |
609 .WillRepeatedly(DoAll(SaveArg<2>(&write_callback), | 582 socket_->SetupTcp1Connect(net::ASYNC, net::OK); |
610 Return(net::ERR_IO_PENDING))); | 583 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); |
611 EXPECT_CALL(handler_, OnWriteComplete(sizes[i])); | 584 // Set cert extraction to fail |
| 585 socket_->SetExtractCertResult(false); |
| 586 |
| 587 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); |
| 588 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 589 base::Unretained(&handler_))); |
| 590 RunPendingTasks(); |
| 591 |
| 592 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 593 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 594 } |
| 595 |
| 596 // Test connection error - cert extraction error (sync) |
| 597 TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) { |
| 598 CreateCastSocket(); |
| 599 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
| 600 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID); |
| 601 // Set cert extraction to fail |
| 602 socket_->SetExtractCertResult(false); |
| 603 |
| 604 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); |
| 605 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 606 base::Unretained(&handler_))); |
| 607 RunPendingTasks(); |
| 608 |
| 609 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 610 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 611 } |
| 612 |
| 613 // Test connection error - challenge send fails |
| 614 TEST_F(CastSocketTest, TestConnectChallengeSendError) { |
| 615 CreateCastSocketSecure(); |
| 616 |
| 617 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
| 618 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); |
| 619 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED); |
| 620 |
| 621 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
| 622 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 623 base::Unretained(&handler_))); |
| 624 RunPendingTasks(); |
| 625 |
| 626 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 628 } |
| 629 |
| 630 // Test connection error - challenge reply receive fails |
| 631 TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) { |
| 632 CreateCastSocketSecure(); |
| 633 |
| 634 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
| 635 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); |
| 636 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); |
| 637 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_FAILED); |
| 638 |
| 639 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
| 640 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 641 base::Unretained(&handler_))); |
| 642 RunPendingTasks(); |
| 643 |
| 644 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 645 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 646 } |
| 647 |
| 648 // Test connection error - challenge reply verification fails |
| 649 TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) { |
| 650 CreateCastSocketSecure(); |
| 651 |
| 652 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); |
| 653 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); |
| 654 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); |
| 655 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_); |
| 656 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); |
| 657 socket_->SetVerifyChallengeResult(false); |
| 658 |
| 659 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); |
| 660 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 661 base::Unretained(&handler_))); |
| 662 RunPendingTasks(); |
| 663 |
| 664 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 665 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 666 } |
| 667 |
| 668 // Test write success - single message (async) |
| 669 TEST_F(CastSocketTest, TestWriteAsync) { |
| 670 CreateCastSocket(); |
| 671 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]); |
| 672 ConnectHelper(); |
| 673 |
| 674 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); |
| 675 socket_->SendMessage(test_messages_[0], |
| 676 base::Bind(&CompleteHandler::OnWriteComplete, |
| 677 base::Unretained(&handler_))); |
| 678 RunPendingTasks(); |
| 679 |
| 680 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 681 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 682 } |
| 683 |
| 684 // Test write success - single message (sync) |
| 685 TEST_F(CastSocketTest, TestWriteSync) { |
| 686 CreateCastSocket(); |
| 687 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]); |
| 688 ConnectHelper(); |
| 689 |
| 690 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); |
| 691 socket_->SendMessage(test_messages_[0], |
| 692 base::Bind(&CompleteHandler::OnWriteComplete, |
| 693 base::Unretained(&handler_))); |
| 694 RunPendingTasks(); |
| 695 |
| 696 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 697 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 698 } |
| 699 |
| 700 // Test write success - single message sent in multiple chunks (async) |
| 701 TEST_F(CastSocketTest, TestWriteChunkedAsync) { |
| 702 CreateCastSocket(); |
| 703 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2); |
| 704 ConnectHelper(); |
| 705 |
| 706 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); |
| 707 socket_->SendMessage(test_messages_[0], |
| 708 base::Bind(&CompleteHandler::OnWriteComplete, |
| 709 base::Unretained(&handler_))); |
| 710 RunPendingTasks(); |
| 711 |
| 712 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 713 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 714 } |
| 715 |
| 716 // Test write success - single message sent in multiple chunks (sync) |
| 717 TEST_F(CastSocketTest, TestWriteChunkedSync) { |
| 718 CreateCastSocket(); |
| 719 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2); |
| 720 ConnectHelper(); |
| 721 |
| 722 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); |
| 723 socket_->SendMessage(test_messages_[0], |
| 724 base::Bind(&CompleteHandler::OnWriteComplete, |
| 725 base::Unretained(&handler_))); |
| 726 RunPendingTasks(); |
| 727 |
| 728 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 729 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 730 } |
| 731 |
| 732 // Test write success - multiple messages (async) |
| 733 TEST_F(CastSocketTest, TestWriteManyAsync) { |
| 734 CreateCastSocket(); |
| 735 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
| 736 size_t msg_size = test_proto_strs_[i].size(); |
| 737 socket_->AddWriteResult(net::ASYNC, msg_size); |
| 738 EXPECT_CALL(handler_, OnWriteComplete(msg_size)); |
612 } | 739 } |
613 | 740 ConnectHelper(); |
614 for (int i = 0; i < 4; i++) { | 741 |
615 message_info[i].namespace_ = "urn:test"; | 742 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
616 message_info[i].source_id = "1"; | 743 socket_->SendMessage(test_messages_[i], |
617 message_info[i].destination_id = "2"; | |
618 message_info[i].data.reset(new base::StringValue(messages[i])); | |
619 socket_->SendMessage(message_info[i], | |
620 base::Bind(&CompleteHandler::OnWriteComplete, | 744 base::Bind(&CompleteHandler::OnWriteComplete, |
621 base::Unretained(&handler_))); | 745 base::Unretained(&handler_))); |
622 } | 746 } |
623 for (int i = 0; i < 4; i++) { | 747 RunPendingTasks(); |
624 write_callback.Run(sizes[i]); | 748 |
| 749 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 750 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 751 } |
| 752 |
| 753 // Test write success - multiple messages (sync) |
| 754 TEST_F(CastSocketTest, TestWriteManySync) { |
| 755 CreateCastSocket(); |
| 756 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
| 757 size_t msg_size = test_proto_strs_[i].size(); |
| 758 socket_->AddWriteResult(net::SYNCHRONOUS, msg_size); |
| 759 EXPECT_CALL(handler_, OnWriteComplete(msg_size)); |
625 } | 760 } |
626 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 761 ConnectHelper(); |
627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 762 |
628 } | 763 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
629 | 764 socket_->SendMessage(test_messages_[i], |
630 // Tests error on writing. | 765 base::Bind(&CompleteHandler::OnWriteComplete, |
631 TEST_F(CastSocketTest, TestWriteError) { | 766 base::Unretained(&handler_))); |
632 CreateCastSocket(); | 767 } |
633 ConnectHelper(); | 768 RunPendingTasks(); |
634 net::CompletionCallback write_callback; | 769 |
635 | 770 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
636 EXPECT_CALL(mock_ssl_socket(), | 771 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
637 Write(A<net::IOBuffer*>(), | 772 } |
638 39, | 773 |
639 A<const net::CompletionCallback&>())) | 774 // Test write error - not connected |
640 .Times(1) | 775 TEST_F(CastSocketTest, TestWriteErrorNotConnected) { |
641 .WillOnce(DoAll(SaveArg<2>(&write_callback), | 776 CreateCastSocket(); |
642 Return(net::ERR_SOCKET_NOT_CONNECTED))); | 777 |
643 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)); | 778 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
| 779 socket_->SendMessage(test_messages_[0], |
| 780 base::Bind(&CompleteHandler::OnWriteComplete, |
| 781 base::Unretained(&handler_))); |
| 782 |
| 783 EXPECT_EQ(cast_channel::READY_STATE_NONE, socket_->ready_state()); |
| 784 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 785 } |
| 786 |
| 787 // Test write error - very large message |
| 788 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) { |
| 789 CreateCastSocket(); |
| 790 ConnectHelper(); |
| 791 |
| 792 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
| 793 size_t size = kMaxMessageSize + 1; |
| 794 test_messages_[0].data.reset( |
| 795 new base::StringValue(std::string(size, 'a'))); |
| 796 socket_->SendMessage(test_messages_[0], |
| 797 base::Bind(&CompleteHandler::OnWriteComplete, |
| 798 base::Unretained(&handler_))); |
| 799 |
| 800 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 801 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 802 |
| 803 } |
| 804 |
| 805 // Test write error - network error (sync) |
| 806 TEST_F(CastSocketTest, TestWriteNetworkErrorSync) { |
| 807 CreateCastSocket(); |
| 808 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED); |
| 809 ConnectHelper(); |
| 810 |
| 811 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
644 EXPECT_CALL(mock_delegate_, | 812 EXPECT_CALL(mock_delegate_, |
645 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | 813 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
646 socket_->SendMessage(test_message_, | 814 socket_->SendMessage(test_messages_[0], |
647 base::Bind(&CompleteHandler::OnWriteComplete, | 815 base::Bind(&CompleteHandler::OnWriteComplete, |
648 base::Unretained(&handler_))); | 816 base::Unretained(&handler_))); |
| 817 RunPendingTasks(); |
| 818 |
649 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 819 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
650 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | 820 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
651 } | 821 } |
652 | 822 |
653 // Tests reading a single message. | 823 // Test write error - network error (async) |
654 TEST_F(CastSocketTest, TestRead) { | 824 TEST_F(CastSocketTest, TestWriteErrorAsync) { |
655 CreateCastSocket(); | 825 CreateCastSocket(); |
656 | 826 socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED); |
657 net::CompletionCallback connect_callback1; | 827 ConnectHelper(); |
658 net::CompletionCallback connect_callback2; | 828 |
659 net::CompletionCallback read_callback; | 829 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
660 | 830 EXPECT_CALL(mock_delegate_, |
661 std::string message_data; | 831 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
662 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data)); | 832 socket_->SendMessage(test_messages_[0], |
663 | 833 base::Bind(&CompleteHandler::OnWriteComplete, |
664 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); | 834 base::Unretained(&handler_))); |
665 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); | 835 RunPendingTasks(); |
666 | 836 |
667 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 837 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
668 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), | 838 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
669 A<int>(), | 839 } |
670 A<const net::CompletionCallback&>())) | 840 |
671 .Times(3) | 841 // Test write error - 0 bytes written should be considered an error |
672 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), | 842 TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) { |
673 Return(net::ERR_IO_PENDING))); | 843 CreateCastSocket(); |
674 | 844 socket_->AddWriteResult(net::SYNCHRONOUS, 0); |
675 // Expect the test message to be read and invoke the delegate. | 845 ConnectHelper(); |
| 846 |
| 847 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
| 848 EXPECT_CALL(mock_delegate_, |
| 849 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
| 850 socket_->SendMessage(test_messages_[0], |
| 851 base::Bind(&CompleteHandler::OnWriteComplete, |
| 852 base::Unretained(&handler_))); |
| 853 RunPendingTasks(); |
| 854 |
| 855 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 856 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 857 } |
| 858 |
| 859 // Test that when an error occurrs in one write, write callback is invoked for |
| 860 // all pending writes with the error |
| 861 TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) { |
| 862 CreateCastSocket(); |
| 863 socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED); |
| 864 ConnectHelper(); |
| 865 |
| 866 const int num_writes = arraysize(test_messages_); |
| 867 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)) |
| 868 .Times(num_writes); |
| 869 EXPECT_CALL(mock_delegate_, |
| 870 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
| 871 for (int i = 0; i < num_writes; i++) { |
| 872 socket_->SendMessage(test_messages_[i], |
| 873 base::Bind(&CompleteHandler::OnWriteComplete, |
| 874 base::Unretained(&handler_))); |
| 875 } |
| 876 RunPendingTasks(); |
| 877 |
| 878 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 879 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 880 } |
| 881 |
| 882 // Test read success - single message (async) |
| 883 TEST_F(CastSocketTest, TestReadAsync) { |
| 884 CreateCastSocket(); |
| 885 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0]); |
676 EXPECT_CALL(mock_delegate_, | 886 EXPECT_CALL(mock_delegate_, |
677 OnMessage(socket_.get(), A<const MessageInfo&>())); | 887 OnMessage(socket_.get(), A<const MessageInfo&>())); |
678 | 888 ConnectHelper(); |
679 // Connect the socket. | 889 |
680 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 890 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
681 base::Unretained(&handler_))); | 891 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
682 connect_callback1.Run(net::OK); | 892 } |
683 connect_callback2.Run(net::OK); | 893 |
684 | 894 // Test read success - single message (sync) |
685 // Put the test header and message into the io_buffers and invoke the read | 895 TEST_F(CastSocketTest, TestReadSync) { |
686 // callbacks. | 896 CreateCastSocket(); |
687 memcpy(socket_->header_read_buffer_->StartOfBuffer(), | 897 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]); |
688 message_data.c_str(), 4); | 898 EXPECT_CALL(mock_delegate_, |
689 read_callback.Run(4); | 899 OnMessage(socket_.get(), A<const MessageInfo&>())); |
690 memcpy(socket_->body_read_buffer_->StartOfBuffer(), | 900 ConnectHelper(); |
691 message_data.c_str() + 4, 35); | 901 |
692 read_callback.Run(35); | 902 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
693 | 903 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
694 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 904 } |
695 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 905 |
696 } | 906 // Test read success - single message received in multiple chunks (async) |
697 | 907 TEST_F(CastSocketTest, TestReadChunkedAsync) { |
698 // Tests reading multiple messages. | 908 CreateCastSocket(); |
699 TEST_F(CastSocketTest, TestReadMany) { | 909 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2); |
700 CreateCastSocket(); | 910 EXPECT_CALL(mock_delegate_, |
701 | 911 OnMessage(socket_.get(), A<const MessageInfo&>())); |
702 net::CompletionCallback connect_callback1; | 912 ConnectHelper(); |
703 net::CompletionCallback connect_callback2; | 913 |
704 net::CompletionCallback read_callback; | 914 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
705 | 915 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
706 std::string messages[4]; | 916 } |
707 messages[0] = "Hello, World!"; | 917 |
708 messages[1] = "Goodbye, World!"; | 918 // Test read success - single message received in multiple chunks (sync) |
709 messages[2] = "Hello, Sky!"; | 919 TEST_F(CastSocketTest, TestReadChunkedSync) { |
710 messages[3] = "Goodbye, Volcano!"; | 920 CreateCastSocket(); |
711 int sizes[4] = {35, 37, 33, 39}; | 921 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2); |
712 std::string message_data[4]; | 922 EXPECT_CALL(mock_delegate_, |
713 | 923 OnMessage(socket_.get(), A<const MessageInfo&>())); |
714 // Set up test data | 924 ConnectHelper(); |
715 for (int i = 0; i < 4; i++) { | 925 |
716 test_proto_.set_payload_utf8(messages[i]); | 926 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
717 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data[i])); | 927 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
718 } | 928 } |
719 | 929 |
720 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); | 930 // Test read success - multiple messages (async) |
721 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); | 931 TEST_F(CastSocketTest, TestReadManyAsync) { |
722 | 932 CreateCastSocket(); |
723 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 933 size_t num_reads = arraysize(test_proto_strs_); |
724 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), | 934 for (size_t i = 0; i < num_reads; i++) |
725 A<int>(), | 935 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]); |
726 A<const net::CompletionCallback&>())) | 936 EXPECT_CALL(mock_delegate_, |
727 .Times(9) | 937 OnMessage(socket_.get(), A<const MessageInfo&>())) |
728 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), | 938 .Times(num_reads); |
729 Return(net::ERR_IO_PENDING))); | 939 ConnectHelper(); |
730 | 940 |
731 // Expect the test messages to be read and invoke the delegate. | 941 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
732 EXPECT_CALL(mock_delegate_, OnMessage(socket_.get(), | 942 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
733 A<const MessageInfo&>())) | 943 } |
734 .Times(4); | 944 |
735 | 945 // Test read success - multiple messages (sync) |
736 // Connect the socket. | 946 TEST_F(CastSocketTest, TestReadManySync) { |
737 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 947 CreateCastSocket(); |
738 base::Unretained(&handler_))); | 948 size_t num_reads = arraysize(test_proto_strs_); |
739 connect_callback1.Run(net::OK); | 949 for (size_t i = 0; i < num_reads; i++) |
740 connect_callback2.Run(net::OK); | 950 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]); |
741 | 951 EXPECT_CALL(mock_delegate_, |
742 // Put the test headers and messages into the io_buffer and invoke the read | 952 OnMessage(socket_.get(), A<const MessageInfo&>())) |
743 // callbacks. | 953 .Times(num_reads); |
744 for (int i = 0; i < 4; i++) { | 954 ConnectHelper(); |
745 memcpy(socket_->header_read_buffer_->StartOfBuffer(), | 955 |
746 message_data[i].c_str(), 4); | 956 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
747 read_callback.Run(4); | 957 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
748 memcpy(socket_->body_read_buffer_->StartOfBuffer(), | 958 } |
749 message_data[i].c_str() + 4, sizes[i]); | 959 |
750 read_callback.Run(sizes[i]); | 960 // Test read error - network error (async) |
751 } | 961 TEST_F(CastSocketTest, TestReadErrorAsync) { |
752 | 962 CreateCastSocket(); |
753 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 963 socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED); |
754 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 964 EXPECT_CALL(mock_delegate_, |
755 } | 965 OnError(socket_.get(), |
756 | 966 cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
757 // Tests error on reading. | 967 ConnectHelper(); |
758 TEST_F(CastSocketTest, TestReadError) { | |
759 CreateCastSocket(); | |
760 | |
761 net::CompletionCallback connect_callback1; | |
762 net::CompletionCallback connect_callback2; | |
763 net::CompletionCallback read_callback; | |
764 | |
765 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); | |
766 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); | |
767 | |
768 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | |
769 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), | |
770 A<int>(), | |
771 A<const net::CompletionCallback&>())) | |
772 .WillOnce(DoAll(SaveArg<2>(&read_callback), | |
773 Return(net::ERR_IO_PENDING))); | |
774 EXPECT_CALL(mock_delegate_, | |
775 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
776 | |
777 // Connect the socket. | |
778 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
779 base::Unretained(&handler_))); | |
780 connect_callback1.Run(net::OK); | |
781 connect_callback2.Run(net::OK); | |
782 | |
783 // Cause an error. | |
784 read_callback.Run(net::ERR_SOCKET_NOT_CONNECTED); | |
785 | 968 |
786 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 969 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
787 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | 970 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
788 } | 971 } |
789 | 972 |
| 973 // Test read error - network error (sync) |
| 974 TEST_F(CastSocketTest, TestReadErrorSync) { |
| 975 CreateCastSocket(); |
| 976 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED); |
| 977 EXPECT_CALL(mock_delegate_, |
| 978 OnError(socket_.get(), |
| 979 cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
| 980 ConnectHelper(); |
| 981 |
| 982 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 983 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 984 } |
| 985 |
| 986 // Test read error - header parse error |
| 987 TEST_F(CastSocketTest, TestReadHeaderParseError) { |
| 988 CreateCastSocket(); |
| 989 uint32 body_size = base::HostToNet32(kMaxMessageSize + 1); |
| 990 // TODO(munjal): Add a method to cast_message_util.h to serialize messages |
| 991 char header[sizeof(body_size)]; |
| 992 memcpy(&header, &body_size, arraysize(header)); |
| 993 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); |
| 994 EXPECT_CALL(mock_delegate_, |
| 995 OnError(socket_.get(), |
| 996 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE)); |
| 997 ConnectHelper(); |
| 998 |
| 999 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 1000 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, |
| 1001 socket_->error_state()); |
| 1002 } |
| 1003 |
| 1004 // Test read error - body parse error |
| 1005 TEST_F(CastSocketTest, TestReadBodyParseError) { |
| 1006 CreateCastSocket(); |
| 1007 char body[] = "some body"; |
| 1008 uint32 body_size = base::HostToNet32(arraysize(body)); |
| 1009 char header[sizeof(body_size)]; |
| 1010 memcpy(&header, &body_size, arraysize(header)); |
| 1011 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); |
| 1012 socket_->AddReadResult(net::SYNCHRONOUS, body, arraysize(body)); |
| 1013 EXPECT_CALL(mock_delegate_, |
| 1014 OnError(socket_.get(), |
| 1015 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE)); |
| 1016 ConnectHelper(); |
| 1017 |
| 1018 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 1019 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, |
| 1020 socket_->error_state()); |
| 1021 } |
| 1022 |
790 } // namespace cast_channel | 1023 } // namespace cast_channel |
791 } // namespace api | 1024 } // namespace api |
792 } // namespace extensions | 1025 } // namespace extensions |
OLD | NEW |