Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/cast_channel/cast_socket.h" | 5 #include "extensions/browser/api/cast_channel/cast_socket.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/files/file_util.h" | |
| 12 #include "base/location.h" | 13 #include "base/location.h" |
| 13 #include "base/macros.h" | 14 #include "base/macros.h" |
| 14 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 15 #include "base/memory/weak_ptr.h" | 16 #include "base/memory/weak_ptr.h" |
| 16 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
| 17 #include "base/run_loop.h" | 18 #include "base/run_loop.h" |
| 18 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| 19 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/sys_byteorder.h" | 21 #include "base/sys_byteorder.h" |
| 21 #include "base/test/simple_test_clock.h" | 22 #include "base/test/simple_test_clock.h" |
| 22 #include "base/threading/thread_task_runner_handle.h" | 23 #include "base/threading/thread_task_runner_handle.h" |
| 23 #include "base/timer/mock_timer.h" | 24 #include "base/timer/mock_timer.h" |
| 25 #include "content/public/test/test_browser_thread_bundle.h" | |
| 26 #include "crypto/rsa_private_key.h" | |
| 24 #include "extensions/browser/api/cast_channel/cast_auth_util.h" | 27 #include "extensions/browser/api/cast_channel/cast_auth_util.h" |
| 25 #include "extensions/browser/api/cast_channel/cast_framer.h" | 28 #include "extensions/browser/api/cast_channel/cast_framer.h" |
| 26 #include "extensions/browser/api/cast_channel/cast_message_util.h" | 29 #include "extensions/browser/api/cast_channel/cast_message_util.h" |
| 27 #include "extensions/browser/api/cast_channel/cast_test_util.h" | 30 #include "extensions/browser/api/cast_channel/cast_test_util.h" |
| 28 #include "extensions/browser/api/cast_channel/cast_transport.h" | 31 #include "extensions/browser/api/cast_channel/cast_transport.h" |
| 29 #include "extensions/browser/api/cast_channel/logger.h" | 32 #include "extensions/browser/api/cast_channel/logger.h" |
| 30 #include "extensions/common/api/cast_channel/cast_channel.pb.h" | 33 #include "extensions/common/api/cast_channel/cast_channel.pb.h" |
| 31 #include "net/base/address_list.h" | 34 #include "net/base/address_list.h" |
| 32 #include "net/base/net_errors.h" | 35 #include "net/base/net_errors.h" |
| 36 #include "net/cert/pem_tokenizer.h" | |
| 33 #include "net/log/test_net_log.h" | 37 #include "net/log/test_net_log.h" |
| 34 #include "net/socket/socket_test_util.h" | 38 #include "net/socket/socket_test_util.h" |
| 35 #include "net/socket/ssl_client_socket.h" | 39 #include "net/socket/ssl_client_socket.h" |
| 40 #include "net/socket/ssl_server_socket.h" | |
| 36 #include "net/socket/tcp_client_socket.h" | 41 #include "net/socket/tcp_client_socket.h" |
| 42 #include "net/socket/tcp_server_socket.h" | |
| 37 #include "net/ssl/ssl_info.h" | 43 #include "net/ssl/ssl_info.h" |
| 44 #include "net/ssl/ssl_server_config.h" | |
| 38 #include "net/test/cert_test_util.h" | 45 #include "net/test/cert_test_util.h" |
| 39 #include "net/test/test_data_directory.h" | 46 #include "net/test/test_data_directory.h" |
| 40 #include "testing/gmock/include/gmock/gmock.h" | 47 #include "testing/gmock/include/gmock/gmock.h" |
| 41 #include "testing/gtest/include/gtest/gtest.h" | 48 #include "testing/gtest/include/gtest/gtest.h" |
| 42 | 49 |
| 43 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). | 50 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). |
| 44 | 51 |
| 45 using ::testing::_; | 52 using ::testing::_; |
| 46 using ::testing::A; | 53 using ::testing::A; |
| 47 using ::testing::DoAll; | 54 using ::testing::DoAll; |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 false, | 222 false, |
| 216 logger, | 223 logger, |
| 217 device_capabilities), | 224 device_capabilities), |
| 218 capturing_net_log_(capturing_net_log), | 225 capturing_net_log_(capturing_net_log), |
| 219 ip_(ip_endpoint), | 226 ip_(ip_endpoint), |
| 220 extract_cert_result_(true), | 227 extract_cert_result_(true), |
| 221 verify_challenge_result_(true), | 228 verify_challenge_result_(true), |
| 222 verify_challenge_disallow_(false), | 229 verify_challenge_disallow_(false), |
| 223 tcp_unresponsive_(false), | 230 tcp_unresponsive_(false), |
| 224 mock_timer_(new base::MockTimer(false, false)), | 231 mock_timer_(new base::MockTimer(false, false)), |
| 225 mock_transport_(nullptr) {} | 232 mock_transport_(nullptr), |
| 233 tcp_client_socket_(nullptr), | |
| 234 use_tcp_socket_(false) {} | |
|
mark a. foltz
2016/07/02 01:44:55
This looks like it could be removed and replaced w
btolsch
2016/07/13 02:59:49
The boolean has been removed by splitting the test
| |
| 226 | 235 |
| 227 ~TestCastSocket() override {} | 236 ~TestCastSocket() override {} |
| 228 | 237 |
| 229 void SetupMockTransport() { | 238 void SetupMockTransport() { |
| 230 mock_transport_ = new MockCastTransport; | 239 mock_transport_ = new MockCastTransport; |
| 231 SetTransportForTesting(base::WrapUnique(mock_transport_)); | 240 SetTransportForTesting(base::WrapUnique(mock_transport_)); |
| 232 } | 241 } |
| 233 | 242 |
| 243 void SetTcpSocket(std::unique_ptr<net::TCPClientSocket> tcp_client_socket) { | |
| 244 tcp_client_socket_ = std::move(tcp_client_socket); | |
| 245 use_tcp_socket_ = true; | |
| 246 } | |
| 247 | |
| 234 // Socket connection helpers. | 248 // Socket connection helpers. |
| 235 void SetupTcpConnect(net::IoMode mode, int result) { | 249 void SetupTcpConnect(net::IoMode mode, int result) { |
| 236 tcp_connect_data_.reset(new net::MockConnect(mode, result)); | 250 tcp_connect_data_.reset(new net::MockConnect(mode, result)); |
| 237 } | 251 } |
| 238 void SetupSslConnect(net::IoMode mode, int result) { | 252 void SetupSslConnect(net::IoMode mode, int result) { |
| 239 ssl_connect_data_.reset(new net::MockConnect(mode, result)); | 253 ssl_connect_data_.reset(new net::MockConnect(mode, result)); |
| 240 } | 254 } |
| 241 | 255 |
| 242 // Socket I/O helpers. | 256 // Socket I/O helpers. |
| 243 void AddWriteResult(const net::MockWrite& write) { | 257 void AddWriteResult(const net::MockWrite& write) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 | 303 |
| 290 MockCastTransport* GetMockTransport() { | 304 MockCastTransport* GetMockTransport() { |
| 291 CHECK(mock_transport_); | 305 CHECK(mock_transport_); |
| 292 return mock_transport_; | 306 return mock_transport_; |
| 293 } | 307 } |
| 294 | 308 |
| 295 private: | 309 private: |
| 296 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { | 310 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { |
| 297 if (tcp_unresponsive_) { | 311 if (tcp_unresponsive_) { |
| 298 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); | 312 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); |
| 313 } else if (tcp_client_socket_) { | |
| 314 return std::move(tcp_client_socket_); | |
| 299 } else { | 315 } else { |
| 300 net::MockConnect* connect_data = tcp_connect_data_.get(); | 316 net::MockConnect* connect_data = tcp_connect_data_.get(); |
| 301 connect_data->peer_addr = ip_; | 317 connect_data->peer_addr = ip_; |
| 302 return std::unique_ptr<net::TCPClientSocket>( | 318 return std::unique_ptr<net::TCPClientSocket>( |
| 303 new MockTCPSocket(*connect_data)); | 319 new MockTCPSocket(*connect_data)); |
| 304 } | 320 } |
| 305 } | 321 } |
| 306 | 322 |
| 307 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( | 323 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( |
| 308 std::unique_ptr<net::StreamSocket> socket) override { | 324 std::unique_ptr<net::StreamSocket> socket) override { |
| 325 if (use_tcp_socket_) { | |
| 326 return CastSocketImpl::CreateSslSocket(std::move(socket)); | |
| 327 } | |
| 309 net::MockConnect* connect_data = ssl_connect_data_.get(); | 328 net::MockConnect* connect_data = ssl_connect_data_.get(); |
| 310 connect_data->peer_addr = ip_; | 329 connect_data->peer_addr = ip_; |
| 311 | 330 |
| 312 ssl_data_.reset(new net::StaticSocketDataProvider( | 331 ssl_data_.reset(new net::StaticSocketDataProvider( |
| 313 reads_.data(), reads_.size(), writes_.data(), writes_.size())); | 332 reads_.data(), reads_.size(), writes_.data(), writes_.size())); |
| 314 ssl_data_->set_connect_data(*connect_data); | 333 ssl_data_->set_connect_data(*connect_data); |
| 315 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! | 334 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! |
| 316 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( | 335 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( |
| 317 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); | 336 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); |
| 318 } | 337 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 343 // Simulated result of peer cert extraction. | 362 // Simulated result of peer cert extraction. |
| 344 bool extract_cert_result_; | 363 bool extract_cert_result_; |
| 345 // Simulated result of verifying challenge reply. | 364 // Simulated result of verifying challenge reply. |
| 346 bool verify_challenge_result_; | 365 bool verify_challenge_result_; |
| 347 bool verify_challenge_disallow_; | 366 bool verify_challenge_disallow_; |
| 348 // If true, makes TCP connection process stall. For timeout testing. | 367 // If true, makes TCP connection process stall. For timeout testing. |
| 349 bool tcp_unresponsive_; | 368 bool tcp_unresponsive_; |
| 350 std::unique_ptr<base::MockTimer> mock_timer_; | 369 std::unique_ptr<base::MockTimer> mock_timer_; |
| 351 MockCastTransport* mock_transport_; | 370 MockCastTransport* mock_transport_; |
| 352 | 371 |
| 372 // A real TCP socket that is used instead of the mocks when testing with the | |
| 373 // real SSL implementation. When this is set, CreateTcpSocket() will use this | |
| 374 // as the underlying transport and CreateSslSocket() will call the base | |
| 375 // implementation in CastSocketImpl. | |
| 376 std::unique_ptr<net::TCPClientSocket> tcp_client_socket_; | |
| 377 bool use_tcp_socket_; | |
| 378 | |
| 353 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); | 379 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); |
| 354 }; | 380 }; |
| 355 | 381 |
| 356 class CastSocketTest : public testing::Test { | 382 class CastSocketTest : public testing::Test { |
| 357 public: | 383 public: |
| 358 CastSocketTest() | 384 CastSocketTest() |
| 359 : logger_( | 385 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
| 386 logger_( | |
| 360 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), | 387 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), |
| 361 base::Time())), | 388 base::Time())), |
| 362 delegate_(new MockDelegate) {} | 389 delegate_(new MockDelegate) {} |
| 363 ~CastSocketTest() override {} | 390 ~CastSocketTest() override {} |
| 364 | 391 |
| 365 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } | 392 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } |
| 366 | 393 |
| 367 void TearDown() override { | 394 void TearDown() override { |
| 368 if (socket_.get()) { | 395 if (socket_.get()) { |
| 369 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 396 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 370 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 397 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 371 base::Unretained(&handler_))); | 398 base::Unretained(&handler_))); |
| 372 } | 399 } |
| 373 } | 400 } |
| 374 | 401 |
| 375 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } | 402 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } |
| 376 | 403 |
| 377 void CreateCastSocketSecure() { | 404 void CreateCastSocketSecure() { |
| 378 socket_ = TestCastSocket::CreateSecure(logger_); | 405 socket_ = TestCastSocket::CreateSecure(logger_); |
| 379 } | 406 } |
| 380 | 407 |
| 408 // Initializes the SSLServerSocket |server_socket_| and the TCP socket | |
| 409 // |tcp_client_socket_| to be used by the CastSocket |socket_| as transport | |
| 410 // to |server_socket_|. | |
| 411 void CreateSslSockets() { | |
| 412 server_cert_ = | |
| 413 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); | |
| 414 ASSERT_TRUE(server_cert_); | |
| 415 server_private_key_ = ReadTestKeyFromPEM("ok_cert.pem"); | |
| 416 ASSERT_TRUE(server_private_key_); | |
| 417 server_context_ = CreateSSLServerContext( | |
| 418 server_cert_.get(), *server_private_key_, server_ssl_config_); | |
| 419 | |
| 420 tcp_server_socket_.reset( | |
| 421 new net::TCPServerSocket(nullptr, net::NetLog::Source())); | |
| 422 ASSERT_EQ(net::OK, | |
| 423 tcp_server_socket_->ListenWithAddressAndPort("127.0.0.1", 0, 1)); | |
| 424 net::IPEndPoint server_address; | |
| 425 ASSERT_EQ(net::OK, tcp_server_socket_->GetLocalAddress(&server_address)); | |
| 426 tcp_client_socket_.reset( | |
| 427 new net::TCPClientSocket(net::AddressList(server_address), nullptr, | |
| 428 nullptr, net::NetLog::Source())); | |
| 429 | |
| 430 std::unique_ptr<net::StreamSocket> accepted_socket; | |
| 431 ASSERT_EQ( | |
| 432 net::ERR_IO_PENDING, | |
| 433 tcp_server_socket_->Accept( | |
| 434 &accepted_socket, base::Bind(&CastSocketTest::TcpAcceptCallback, | |
| 435 base::Unretained(this)))); | |
| 436 ASSERT_EQ(net::ERR_IO_PENDING, tcp_client_socket_->Connect(base::Bind( | |
| 437 &CastSocketTest::TcpConnectCallback, | |
| 438 base::Unretained(this)))); | |
| 439 RunPendingTasks(); | |
| 440 ASSERT_TRUE(accepted_socket); | |
| 441 ASSERT_TRUE(tcp_client_socket_->IsConnected()); | |
| 442 | |
| 443 server_socket_ = | |
| 444 server_context_->CreateSSLServerSocket(std::move(accepted_socket)); | |
| 445 ASSERT_TRUE(server_socket_); | |
| 446 } | |
| 447 | |
| 448 void TcpAcceptCallback(int result) { ASSERT_EQ(net::OK, result); } | |
| 449 | |
| 450 void TcpConnectCallback(int result) { ASSERT_EQ(net::OK, result); } | |
| 451 | |
| 452 std::unique_ptr<crypto::RSAPrivateKey> ReadTestKeyFromPEM( | |
| 453 const base::StringPiece& name) { | |
| 454 base::FilePath certs_dir(net::GetTestCertsDirectory()); | |
| 455 base::FilePath key_path = certs_dir.AppendASCII(name); | |
| 456 std::vector<std::string> headers; | |
| 457 headers.push_back("PRIVATE KEY"); | |
| 458 std::string pem_data; | |
| 459 if (!base::ReadFileToString(key_path, &pem_data)) { | |
| 460 return nullptr; | |
| 461 } | |
| 462 net::PEMTokenizer pem_tokenizer(pem_data, headers); | |
| 463 if (!pem_tokenizer.GetNext()) { | |
| 464 return nullptr; | |
| 465 } | |
| 466 std::vector<uint8_t> key_vector(pem_tokenizer.data().begin(), | |
| 467 pem_tokenizer.data().end()); | |
| 468 | |
| 469 std::unique_ptr<crypto::RSAPrivateKey> key( | |
| 470 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); | |
| 471 return key; | |
| 472 } | |
| 473 | |
| 381 void HandleAuthHandshake() { | 474 void HandleAuthHandshake() { |
| 382 socket_->SetupMockTransport(); | 475 socket_->SetupMockTransport(); |
| 383 CastMessage challenge_proto = CreateAuthChallenge(); | 476 CastMessage challenge_proto = CreateAuthChallenge(); |
| 384 EXPECT_CALL(*socket_->GetMockTransport(), | 477 EXPECT_CALL(*socket_->GetMockTransport(), |
| 385 SendMessage(EqualsProto(challenge_proto), _)) | 478 SendMessage(EqualsProto(challenge_proto), _)) |
| 386 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); | 479 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); |
| 387 EXPECT_CALL(*socket_->GetMockTransport(), Start()); | 480 EXPECT_CALL(*socket_->GetMockTransport(), Start()); |
| 388 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | 481 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); |
| 389 socket_->Connect(std::move(delegate_), | 482 socket_->Connect(std::move(delegate_), |
| 390 base::Bind(&CompleteHandler::OnConnectComplete, | 483 base::Bind(&CompleteHandler::OnConnectComplete, |
| 391 base::Unretained(&handler_))); | 484 base::Unretained(&handler_))); |
| 392 RunPendingTasks(); | 485 RunPendingTasks(); |
| 393 socket_->GetMockTransport()->current_delegate()->OnMessage( | 486 socket_->GetMockTransport()->current_delegate()->OnMessage( |
| 394 CreateAuthReply()); | 487 CreateAuthReply()); |
| 395 RunPendingTasks(); | 488 RunPendingTasks(); |
| 396 } | 489 } |
| 397 | 490 |
| 491 int ReadExactLength(net::IOBuffer* buffer, | |
| 492 int buffer_length, | |
| 493 net::Socket* socket) { | |
| 494 scoped_refptr<net::DrainableIOBuffer> draining_buffer( | |
| 495 new net::DrainableIOBuffer(buffer, buffer_length)); | |
| 496 while (draining_buffer->BytesRemaining() > 0) { | |
| 497 net::TestCompletionCallback read_callback; | |
| 498 int read_result = read_callback.GetResult(server_socket_->Read( | |
| 499 draining_buffer.get(), buffer_length, read_callback.callback())); | |
| 500 EXPECT_GT(read_result, 0); | |
| 501 draining_buffer->DidConsume(read_result); | |
| 502 } | |
| 503 return buffer_length; | |
| 504 } | |
| 505 | |
| 506 int WriteExactLength(net::IOBuffer* buffer, | |
| 507 int buffer_length, | |
| 508 net::Socket* socket) { | |
| 509 scoped_refptr<net::DrainableIOBuffer> draining_buffer( | |
| 510 new net::DrainableIOBuffer(buffer, buffer_length)); | |
| 511 while (draining_buffer->BytesRemaining() > 0) { | |
| 512 net::TestCompletionCallback write_callback; | |
| 513 int write_result = write_callback.GetResult(server_socket_->Write( | |
| 514 draining_buffer.get(), buffer_length, write_callback.callback())); | |
| 515 EXPECT_GT(write_result, 0); | |
| 516 draining_buffer->DidConsume(write_result); | |
| 517 } | |
| 518 return buffer_length; | |
| 519 } | |
| 520 | |
| 398 protected: | 521 protected: |
| 399 // Runs all pending tasks in the message loop. | 522 // Runs all pending tasks in the message loop. |
| 400 void RunPendingTasks() { | 523 void RunPendingTasks() { |
| 401 base::RunLoop run_loop; | 524 base::RunLoop run_loop; |
| 402 run_loop.RunUntilIdle(); | 525 run_loop.RunUntilIdle(); |
| 403 } | 526 } |
| 404 | 527 |
| 405 base::MessageLoop message_loop_; | 528 content::TestBrowserThreadBundle thread_bundle_; |
| 406 Logger* logger_; | 529 Logger* logger_; |
| 407 std::unique_ptr<TestCastSocket> socket_; | 530 std::unique_ptr<TestCastSocket> socket_; |
| 408 CompleteHandler handler_; | 531 CompleteHandler handler_; |
| 409 std::unique_ptr<MockDelegate> delegate_; | 532 std::unique_ptr<MockDelegate> delegate_; |
| 410 | 533 |
| 534 // Underlying TCP sockets for |socket_| to communicate with |server_socket_| | |
| 535 // when testing with the real SSL implementation. | |
| 536 std::unique_ptr<net::TCPClientSocket> tcp_client_socket_; | |
| 537 std::unique_ptr<net::TCPServerSocket> tcp_server_socket_; | |
| 538 | |
| 539 // |server_socket_| is used for the *RealSSL tests in order to test the | |
| 540 // CastSocket over a real SSL socket. The other members below are used to | |
| 541 // initialize |server_socket_|. | |
| 542 std::unique_ptr<net::SSLServerSocket> server_socket_; | |
| 543 std::unique_ptr<net::SSLServerContext> server_context_; | |
| 544 std::unique_ptr<crypto::RSAPrivateKey> server_private_key_; | |
| 545 scoped_refptr<net::X509Certificate> server_cert_; | |
| 546 net::SSLServerConfig server_ssl_config_; | |
| 547 | |
| 411 private: | 548 private: |
| 412 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); | 549 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); |
| 413 }; | 550 }; |
| 414 | 551 |
| 415 // Tests connecting and closing the socket. | 552 // Tests connecting and closing the socket. |
| 416 TEST_F(CastSocketTest, TestConnectAndClose) { | 553 TEST_F(CastSocketTest, TestConnectAndClose) { |
| 417 CreateCastSocket(); | 554 CreateCastSocket(); |
| 418 socket_->SetupMockTransport(); | 555 socket_->SetupMockTransport(); |
| 419 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); | 556 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); |
| 420 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); | 557 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 base::Unretained(&handler_))); | 933 base::Unretained(&handler_))); |
| 797 RunPendingTasks(); | 934 RunPendingTasks(); |
| 798 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); | 935 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); |
| 799 RunPendingTasks(); | 936 RunPendingTasks(); |
| 800 | 937 |
| 801 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 938 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 802 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, | 939 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, |
| 803 socket_->error_state()); | 940 socket_->error_state()); |
| 804 } | 941 } |
| 805 | 942 |
| 943 // Tests connecting through an actual non-mocked CastTransport object and | |
| 944 // non-mocked SSLClientSocket, testing the components in integration. | |
| 945 TEST_F(CastSocketTest, TestConnectEndToEndWithRealSSL) { | |
| 946 CreateCastSocketSecure(); | |
| 947 CreateSslSockets(); | |
| 948 socket_->SetTcpSocket(std::move(tcp_client_socket_)); | |
| 949 | |
| 950 socket_->Connect(std::move(delegate_), | |
| 951 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 952 base::Unretained(&handler_))); | |
| 953 | |
| 954 net::TestCompletionCallback handshake_callback; | |
| 955 int server_ret = handshake_callback.GetResult( | |
| 956 server_socket_->Handshake(handshake_callback.callback())); | |
| 957 | |
| 958 ASSERT_EQ(net::OK, server_ret); | |
| 959 | |
| 960 // Set low-level auth challenge expectations. | |
| 961 CastMessage challenge = CreateAuthChallenge(); | |
| 962 std::string challenge_str; | |
| 963 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 964 | |
| 965 int challenge_buffer_length = challenge_str.size(); | |
| 966 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 967 new net::IOBuffer(challenge_buffer_length)); | |
| 968 int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, | |
| 969 server_socket_.get()); | |
| 970 | |
| 971 EXPECT_EQ(challenge_buffer_length, read); | |
| 972 EXPECT_EQ(challenge_str, | |
| 973 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
| 974 | |
| 975 // Set low-level auth reply expectations. | |
| 976 CastMessage reply = CreateAuthReply(); | |
| 977 std::string reply_str; | |
| 978 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 979 | |
| 980 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 981 new net::StringIOBuffer(reply_str)); | |
| 982 int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), | |
| 983 server_socket_.get()); | |
| 984 | |
| 985 EXPECT_EQ(reply_buffer->size(), written); | |
| 986 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 987 RunPendingTasks(); | |
| 988 | |
| 989 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 990 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 991 } | |
| 992 | |
| 993 // Sends message data through an actual non-mocked CastTransport object and | |
| 994 // non-mocked SSLClientSocket, testing the components in integration. | |
| 995 TEST_F(CastSocketTest, TestMessageEndToEndWithRealSSL) { | |
| 996 CreateCastSocketSecure(); | |
| 997 CreateSslSockets(); | |
| 998 socket_->SetTcpSocket(std::move(tcp_client_socket_)); | |
| 999 | |
| 1000 socket_->Connect(std::move(delegate_), | |
| 1001 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 1002 base::Unretained(&handler_))); | |
| 1003 | |
| 1004 net::TestCompletionCallback handshake_callback; | |
| 1005 int server_ret = handshake_callback.GetResult( | |
| 1006 server_socket_->Handshake(handshake_callback.callback())); | |
| 1007 | |
| 1008 ASSERT_EQ(net::OK, server_ret); | |
| 1009 | |
| 1010 // Set low-level auth challenge expectations. | |
| 1011 CastMessage challenge = CreateAuthChallenge(); | |
| 1012 std::string challenge_str; | |
| 1013 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 1014 | |
| 1015 int challenge_buffer_length = challenge_str.size(); | |
| 1016 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 1017 new net::IOBuffer(challenge_buffer_length)); | |
| 1018 | |
| 1019 int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, | |
| 1020 server_socket_.get()); | |
| 1021 | |
| 1022 EXPECT_EQ(challenge_buffer_length, read); | |
| 1023 EXPECT_EQ(challenge_str, | |
| 1024 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
| 1025 | |
| 1026 // Set low-level auth reply expectations. | |
| 1027 CastMessage reply = CreateAuthReply(); | |
| 1028 std::string reply_str; | |
| 1029 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 1030 | |
| 1031 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 1032 new net::StringIOBuffer(reply_str)); | |
| 1033 int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), | |
| 1034 server_socket_.get()); | |
| 1035 | |
| 1036 EXPECT_EQ(reply_buffer->size(), written); | |
| 1037 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 1038 RunPendingTasks(); | |
| 1039 | |
| 1040 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1041 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1042 | |
| 1043 // Send a test message through the ssl socket. | |
| 1044 CastMessage test_message = CreateTestMessage(); | |
| 1045 std::string test_message_str; | |
| 1046 EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str)); | |
| 1047 | |
| 1048 int test_message_length = test_message_str.size(); | |
| 1049 scoped_refptr<net::IOBuffer> test_message_buffer( | |
| 1050 new net::IOBuffer(test_message_length)); | |
| 1051 | |
| 1052 EXPECT_CALL(handler_, OnWriteComplete(net::OK)); | |
| 1053 socket_->transport()->SendMessage( | |
| 1054 test_message, base::Bind(&CompleteHandler::OnWriteComplete, | |
| 1055 base::Unretained(&handler_))); | |
| 1056 RunPendingTasks(); | |
| 1057 | |
| 1058 read = ReadExactLength(test_message_buffer.get(), test_message_length, | |
| 1059 server_socket_.get()); | |
| 1060 | |
| 1061 EXPECT_EQ(test_message_length, read); | |
| 1062 EXPECT_EQ(test_message_str, | |
| 1063 std::string(test_message_buffer->data(), test_message_length)); | |
| 1064 | |
| 1065 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1066 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1067 } | |
| 1068 | |
| 806 // Sends message data through an actual non-mocked CastTransport object, | 1069 // Sends message data through an actual non-mocked CastTransport object, |
| 807 // testing the two components in integration. | 1070 // testing the two components in integration. |
| 808 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { | 1071 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { |
| 809 CreateCastSocketSecure(); | 1072 CreateCastSocketSecure(); |
| 810 socket_->SetupTcpConnect(net::ASYNC, net::OK); | 1073 socket_->SetupTcpConnect(net::ASYNC, net::OK); |
| 811 socket_->SetupSslConnect(net::ASYNC, net::OK); | 1074 socket_->SetupSslConnect(net::ASYNC, net::OK); |
| 812 | 1075 |
| 813 // Set low-level auth challenge expectations. | 1076 // Set low-level auth challenge expectations. |
| 814 CastMessage challenge = CreateAuthChallenge(); | 1077 CastMessage challenge = CreateAuthChallenge(); |
| 815 std::string challenge_str; | 1078 std::string challenge_str; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 904 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); | 1167 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); |
| 905 EXPECT_FALSE(socket_->audio_only()); | 1168 EXPECT_FALSE(socket_->audio_only()); |
| 906 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); | 1169 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); |
| 907 EXPECT_FALSE(socket_->audio_only()); | 1170 EXPECT_FALSE(socket_->audio_only()); |
| 908 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); | 1171 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); |
| 909 EXPECT_TRUE(socket_->audio_only()); | 1172 EXPECT_TRUE(socket_->audio_only()); |
| 910 } | 1173 } |
| 911 } // namespace cast_channel | 1174 } // namespace cast_channel |
| 912 } // namespace api | 1175 } // namespace api |
| 913 } // namespace extensions | 1176 } // namespace extensions |
| OLD | NEW |