Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(820)

Side by Side Diff: chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc

Issue 35443002: Update CastSocket connection flow to check for receiver credentials. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" 7 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h"
8 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" 8 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h"
9 #include "net/base/address_list.h" 9 #include "net/base/address_list.h"
10 #include "net/base/capturing_net_log.h" 10 #include "net/base/capturing_net_log.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 CompleteHandler() {} 73 CompleteHandler() {}
74 MOCK_METHOD1(OnCloseComplete, void(int result)); 74 MOCK_METHOD1(OnCloseComplete, void(int result));
75 MOCK_METHOD1(OnConnectComplete, void(int result)); 75 MOCK_METHOD1(OnConnectComplete, void(int result));
76 MOCK_METHOD1(OnWriteComplete, void(int result)); 76 MOCK_METHOD1(OnWriteComplete, void(int result));
77 private: 77 private:
78 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); 78 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
79 }; 79 };
80 80
81 class TestCastSocket : public CastSocket { 81 class TestCastSocket : public CastSocket {
82 public: 82 public:
83 explicit TestCastSocket(MockCastSocketDelegate* delegate) : 83 static scoped_ptr<TestCastSocket> Create(
84 CastSocket("abcdefg", GURL("cast://192.0.0.1:8009"), delegate, 84 MockCastSocketDelegate* delegate) {
85 return scoped_ptr<TestCastSocket>(
86 new TestCastSocket(delegate, "cast://192.0.0.1:8009"));
87 }
88
89 static scoped_ptr<TestCastSocket> CreateSecure(
90 MockCastSocketDelegate* delegate) {
91 return scoped_ptr<TestCastSocket>(
92 new TestCastSocket(delegate, "casts://192.0.0.1:8009"));
93 }
94
95 explicit TestCastSocket(MockCastSocketDelegate* delegate,
96 const std::string& url) :
97 CastSocket("abcdefg", GURL(url), delegate,
85 &capturing_net_log_), 98 &capturing_net_log_),
86 mock_tcp_socket_(new MockTCPClientSocket()), 99 mock_tcp_socket_(new MockTCPClientSocket()),
87 mock_ssl_socket_(new MockSSLClientSocket()), 100 mock_ssl_socket_(new MockSSLClientSocket()),
88 owns_tcp_socket_(true), 101 owns_tcp_socket_(true),
89 owns_ssl_socket_(true), 102 owns_ssl_socket_(true),
90 extract_cert_result_(true) { 103 extract_cert_result_(true),
104 send_auth_challenge_result_(net::ERR_IO_PENDING),
105 read_auth_challenge_reply_result_(net::ERR_IO_PENDING),
106 challenge_reply_result_(true) {
91 } 107 }
92 108
93 virtual ~TestCastSocket() { 109 virtual ~TestCastSocket() {
94 if (owns_tcp_socket_) { 110 if (owns_tcp_socket_) {
95 DCHECK(mock_tcp_socket_); 111 DCHECK(mock_tcp_socket_);
96 delete mock_tcp_socket_; 112 delete mock_tcp_socket_;
97 } 113 }
98 if (owns_ssl_socket_) { 114 if (owns_ssl_socket_) {
99 DCHECK(mock_ssl_socket_); 115 DCHECK(mock_ssl_socket_);
100 delete mock_ssl_socket_; 116 delete mock_ssl_socket_;
(...skipping 12 matching lines...) Expand all
113 owns_tcp_socket_ = true; 129 owns_tcp_socket_ = true;
114 mock_tcp_socket_ = new MockTCPClientSocket(); 130 mock_tcp_socket_ = new MockTCPClientSocket();
115 owns_ssl_socket_ = true; 131 owns_ssl_socket_ = true;
116 mock_ssl_socket_ = new MockSSLClientSocket(); 132 mock_ssl_socket_ = new MockSSLClientSocket();
117 } 133 }
118 134
119 void SetExtractCertResult(bool value) { 135 void SetExtractCertResult(bool value) {
120 extract_cert_result_ = value; 136 extract_cert_result_ = value;
121 } 137 }
122 138
139 void SetSendAuthChallengeResult(int result) {
140 send_auth_challenge_result_ = result;
141 }
142
143 void SetReadAuthChallengeReplyResult(int result) {
144 read_auth_challenge_reply_result_ = result;
145 }
146
147 void SetChallengeReplyResult(bool value) {
148 challenge_reply_result_ = value;
149 }
150
123 MockTCPClientSocket* mock_tcp_socket_; 151 MockTCPClientSocket* mock_tcp_socket_;
124 MockSSLClientSocket* mock_ssl_socket_; 152 MockSSLClientSocket* mock_ssl_socket_;
125 153
126 protected: 154 protected:
127 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { 155 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
128 owns_tcp_socket_ = false; 156 owns_tcp_socket_ = false;
129 return scoped_ptr<net::TCPClientSocket>(mock_tcp_socket_); 157 return scoped_ptr<net::TCPClientSocket>(mock_tcp_socket_);
130 } 158 }
131 159
132 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket() OVERRIDE { 160 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket() OVERRIDE {
133 owns_ssl_socket_ = false; 161 owns_ssl_socket_ = false;
134 return scoped_ptr<net::SSLClientSocket>(mock_ssl_socket_); 162 return scoped_ptr<net::SSLClientSocket>(mock_ssl_socket_);
135 } 163 }
136 164
137 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { 165 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE {
138 if (extract_cert_result_) 166 if (extract_cert_result_)
139 cert->assign("dummy_test_cert"); 167 cert->assign("dummy_test_cert");
140 return extract_cert_result_; 168 return extract_cert_result_;
141 } 169 }
142 170
171 virtual int SendAuthChallenge() OVERRIDE {
172 return send_auth_challenge_result_;
173 }
174
175 virtual int ReadAuthChallengeReply() OVERRIDE {
176 return read_auth_challenge_reply_result_;
177 }
178
179 virtual bool VerifyChallengeReply() OVERRIDE {
180 return challenge_reply_result_;
181 }
182
143 private: 183 private:
144 net::CapturingNetLog capturing_net_log_; 184 net::CapturingNetLog capturing_net_log_;
145 // Whether this object or the parent owns |mock_tcp_socket_|. 185 // Whether this object or the parent owns |mock_tcp_socket_|.
146 bool owns_tcp_socket_; 186 bool owns_tcp_socket_;
147 // Whether this object or the parent owns |mock_ssl_socket_|. 187 // Whether this object or the parent owns |mock_ssl_socket_|.
148 bool owns_ssl_socket_; 188 bool owns_ssl_socket_;
149 // Simulated result of peer cert extraction. 189 // Simulated result of peer cert extraction.
150 bool extract_cert_result_; 190 bool extract_cert_result_;
191 // Simulated result to be returned by SendAuthChallenge.
192 int send_auth_challenge_result_;
193 // Simulated result to be returned by ReadAuthChallengeReply.
194 int read_auth_challenge_reply_result_;
195 // Simulated result of verifying challenge reply.
196 bool challenge_reply_result_;
151 }; 197 };
152 198
153 class CastSocketTest : public testing::Test { 199 class CastSocketTest : public testing::Test {
154 public: 200 public:
155 CastSocketTest() {} 201 CastSocketTest() {}
156 virtual ~CastSocketTest() {} 202 virtual ~CastSocketTest() {}
157 203
158 virtual void SetUp() OVERRIDE { 204 virtual void SetUp() OVERRIDE {
159 socket_.reset(new TestCastSocket(&mock_delegate_));
160 test_message_.namespace_ = "urn:test"; 205 test_message_.namespace_ = "urn:test";
161 test_message_.source_id = "1"; 206 test_message_.source_id = "1";
162 test_message_.destination_id = "2"; 207 test_message_.destination_id = "2";
163 test_message_.data.reset(new base::StringValue("Hello, World!")); 208 test_message_.data.reset(new base::StringValue("Hello, World!"));
164 ASSERT_TRUE(MessageInfoToCastMessage(test_message_, &test_proto_)); 209 ASSERT_TRUE(MessageInfoToCastMessage(test_message_, &test_proto_));
165 } 210 }
166 211
167 virtual void TearDown() OVERRIDE { 212 virtual void TearDown() OVERRIDE {
168 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); 213 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
169 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, 214 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
170 base::Unretained(&handler_))); 215 base::Unretained(&handler_)));
171 } 216 }
172 217
173 // Sets an expectation on the TCP socket Connect method. Connect method is 218 void CreateCastSocket() {
174 // setup to return net::ERR_IO_PENDING and store the callback passed to it 219 socket_ = TestCastSocket::Create(&mock_delegate_);
175 // in |callback|. 220 }
176 void ExpectTCPConnect(net::CompletionCallback* callback) { 221
222 void CreateCastSocketSecure() {
223 socket_ = TestCastSocket::CreateSecure(&mock_delegate_);
224 }
225
226 // Sets an expectation that TCPClientSocket::Connect is called and
227 // returns |result| and stores the callback passed to it in |callback|.
228 void ExpectTcpConnect(net::CompletionCallback* callback, int result) {
177 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) 229 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>()))
178 .Times(1) 230 .Times(1)
179 .WillOnce(DoAll(SaveArg<0>(callback), Return(net::ERR_IO_PENDING))); 231 .WillOnce(DoAll(SaveArg<0>(callback), Return(result)));
180 } 232 }
181 233
182 // Sets an expectation on the SSL socket Connect method. Connect method is 234 // Same as ExpectTcpConnect but to return net::ERR_IO_PENDING.
183 // setup to return net::ERR_IO_PENDING and store the callback passed to it 235 void ExpectTcpConnectPending(net::CompletionCallback* callback) {
184 // in |callback|. 236 ExpectTcpConnect(callback, net::ERR_IO_PENDING);
185 void ExpectSSLConnect(net::CompletionCallback* callback) { 237 }
238
239 // Sets an expectation that SSLClientSocket::Connect is called and
240 // returns |result| and stores the callback passed to it in |callback|.
241 void ExpectSslConnect(net::CompletionCallback* callback, int result) {
186 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>())) 242 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>()))
187 .Times(1) 243 .Times(1)
188 .WillOnce(DoAll(SaveArg<0>(callback), Return(net::ERR_IO_PENDING))); 244 .WillOnce(DoAll(SaveArg<0>(callback), Return(result)));
189 } 245 }
190 246
191 // Sets an expectation on the SSL socket Read method. Read method is setup 247 // Same as ExpectSslConnect but to return net::ERR_IO_PENDING.
192 // to return net::ERR_IO_PENDING and to be called |times| number of times. 248 void ExpectSslConnectPending(net::CompletionCallback* callback) {
193 void ExpectSSLRead(int times) { 249 ExpectSslConnect(callback, net::ERR_IO_PENDING);
250 }
251
252 // Sets an expectation that SSLClientSocket::Read is called |times| number
253 // of times and returns net::ERR_IO_PENDING.
254 void ExpectSslRead(int times) {
194 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), 255 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(),
195 A<int>(), 256 A<int>(),
196 A<const net::CompletionCallback&>())) 257 A<const net::CompletionCallback&>()))
197 .Times(times) 258 .Times(times)
198 .WillOnce(Return(net::ERR_IO_PENDING)); 259 .WillOnce(Return(net::ERR_IO_PENDING));
199 } 260 }
200 261
201 // Sets expectations when the socket is connected. Connecting the socket also 262 // Sets up CastSocket::Connect to succeed.
202 // starts the read loop; we expect the call to Read(), but never fire the read 263 // Connecting the socket also starts the read loop; we expect the call to
203 // callback. 264 // Read(), but never fire the read callback.
204 void ConnectHelper() { 265 void ConnectHelper() {
205 net::CompletionCallback connect_callback1; 266 net::CompletionCallback connect_callback1;
206 net::CompletionCallback connect_callback2; 267 net::CompletionCallback connect_callback2;
207 268
208 ExpectTCPConnect(&connect_callback1); 269 ExpectTcpConnect(&connect_callback1, net::OK);
209 ExpectSSLConnect(&connect_callback2); 270 ExpectSslConnect(&connect_callback2, net::OK);
210 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 271 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
211 ExpectSSLRead(1); 272 ExpectSslRead(1);
212 273
213 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 274 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
214 base::Unretained(&handler_))); 275 base::Unretained(&handler_)));
215 connect_callback1.Run(net::OK);
216 connect_callback2.Run(net::OK);
217 276
218 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 277 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
219 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 278 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
220 } 279 }
221 280
222 protected: 281 protected:
223 MockTCPClientSocket& mock_tcp_socket() { 282 MockTCPClientSocket& mock_tcp_socket() {
224 MockTCPClientSocket* mock_socket = socket_->mock_tcp_socket_; 283 MockTCPClientSocket* mock_socket = socket_->mock_tcp_socket_;
225 DCHECK(mock_socket); 284 DCHECK(mock_socket);
226 return *mock_socket; 285 return *mock_socket;
227 } 286 }
228 287
229 MockSSLClientSocket& mock_ssl_socket() { 288 MockSSLClientSocket& mock_ssl_socket() {
230 MockSSLClientSocket* mock_socket = socket_->mock_ssl_socket_; 289 MockSSLClientSocket* mock_socket = socket_->mock_ssl_socket_;
231 DCHECK(mock_socket); 290 DCHECK(mock_socket);
232 return *mock_socket; 291 return *mock_socket;
233 } 292 }
234 293
294 void CallOnChallengeEvent(int result) {
295 socket_->OnChallengeEvent(result);
296 }
297
235 MockCastSocketDelegate mock_delegate_; 298 MockCastSocketDelegate mock_delegate_;
236 scoped_ptr<TestCastSocket> socket_; 299 scoped_ptr<TestCastSocket> socket_;
237 CompleteHandler handler_; 300 CompleteHandler handler_;
238 MessageInfo test_message_; 301 MessageInfo test_message_;
239 CastMessage test_proto_; 302 CastMessage test_proto_;
240 }; 303 };
241 304
242 // Tests URL parsing and validation. 305 // Tests URL parsing and validation.
243 TEST_F(CastSocketTest, TestCastURLs) { 306 TEST_F(CastSocketTest, TestCastURLs) {
307 CreateCastSocket();
244 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); 308 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009")));
245 EXPECT_FALSE(socket_->is_secure_); 309 EXPECT_FALSE(socket_->auth_required());
246 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); 310 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009");
247 311
248 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); 312 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345")));
249 EXPECT_TRUE(socket_->is_secure_); 313 EXPECT_TRUE(socket_->auth_required());
250 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:12345"); 314 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:12345");
251 315
252 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("http://192.0.0.1:12345"))); 316 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("http://192.0.0.1:12345")));
253 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:192.0.0.1:12345"))); 317 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:192.0.0.1:12345")));
254 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:///192.0.0.1:12345"))); 318 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:///192.0.0.1:12345")));
255 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:12345"))); 319 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:12345")));
256 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://abcd:8009"))); 320 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://abcd:8009")));
257 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:abcd"))); 321 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:abcd")));
258 EXPECT_FALSE(socket_->ParseChannelUrl(GURL(""))); 322 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("")));
259 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("foo"))); 323 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("foo")));
260 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:"))); 324 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast:")));
261 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); 325 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::")));
262 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); 326 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1")));
263 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); 327 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:")));
264 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); 328 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:")));
265 } 329 }
266 330
267 // Tests connecting and closing the socket. 331 // Tests connecting and closing the socket.
268 TEST_F(CastSocketTest, TestConnectAndClose) { 332 TEST_F(CastSocketTest, TestConnectAndClose) {
333 CreateCastSocket();
269 ConnectHelper(); 334 ConnectHelper();
270 335
271 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); 336 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
272 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, 337 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
273 base::Unretained(&handler_))); 338 base::Unretained(&handler_)));
274 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 339 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
275 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 340 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
276 } 341 }
277 342
278 // Test that when first connection attempt fails with certificate authority 343 // Tests that the following connection flow works:
279 // invalid error, a second connection attempt is made with peer cert 344 // - TCP connection succeeds (async)
280 // whitelisted. 345 // - SSL connection succeeds (async)
346 TEST_F(CastSocketTest, TestConnect) {
347 CreateCastSocket();
348
349 net::CompletionCallback connect_callback1;
350 net::CompletionCallback connect_callback2;
351
352 ExpectTcpConnectPending(&connect_callback1);
353 ExpectSslConnectPending(&connect_callback2);
354 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
355 ExpectSslRead(1);
356
357 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
358 base::Unretained(&handler_)));
359 connect_callback1.Run(net::OK);
360 connect_callback2.Run(net::OK);
361
362 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
363 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
364 }
365
366 // Test that the following connection flow works:
367 // - TCP connection succeeds (async)
368 // - SSL connection fails with cert error (async)
369 // - Cert is extracted successfully
370 // - Second TCP connection succeeds (async)
371 // - Second SSL connection succeeds (async)
281 TEST_F(CastSocketTest, TestTwoStepConnect) { 372 TEST_F(CastSocketTest, TestTwoStepConnect) {
373 CreateCastSocket();
374
282 // Expectations for the initial connect call 375 // Expectations for the initial connect call
283 net::CompletionCallback tcp_connect_callback1; 376 net::CompletionCallback tcp_connect_callback1;
284 net::CompletionCallback ssl_connect_callback1; 377 net::CompletionCallback ssl_connect_callback1;
285 378
286 ExpectTCPConnect(&tcp_connect_callback1); 379 ExpectTcpConnectPending(&tcp_connect_callback1);
287 ExpectSSLConnect(&ssl_connect_callback1); 380 ExpectSslConnectPending(&ssl_connect_callback1);
288 381
289 // Start connect flow 382 // Start connect flow
290 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 383 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
291 base::Unretained(&handler_))); 384 base::Unretained(&handler_)));
292 tcp_connect_callback1.Run(net::OK); 385 tcp_connect_callback1.Run(net::OK);
293 386
294 // Expectations for the second connect call 387 // Expectations for the second connect call
295 socket_->CreateNewSockets(); 388 socket_->CreateNewSockets();
296 net::CompletionCallback tcp_connect_callback2; 389 net::CompletionCallback tcp_connect_callback2;
297 net::CompletionCallback ssl_connect_callback2; 390 net::CompletionCallback ssl_connect_callback2;
298 ExpectTCPConnect(&tcp_connect_callback2); 391 ExpectTcpConnectPending(&tcp_connect_callback2);
299 ExpectSSLConnect(&ssl_connect_callback2); 392 ExpectSslConnectPending(&ssl_connect_callback2);
300 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); 393 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
301 ExpectSSLRead(1); 394 ExpectSslRead(1);
302 395
303 // Trigger callbacks for the first connect 396 // Trigger callbacks for the first connect
304 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); 397 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID);
305 398
306 // Trigger callbacks for the second connect 399 // Trigger callbacks for the second connect
307 tcp_connect_callback2.Run(net::OK); 400 tcp_connect_callback2.Run(net::OK);
308 ssl_connect_callback2.Run(net::OK); 401 ssl_connect_callback2.Run(net::OK);
309 402
310 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 403 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
311 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 404 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
312 } 405 }
313 406
314 // Test that connection will be attempted a maximum of 2 times even if the 407 // Test that the following connection flow works:
315 // second attempt also returns certificate authority invalid error. 408 // - TCP connection succeeds (async)
409 // - SSL connection fails with cert error (async)
410 // - Cert is extracted successfully
411 // - Second TCP connection succeeds (async)
412 // - Second SSL connection fails (async)
413 // - The flow should NOT be tried again
316 TEST_F(CastSocketTest, TestMaxTwoConnectAttempts) { 414 TEST_F(CastSocketTest, TestMaxTwoConnectAttempts) {
415 CreateCastSocket();
416
317 net::CompletionCallback tcp_connect_callback1; 417 net::CompletionCallback tcp_connect_callback1;
318 net::CompletionCallback ssl_connect_callback1; 418 net::CompletionCallback ssl_connect_callback1;
319 419
320 // Expectations for the initial connect call 420 // Expectations for the initial connect call
321 ExpectTCPConnect(&tcp_connect_callback1); 421 ExpectTcpConnectPending(&tcp_connect_callback1);
322 ExpectSSLConnect(&ssl_connect_callback1); 422 ExpectSslConnectPending(&ssl_connect_callback1);
323 423
324 // Start connect flow 424 // Start connect flow
325 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 425 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
326 base::Unretained(&handler_))); 426 base::Unretained(&handler_)));
327 tcp_connect_callback1.Run(net::OK); 427 tcp_connect_callback1.Run(net::OK);
328 428
329 socket_->CreateNewSockets(); 429 socket_->CreateNewSockets();
330 net::CompletionCallback tcp_connect_callback2; 430 net::CompletionCallback tcp_connect_callback2;
331 net::CompletionCallback ssl_connect_callback2; 431 net::CompletionCallback ssl_connect_callback2;
332 432
333 // Expectations for the second connect call 433 // Expectations for the second connect call
334 ExpectTCPConnect(&tcp_connect_callback2); 434 ExpectTcpConnectPending(&tcp_connect_callback2);
335 ExpectSSLConnect(&ssl_connect_callback2); 435 ExpectSslConnectPending(&ssl_connect_callback2);
336 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); 436 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
337 437
338 // Trigger callbacks for the first connect 438 // Trigger callbacks for the first connect
339 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); 439 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID);
340 440
341 // Trigger callbacks for the second connect 441 // Trigger callbacks for the second connect
342 tcp_connect_callback2.Run(net::OK); 442 tcp_connect_callback2.Run(net::OK);
343 ssl_connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); 443 ssl_connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID);
344 444
345 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 445 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
346 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 446 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
347 } 447 }
348 448
449 // Test that when cert extraction fails the connection flow stops.
349 TEST_F(CastSocketTest, TestCertExtractionFailure) { 450 TEST_F(CastSocketTest, TestCertExtractionFailure) {
451 CreateCastSocket();
452
350 net::CompletionCallback connect_callback1; 453 net::CompletionCallback connect_callback1;
351 net::CompletionCallback connect_callback2; 454 net::CompletionCallback connect_callback2;
352 455
353 ExpectTCPConnect(&connect_callback1); 456 ExpectTcpConnectPending(&connect_callback1);
354 ExpectSSLConnect(&connect_callback2); 457 ExpectSslConnectPending(&connect_callback2);
355 458
356 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 459 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
357 base::Unretained(&handler_))); 460 base::Unretained(&handler_)));
358 connect_callback1.Run(net::OK); 461 connect_callback1.Run(net::OK);
359 462
360 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); 463 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
361 464
362 // Set cert extraction to fail 465 // Set cert extraction to fail
363 socket_->SetExtractCertResult(false); 466 socket_->SetExtractCertResult(false);
364 // Attempt to connect results in ERR_CERT_AUTHORTY_INVALID 467 // Attempt to connect results in ERR_CERT_AUTHORTY_INVALID
365 connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); 468 connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID);
366 469
367 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 470 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
368 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 471 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
369 } 472 }
370 473
474 // Tests that the following connection flow works:
475 // - TCP connection succeeds (async)
476 // - SSL connection fails with cert error (async)
477 // - Cert is extracted successfully
478 // - Second TCP connection succeeds (async)
479 // - Second SSL connection succeeds (async)
480 // - Challenge request is sent (async)
481 // - Challenge response is received (async)
482 // - Credentials are verified successfuly
483 TEST_F(CastSocketTest, TestFullSecureConnectionFlowAsync) {
484 CreateCastSocketSecure();
485
486 net::CompletionCallback tcp_connect_callback1;
487 net::CompletionCallback ssl_connect_callback1;
488
489 // Expectations for the initial connect call
490 ExpectTcpConnectPending(&tcp_connect_callback1);
491 ExpectSslConnectPending(&ssl_connect_callback1);
492
493 // Start connect flow
494 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
495 base::Unretained(&handler_)));
496 tcp_connect_callback1.Run(net::OK);
497
498 socket_->CreateNewSockets();
499 net::CompletionCallback tcp_connect_callback2;
500 net::CompletionCallback ssl_connect_callback2;
501
502 // Expectations for the second connect call
503 ExpectTcpConnectPending(&tcp_connect_callback2);
504 ExpectSslConnectPending(&ssl_connect_callback2);
505 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
506 ExpectSslRead(1);
507
508 // Trigger callbacks for the first connect
509 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID);
510
511 // Trigger callbacks for the second connect
512 tcp_connect_callback2.Run(net::OK);
513 ssl_connect_callback2.Run(net::OK);
514
515 // Trigger callbacks for auth events.
516 CallOnChallengeEvent(net::OK); // Sent challenge
517 CallOnChallengeEvent(net::OK); // Received reply
518
519 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
520 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
521 }
522
523 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous.
524 TEST_F(CastSocketTest, TestFullSecureConnectionFlowSync) {
525 CreateCastSocketSecure();
526
527 net::CompletionCallback tcp_connect_callback;
528 net::CompletionCallback ssl_connect_callback;
529
530 // Expectations for the connect calls
531 ExpectTcpConnect(&tcp_connect_callback, net::OK);
532 ExpectSslConnect(&ssl_connect_callback, net::OK);
533 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
534 ExpectSslRead(1);
535
536 socket_->SetSendAuthChallengeResult(net::OK);
537 socket_->SetReadAuthChallengeReplyResult(net::OK);
538
539 // Start connect flow
540 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
541 base::Unretained(&handler_)));
542
543 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
544 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
545 }
546
371 // Tests writing a single message where the completion is signaled via 547 // Tests writing a single message where the completion is signaled via
372 // callback. 548 // callback.
373 TEST_F(CastSocketTest, TestWriteViaCallback) { 549 TEST_F(CastSocketTest, TestWriteViaCallback) {
550 CreateCastSocket();
374 ConnectHelper(); 551 ConnectHelper();
552
375 net::CompletionCallback write_callback; 553 net::CompletionCallback write_callback;
376 554
377 EXPECT_CALL(mock_ssl_socket(), 555 EXPECT_CALL(mock_ssl_socket(),
378 Write(A<net::IOBuffer*>(), 556 Write(A<net::IOBuffer*>(),
379 39, 557 39,
380 A<const net::CompletionCallback&>())) 558 A<const net::CompletionCallback&>()))
381 .Times(1) 559 .Times(1)
382 .WillOnce(DoAll(SaveArg<2>(&write_callback), 560 .WillOnce(DoAll(SaveArg<2>(&write_callback),
383 Return(net::ERR_IO_PENDING))); 561 Return(net::ERR_IO_PENDING)));
384 EXPECT_CALL(handler_, OnWriteComplete(39)); 562 EXPECT_CALL(handler_, OnWriteComplete(39));
385 socket_->SendMessage(test_message_, 563 socket_->SendMessage(test_message_,
386 base::Bind(&CompleteHandler::OnWriteComplete, 564 base::Bind(&CompleteHandler::OnWriteComplete,
387 base::Unretained(&handler_))); 565 base::Unretained(&handler_)));
388 write_callback.Run(39); 566 write_callback.Run(39);
389 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 567 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
390 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 568 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
391 } 569 }
392 570
393 // Tests writing a single message where the Write() returns directly. 571 // Tests writing a single message where the Write() returns directly.
394 TEST_F(CastSocketTest, TestWrite) { 572 TEST_F(CastSocketTest, TestWrite) {
573 CreateCastSocket();
395 ConnectHelper(); 574 ConnectHelper();
396 575
397 EXPECT_CALL(mock_ssl_socket(), 576 EXPECT_CALL(mock_ssl_socket(),
398 Write(A<net::IOBuffer*>(), 577 Write(A<net::IOBuffer*>(),
399 39, 578 39,
400 A<const net::CompletionCallback&>())) 579 A<const net::CompletionCallback&>()))
401 .Times(1) 580 .Times(1)
402 .WillOnce(Return(39)); 581 .WillOnce(Return(39));
403 EXPECT_CALL(handler_, OnWriteComplete(39)); 582 EXPECT_CALL(handler_, OnWriteComplete(39));
404 socket_->SendMessage(test_message_, 583 socket_->SendMessage(test_message_,
405 base::Bind(&CompleteHandler::OnWriteComplete, 584 base::Bind(&CompleteHandler::OnWriteComplete,
406 base::Unretained(&handler_))); 585 base::Unretained(&handler_)));
407 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 586 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
408 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 587 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
409 } 588 }
410 589
411 // Tests writing multiple messages. 590 // Tests writing multiple messages.
412 TEST_F(CastSocketTest, TestWriteMany) { 591 TEST_F(CastSocketTest, TestWriteMany) {
592 CreateCastSocket();
413 ConnectHelper(); 593 ConnectHelper();
414 std::string messages[4]; 594 std::string messages[4];
415 messages[0] = "Hello, World!"; 595 messages[0] = "Hello, World!";
416 messages[1] = "Goodbye, World!"; 596 messages[1] = "Goodbye, World!";
417 messages[2] = "Hello, Sky!"; 597 messages[2] = "Hello, Sky!";
418 messages[3] = "Goodbye, Volcano!"; 598 messages[3] = "Goodbye, Volcano!";
419 int sizes[4] = {39, 41, 37, 43}; 599 int sizes[4] = {39, 41, 37, 43};
420 MessageInfo message_info[4]; 600 MessageInfo message_info[4];
421 net::CompletionCallback write_callback; 601 net::CompletionCallback write_callback;
422 602
(...skipping 18 matching lines...) Expand all
441 } 621 }
442 for (int i = 0; i < 4; i++) { 622 for (int i = 0; i < 4; i++) {
443 write_callback.Run(sizes[i]); 623 write_callback.Run(sizes[i]);
444 } 624 }
445 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 625 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
446 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 626 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
447 } 627 }
448 628
449 // Tests error on writing. 629 // Tests error on writing.
450 TEST_F(CastSocketTest, TestWriteError) { 630 TEST_F(CastSocketTest, TestWriteError) {
631 CreateCastSocket();
451 ConnectHelper(); 632 ConnectHelper();
452 net::CompletionCallback write_callback; 633 net::CompletionCallback write_callback;
453 634
454 EXPECT_CALL(mock_ssl_socket(), 635 EXPECT_CALL(mock_ssl_socket(),
455 Write(A<net::IOBuffer*>(), 636 Write(A<net::IOBuffer*>(),
456 39, 637 39,
457 A<const net::CompletionCallback&>())) 638 A<const net::CompletionCallback&>()))
458 .Times(1) 639 .Times(1)
459 .WillOnce(DoAll(SaveArg<2>(&write_callback), 640 .WillOnce(DoAll(SaveArg<2>(&write_callback),
460 Return(net::ERR_SOCKET_NOT_CONNECTED))); 641 Return(net::ERR_SOCKET_NOT_CONNECTED)));
461 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)); 642 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED));
462 EXPECT_CALL(mock_delegate_, 643 EXPECT_CALL(mock_delegate_,
463 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); 644 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
464 socket_->SendMessage(test_message_, 645 socket_->SendMessage(test_message_,
465 base::Bind(&CompleteHandler::OnWriteComplete, 646 base::Bind(&CompleteHandler::OnWriteComplete,
466 base::Unretained(&handler_))); 647 base::Unretained(&handler_)));
467 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 648 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
468 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); 649 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
469 } 650 }
470 651
471 // Tests reading a single message. 652 // Tests reading a single message.
472 TEST_F(CastSocketTest, TestRead) { 653 TEST_F(CastSocketTest, TestRead) {
654 CreateCastSocket();
655
473 net::CompletionCallback connect_callback1; 656 net::CompletionCallback connect_callback1;
474 net::CompletionCallback connect_callback2; 657 net::CompletionCallback connect_callback2;
475 net::CompletionCallback read_callback; 658 net::CompletionCallback read_callback;
476 659
477 std::string message_data; 660 std::string message_data;
478 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data)); 661 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data));
479 662
480 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) 663 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>()))
481 .Times(1) 664 .Times(1)
482 .WillOnce(DoAll(SaveArg<0>(&connect_callback1), 665 .WillOnce(DoAll(SaveArg<0>(&connect_callback1),
(...skipping 28 matching lines...) Expand all
511 memcpy(socket_->body_read_buffer_->StartOfBuffer(), 694 memcpy(socket_->body_read_buffer_->StartOfBuffer(),
512 message_data.c_str() + 4, 35); 695 message_data.c_str() + 4, 35);
513 read_callback.Run(35); 696 read_callback.Run(35);
514 697
515 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 698 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
516 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 699 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
517 } 700 }
518 701
519 // Tests reading multiple messages. 702 // Tests reading multiple messages.
520 TEST_F(CastSocketTest, TestReadMany) { 703 TEST_F(CastSocketTest, TestReadMany) {
704 CreateCastSocket();
705
521 net::CompletionCallback connect_callback1; 706 net::CompletionCallback connect_callback1;
522 net::CompletionCallback connect_callback2; 707 net::CompletionCallback connect_callback2;
523 net::CompletionCallback read_callback; 708 net::CompletionCallback read_callback;
524 709
525 std::string messages[4]; 710 std::string messages[4];
526 messages[0] = "Hello, World!"; 711 messages[0] = "Hello, World!";
527 messages[1] = "Goodbye, World!"; 712 messages[1] = "Goodbye, World!";
528 messages[2] = "Hello, Sky!"; 713 messages[2] = "Hello, Sky!";
529 messages[3] = "Goodbye, Volcano!"; 714 messages[3] = "Goodbye, Volcano!";
530 int sizes[4] = {35, 37, 33, 39}; 715 int sizes[4] = {35, 37, 33, 39};
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 message_data[i].c_str() + 4, sizes[i]); 758 message_data[i].c_str() + 4, sizes[i]);
574 read_callback.Run(sizes[i]); 759 read_callback.Run(sizes[i]);
575 } 760 }
576 761
577 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 762 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
578 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 763 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
579 } 764 }
580 765
581 // Tests error on reading. 766 // Tests error on reading.
582 TEST_F(CastSocketTest, TestReadError) { 767 TEST_F(CastSocketTest, TestReadError) {
768 CreateCastSocket();
769
583 net::CompletionCallback connect_callback1; 770 net::CompletionCallback connect_callback1;
584 net::CompletionCallback connect_callback2; 771 net::CompletionCallback connect_callback2;
585 net::CompletionCallback read_callback; 772 net::CompletionCallback read_callback;
586 773
587 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) 774 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>()))
588 .Times(1) 775 .Times(1)
589 .WillOnce(DoAll(SaveArg<0>(&connect_callback1), 776 .WillOnce(DoAll(SaveArg<0>(&connect_callback1),
590 Return(net::ERR_IO_PENDING))); 777 Return(net::ERR_IO_PENDING)));
591 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>())) 778 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>()))
592 .Times(1) 779 .Times(1)
(...skipping 17 matching lines...) Expand all
610 // Cause an error. 797 // Cause an error.
611 read_callback.Run(net::ERR_SOCKET_NOT_CONNECTED); 798 read_callback.Run(net::ERR_SOCKET_NOT_CONNECTED);
612 799
613 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 800 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
614 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); 801 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
615 } 802 }
616 803
617 } // namespace cast_channel 804 } // namespace cast_channel
618 } // namespace api 805 } // namespace api
619 } // namespace extensions 806 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698