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" |
| 37 #include "net/ssl/ssl_info.h" | 42 #include "net/ssl/ssl_info.h" |
| 43 #include "net/ssl/ssl_server_config.h" | |
| 38 #include "net/test/cert_test_util.h" | 44 #include "net/test/cert_test_util.h" |
| 39 #include "net/test/test_data_directory.h" | 45 #include "net/test/test_data_directory.h" |
| 40 #include "testing/gmock/include/gmock/gmock.h" | 46 #include "testing/gmock/include/gmock/gmock.h" |
| 41 #include "testing/gtest/include/gtest/gtest.h" | 47 #include "testing/gtest/include/gtest/gtest.h" |
| 42 | 48 |
| 43 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). | 49 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). |
| 44 | 50 |
| 45 using ::testing::_; | 51 using ::testing::_; |
| 46 using ::testing::A; | 52 using ::testing::A; |
| 47 using ::testing::DoAll; | 53 using ::testing::DoAll; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 CompleteHandler() {} | 170 CompleteHandler() {} |
| 165 MOCK_METHOD1(OnCloseComplete, void(int result)); | 171 MOCK_METHOD1(OnCloseComplete, void(int result)); |
| 166 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); | 172 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); |
| 167 MOCK_METHOD1(OnWriteComplete, void(int result)); | 173 MOCK_METHOD1(OnWriteComplete, void(int result)); |
| 168 MOCK_METHOD1(OnReadComplete, void(int result)); | 174 MOCK_METHOD1(OnReadComplete, void(int result)); |
| 169 | 175 |
| 170 private: | 176 private: |
| 171 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 177 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
| 172 }; | 178 }; |
| 173 | 179 |
| 180 class FakeTCPClientSocket : public net::TCPClientSocket { | |
| 181 public: | |
| 182 FakeTCPClientSocket(net::FakeSocket* socket) | |
| 183 : net::TCPClientSocket(net::AddressList(), | |
| 184 nullptr, | |
| 185 nullptr, | |
| 186 net::NetLog::Source()), | |
| 187 socket_(socket) { | |
| 188 DCHECK(socket_); | |
| 189 } | |
| 190 | |
| 191 int Read(net::IOBuffer* buf, | |
| 192 int buf_len, | |
| 193 const net::CompletionCallback& callback) override { | |
| 194 return socket_->Read(buf, buf_len, callback); | |
| 195 } | |
| 196 | |
| 197 int Write(net::IOBuffer* buf, | |
| 198 int buf_len, | |
| 199 const net::CompletionCallback& callback) override { | |
| 200 return socket_->Write(buf, buf_len, callback); | |
| 201 } | |
| 202 | |
| 203 int SetReceiveBufferSize(int32_t size) override { | |
| 204 return socket_->SetReceiveBufferSize(size); | |
| 205 } | |
| 206 | |
| 207 int SetSendBufferSize(int32_t size) override { | |
| 208 return socket_->SetSendBufferSize(size); | |
| 209 } | |
| 210 | |
| 211 int Connect(const net::CompletionCallback& callback) override { | |
| 212 return socket_->Connect(callback); | |
| 213 } | |
| 214 | |
| 215 void Disconnect() override { return socket_->Disconnect(); } | |
| 216 | |
| 217 bool IsConnected() const override { return socket_->IsConnected(); } | |
| 218 | |
| 219 bool IsConnectedAndIdle() const override { | |
| 220 return socket_->IsConnectedAndIdle(); | |
| 221 } | |
| 222 | |
| 223 int GetPeerAddress(net::IPEndPoint* address) const override { | |
| 224 return socket_->GetPeerAddress(address); | |
| 225 } | |
| 226 | |
| 227 int GetLocalAddress(net::IPEndPoint* address) const override { | |
| 228 return socket_->GetLocalAddress(address); | |
| 229 } | |
| 230 | |
| 231 const net::BoundNetLog& NetLog() const override { return socket_->NetLog(); } | |
| 232 | |
| 233 void SetSubresourceSpeculation() override { | |
| 234 socket_->SetSubresourceSpeculation(); | |
| 235 } | |
| 236 | |
| 237 void SetOmniboxSpeculation() override { socket_->SetOmniboxSpeculation(); } | |
| 238 | |
| 239 bool WasEverUsed() const override { return socket_->WasEverUsed(); } | |
| 240 | |
| 241 bool WasNpnNegotiated() const override { return socket_->WasNpnNegotiated(); } | |
| 242 | |
| 243 net::NextProto GetNegotiatedProtocol() const override { | |
| 244 return socket_->GetNegotiatedProtocol(); | |
| 245 } | |
| 246 | |
| 247 bool GetSSLInfo(net::SSLInfo* ssl_info) override { | |
| 248 return socket_->GetSSLInfo(ssl_info); | |
| 249 } | |
| 250 | |
| 251 void GetConnectionAttempts(net::ConnectionAttempts* out) const override { | |
| 252 socket_->GetConnectionAttempts(out); | |
| 253 } | |
| 254 | |
| 255 void ClearConnectionAttempts() override { | |
| 256 socket_->ClearConnectionAttempts(); | |
| 257 } | |
| 258 | |
| 259 void AddConnectionAttempts(const net::ConnectionAttempts& attempts) override { | |
| 260 socket_->AddConnectionAttempts(attempts); | |
| 261 } | |
| 262 | |
| 263 int64_t GetTotalReceivedBytes() const override { | |
| 264 return socket_->GetTotalReceivedBytes(); | |
| 265 } | |
| 266 | |
| 267 private: | |
| 268 net::FakeSocket* socket_; | |
| 269 }; | |
| 270 | |
| 174 class TestCastSocket : public CastSocketImpl { | 271 class TestCastSocket : public CastSocketImpl { |
| 175 public: | 272 public: |
| 176 static std::unique_ptr<TestCastSocket> Create( | 273 static std::unique_ptr<TestCastSocket> Create( |
| 177 Logger* logger, | 274 Logger* logger, |
| 178 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { | 275 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { |
| 179 return std::unique_ptr<TestCastSocket>( | 276 return std::unique_ptr<TestCastSocket>( |
| 180 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, | 277 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, |
| 181 kDistantTimeoutMillis, logger, device_capabilities)); | 278 kDistantTimeoutMillis, logger, device_capabilities)); |
| 182 } | 279 } |
| 183 | 280 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 false, | 312 false, |
| 216 logger, | 313 logger, |
| 217 device_capabilities), | 314 device_capabilities), |
| 218 capturing_net_log_(capturing_net_log), | 315 capturing_net_log_(capturing_net_log), |
| 219 ip_(ip_endpoint), | 316 ip_(ip_endpoint), |
| 220 extract_cert_result_(true), | 317 extract_cert_result_(true), |
| 221 verify_challenge_result_(true), | 318 verify_challenge_result_(true), |
| 222 verify_challenge_disallow_(false), | 319 verify_challenge_disallow_(false), |
| 223 tcp_unresponsive_(false), | 320 tcp_unresponsive_(false), |
| 224 mock_timer_(new base::MockTimer(false, false)), | 321 mock_timer_(new base::MockTimer(false, false)), |
| 225 mock_transport_(nullptr) {} | 322 mock_transport_(nullptr), |
| 323 fake_socket_(nullptr) {} | |
| 226 | 324 |
| 227 ~TestCastSocket() override {} | 325 ~TestCastSocket() override {} |
| 228 | 326 |
| 229 void SetupMockTransport() { | 327 void SetupMockTransport() { |
| 230 mock_transport_ = new MockCastTransport; | 328 mock_transport_ = new MockCastTransport; |
| 231 SetTransportForTesting(base::WrapUnique(mock_transport_)); | 329 SetTransportForTesting(base::WrapUnique(mock_transport_)); |
| 232 } | 330 } |
| 233 | 331 |
| 332 void SetFakeSocket(net::FakeSocket* fake_socket) { | |
| 333 fake_socket_ = fake_socket; | |
| 334 } | |
| 335 | |
| 234 // Socket connection helpers. | 336 // Socket connection helpers. |
| 235 void SetupTcpConnect(net::IoMode mode, int result) { | 337 void SetupTcpConnect(net::IoMode mode, int result) { |
| 236 tcp_connect_data_.reset(new net::MockConnect(mode, result)); | 338 tcp_connect_data_.reset(new net::MockConnect(mode, result)); |
| 237 } | 339 } |
| 238 void SetupSslConnect(net::IoMode mode, int result) { | 340 void SetupSslConnect(net::IoMode mode, int result) { |
| 239 ssl_connect_data_.reset(new net::MockConnect(mode, result)); | 341 ssl_connect_data_.reset(new net::MockConnect(mode, result)); |
| 240 } | 342 } |
| 241 | 343 |
| 242 // Socket I/O helpers. | 344 // Socket I/O helpers. |
| 243 void AddWriteResult(const net::MockWrite& write) { | 345 void AddWriteResult(const net::MockWrite& write) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 | 391 |
| 290 MockCastTransport* GetMockTransport() { | 392 MockCastTransport* GetMockTransport() { |
| 291 CHECK(mock_transport_); | 393 CHECK(mock_transport_); |
| 292 return mock_transport_; | 394 return mock_transport_; |
| 293 } | 395 } |
| 294 | 396 |
| 295 private: | 397 private: |
| 296 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { | 398 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { |
| 297 if (tcp_unresponsive_) { | 399 if (tcp_unresponsive_) { |
| 298 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); | 400 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); |
| 401 } else if (fake_socket_) { | |
| 402 return std::unique_ptr<net::TCPClientSocket>( | |
| 403 new FakeTCPClientSocket(fake_socket_)); | |
| 299 } else { | 404 } else { |
| 300 net::MockConnect* connect_data = tcp_connect_data_.get(); | 405 net::MockConnect* connect_data = tcp_connect_data_.get(); |
| 301 connect_data->peer_addr = ip_; | 406 connect_data->peer_addr = ip_; |
| 302 return std::unique_ptr<net::TCPClientSocket>( | 407 return std::unique_ptr<net::TCPClientSocket>( |
| 303 new MockTCPSocket(*connect_data)); | 408 new MockTCPSocket(*connect_data)); |
| 304 } | 409 } |
| 305 } | 410 } |
| 306 | 411 |
| 307 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( | 412 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( |
| 308 std::unique_ptr<net::StreamSocket> socket) override { | 413 std::unique_ptr<net::StreamSocket> socket) override { |
| 414 if (fake_socket_) { | |
| 415 return CastSocketImpl::CreateSslSocket(std::move(socket)); | |
| 416 } | |
| 309 net::MockConnect* connect_data = ssl_connect_data_.get(); | 417 net::MockConnect* connect_data = ssl_connect_data_.get(); |
| 310 connect_data->peer_addr = ip_; | 418 connect_data->peer_addr = ip_; |
| 311 | 419 |
| 312 ssl_data_.reset(new net::StaticSocketDataProvider( | 420 ssl_data_.reset(new net::StaticSocketDataProvider( |
| 313 reads_.data(), reads_.size(), writes_.data(), writes_.size())); | 421 reads_.data(), reads_.size(), writes_.data(), writes_.size())); |
| 314 ssl_data_->set_connect_data(*connect_data); | 422 ssl_data_->set_connect_data(*connect_data); |
| 315 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! | 423 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! |
| 316 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( | 424 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( |
| 317 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); | 425 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); |
| 318 } | 426 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 343 // Simulated result of peer cert extraction. | 451 // Simulated result of peer cert extraction. |
| 344 bool extract_cert_result_; | 452 bool extract_cert_result_; |
| 345 // Simulated result of verifying challenge reply. | 453 // Simulated result of verifying challenge reply. |
| 346 bool verify_challenge_result_; | 454 bool verify_challenge_result_; |
| 347 bool verify_challenge_disallow_; | 455 bool verify_challenge_disallow_; |
| 348 // If true, makes TCP connection process stall. For timeout testing. | 456 // If true, makes TCP connection process stall. For timeout testing. |
| 349 bool tcp_unresponsive_; | 457 bool tcp_unresponsive_; |
| 350 std::unique_ptr<base::MockTimer> mock_timer_; | 458 std::unique_ptr<base::MockTimer> mock_timer_; |
| 351 MockCastTransport* mock_transport_; | 459 MockCastTransport* mock_transport_; |
| 352 | 460 |
| 461 // A fake socket that is used instead of the mocks when testing with the real | |
| 462 // SSL implementation. When this is set, CreateTCPSocket() will use this as | |
| 463 // the underlying transport and CreateSSLSocket() will call the base | |
| 464 // implementation in CastSocketImpl. | |
| 465 net::FakeSocket* fake_socket_; | |
| 466 | |
| 353 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); | 467 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); |
| 354 }; | 468 }; |
| 355 | 469 |
| 356 class CastSocketTest : public testing::Test { | 470 class CastSocketTest : public testing::Test { |
| 357 public: | 471 public: |
| 358 CastSocketTest() | 472 CastSocketTest() |
| 359 : logger_( | 473 : logger_( |
| 360 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), | 474 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), |
| 361 base::Time())), | 475 base::Time())), |
| 362 delegate_(new MockDelegate) {} | 476 delegate_(new MockDelegate) {} |
| 363 ~CastSocketTest() override {} | 477 ~CastSocketTest() override {} |
| 364 | 478 |
| 365 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } | 479 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } |
| 366 | 480 |
| 367 void TearDown() override { | 481 void TearDown() override { |
| 368 if (socket_.get()) { | 482 if (socket_.get()) { |
| 369 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 483 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 370 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 484 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 371 base::Unretained(&handler_))); | 485 base::Unretained(&handler_))); |
| 372 } | 486 } |
| 373 } | 487 } |
| 374 | 488 |
| 375 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } | 489 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } |
| 376 | 490 |
| 377 void CreateCastSocketSecure() { | 491 void CreateCastSocketSecure() { |
| 378 socket_ = TestCastSocket::CreateSecure(logger_); | 492 socket_ = TestCastSocket::CreateSecure(logger_); |
| 379 } | 493 } |
| 380 | 494 |
| 495 // Initializes the SSLServerSocket |server_socket_| and the fake socket | |
| 496 // |fake_client_socket_| to be used by the CastSocket |socket_| as transport | |
| 497 // to |server_socket_|. | |
| 498 void CreateFakeSockets() { | |
| 499 channel_1_.reset(new net::FakeDataChannel()); | |
| 500 channel_2_.reset(new net::FakeDataChannel()); | |
| 501 server_cert_ = | |
| 502 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); | |
| 503 ASSERT_TRUE(server_cert_); | |
| 504 server_private_key_ = ReadTestKeyFromPEM("ok_cert.pem"); | |
| 505 ASSERT_TRUE(server_private_key_); | |
| 506 server_context_ = CreateSSLServerContext( | |
| 507 server_cert_.get(), *server_private_key_, server_ssl_config_); | |
| 508 | |
| 509 fake_client_socket_.reset( | |
| 510 new net::FakeSocket(channel_1_.get(), channel_2_.get())); | |
| 511 std::unique_ptr<net::StreamSocket> server_socket( | |
|
Wez
2016/07/01 01:27:56
nit: fake_server_socket?
btolsch
2016/07/01 03:21:08
This was effectively changed to |accepted_socket|.
| |
| 512 new net::FakeSocket(channel_2_.get(), channel_1_.get())); | |
| 513 | |
| 514 server_socket_ = | |
| 515 server_context_->CreateSSLServerSocket(std::move(server_socket)); | |
| 516 ASSERT_TRUE(server_socket_); | |
| 517 } | |
| 518 | |
| 519 std::unique_ptr<crypto::RSAPrivateKey> ReadTestKeyFromPEM( | |
| 520 const base::StringPiece& name) { | |
| 521 base::FilePath certs_dir(net::GetTestCertsDirectory()); | |
| 522 base::FilePath key_path = certs_dir.AppendASCII(name); | |
| 523 std::vector<std::string> headers; | |
| 524 headers.push_back("PRIVATE KEY"); | |
| 525 std::string pem_data; | |
| 526 if (!base::ReadFileToString(key_path, &pem_data)) { | |
| 527 return nullptr; | |
| 528 } | |
| 529 net::PEMTokenizer pem_tokenizer(pem_data, headers); | |
| 530 if (!pem_tokenizer.GetNext()) { | |
| 531 return nullptr; | |
| 532 } | |
| 533 std::vector<uint8_t> key_vector(pem_tokenizer.data().begin(), | |
| 534 pem_tokenizer.data().end()); | |
| 535 | |
| 536 std::unique_ptr<crypto::RSAPrivateKey> key( | |
| 537 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); | |
| 538 return key; | |
| 539 } | |
| 540 | |
| 381 void HandleAuthHandshake() { | 541 void HandleAuthHandshake() { |
| 382 socket_->SetupMockTransport(); | 542 socket_->SetupMockTransport(); |
| 383 CastMessage challenge_proto = CreateAuthChallenge(); | 543 CastMessage challenge_proto = CreateAuthChallenge(); |
| 384 EXPECT_CALL(*socket_->GetMockTransport(), | 544 EXPECT_CALL(*socket_->GetMockTransport(), |
| 385 SendMessage(EqualsProto(challenge_proto), _)) | 545 SendMessage(EqualsProto(challenge_proto), _)) |
| 386 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); | 546 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); |
| 387 EXPECT_CALL(*socket_->GetMockTransport(), Start()); | 547 EXPECT_CALL(*socket_->GetMockTransport(), Start()); |
| 388 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | 548 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); |
| 389 socket_->Connect(std::move(delegate_), | 549 socket_->Connect(std::move(delegate_), |
| 390 base::Bind(&CompleteHandler::OnConnectComplete, | 550 base::Bind(&CompleteHandler::OnConnectComplete, |
| 391 base::Unretained(&handler_))); | 551 base::Unretained(&handler_))); |
| 392 RunPendingTasks(); | 552 RunPendingTasks(); |
| 393 socket_->GetMockTransport()->current_delegate()->OnMessage( | 553 socket_->GetMockTransport()->current_delegate()->OnMessage( |
| 394 CreateAuthReply()); | 554 CreateAuthReply()); |
| 395 RunPendingTasks(); | 555 RunPendingTasks(); |
| 396 } | 556 } |
| 397 | 557 |
| 558 int ReadExactLength(net::IOBuffer* buffer, | |
| 559 int buffer_length, | |
| 560 net::Socket* socket) { | |
| 561 scoped_refptr<net::DrainableIOBuffer> draining_buffer( | |
| 562 new net::DrainableIOBuffer(buffer, buffer_length)); | |
| 563 while (draining_buffer->BytesRemaining() > 0) { | |
| 564 net::TestCompletionCallback read_callback; | |
| 565 int read_result = read_callback.GetResult(server_socket_->Read( | |
| 566 draining_buffer.get(), buffer_length, read_callback.callback())); | |
| 567 EXPECT_GT(read_result, 0); | |
| 568 draining_buffer->DidConsume(read_result); | |
| 569 } | |
| 570 return buffer_length; | |
| 571 } | |
| 572 | |
| 573 int WriteExactLength(net::IOBuffer* buffer, | |
| 574 int buffer_length, | |
| 575 net::Socket* socket) { | |
| 576 scoped_refptr<net::DrainableIOBuffer> draining_buffer( | |
| 577 new net::DrainableIOBuffer(buffer, buffer_length)); | |
| 578 while (draining_buffer->BytesRemaining() > 0) { | |
| 579 net::TestCompletionCallback write_callback; | |
| 580 int write_result = write_callback.GetResult(server_socket_->Write( | |
| 581 draining_buffer.get(), buffer_length, write_callback.callback())); | |
| 582 EXPECT_GT(write_result, 0); | |
| 583 draining_buffer->DidConsume(write_result); | |
| 584 } | |
| 585 return buffer_length; | |
| 586 } | |
| 587 | |
| 398 protected: | 588 protected: |
| 399 // Runs all pending tasks in the message loop. | 589 // Runs all pending tasks in the message loop. |
| 400 void RunPendingTasks() { | 590 void RunPendingTasks() { |
| 401 base::RunLoop run_loop; | 591 base::RunLoop run_loop; |
| 402 run_loop.RunUntilIdle(); | 592 run_loop.RunUntilIdle(); |
| 403 } | 593 } |
| 404 | 594 |
| 405 base::MessageLoop message_loop_; | 595 content::TestBrowserThreadBundle thread_bundle_{ |
| 596 content::TestBrowserThreadBundle::IO_MAINLOOP}; | |
|
Wez
2016/07/01 01:27:56
nit: Is there a good reason to use {} init rather
btolsch
2016/07/01 03:21:08
No, just a habit that slipped through. Moved to c
| |
| 406 Logger* logger_; | 597 Logger* logger_; |
| 407 std::unique_ptr<TestCastSocket> socket_; | 598 std::unique_ptr<TestCastSocket> socket_; |
| 408 CompleteHandler handler_; | 599 CompleteHandler handler_; |
| 409 std::unique_ptr<MockDelegate> delegate_; | 600 std::unique_ptr<MockDelegate> delegate_; |
| 410 | 601 |
| 602 // |channel_1_| and |channel_2_| form a full duplex connection between | |
| 603 // |socket_| and |server_socket_|. Passing data through them requires pumping | |
| 604 // the message loop. | |
| 605 std::unique_ptr<net::FakeDataChannel> channel_1_; | |
| 606 std::unique_ptr<net::FakeDataChannel> channel_2_; | |
| 607 | |
| 608 // Used to create the fake TCP socket for |socket_| when communicating with | |
| 609 // |server_socket_|. | |
| 610 std::unique_ptr<net::FakeSocket> fake_client_socket_; | |
| 611 | |
| 612 // |server_socket_| is used for the *RealSSL tests in order to test the | |
| 613 // CastSocket over a real SSL socket. The other members below are used to | |
| 614 // initialize |server_socket_|. | |
| 615 std::unique_ptr<net::SSLServerSocket> server_socket_; | |
| 616 std::unique_ptr<net::SSLServerContext> server_context_; | |
| 617 std::unique_ptr<crypto::RSAPrivateKey> server_private_key_; | |
| 618 scoped_refptr<net::X509Certificate> server_cert_; | |
| 619 net::SSLServerConfig server_ssl_config_; | |
| 620 | |
| 411 private: | 621 private: |
| 412 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); | 622 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); |
| 413 }; | 623 }; |
| 414 | 624 |
| 415 // Tests connecting and closing the socket. | 625 // Tests connecting and closing the socket. |
| 416 TEST_F(CastSocketTest, TestConnectAndClose) { | 626 TEST_F(CastSocketTest, TestConnectAndClose) { |
| 417 CreateCastSocket(); | 627 CreateCastSocket(); |
| 418 socket_->SetupMockTransport(); | 628 socket_->SetupMockTransport(); |
| 419 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); | 629 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); |
| 420 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); | 630 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 base::Unretained(&handler_))); | 1006 base::Unretained(&handler_))); |
| 797 RunPendingTasks(); | 1007 RunPendingTasks(); |
| 798 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); | 1008 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); |
| 799 RunPendingTasks(); | 1009 RunPendingTasks(); |
| 800 | 1010 |
| 801 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 1011 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 802 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, | 1012 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, |
| 803 socket_->error_state()); | 1013 socket_->error_state()); |
| 804 } | 1014 } |
| 805 | 1015 |
| 1016 // Tests connecting through an actual non-mocked CastTransport object and | |
| 1017 // non-mocked SSLClientSocket, testing the components in integration. | |
| 1018 TEST_F(CastSocketTest, TestConnectEndToEndWithRealSSL) { | |
| 1019 CreateCastSocketSecure(); | |
| 1020 CreateFakeSockets(); | |
| 1021 socket_->SetFakeSocket(fake_client_socket_.get()); | |
| 1022 | |
| 1023 socket_->Connect(std::move(delegate_), | |
| 1024 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 1025 base::Unretained(&handler_))); | |
| 1026 | |
| 1027 net::TestCompletionCallback handshake_callback; | |
| 1028 int server_ret = handshake_callback.GetResult( | |
| 1029 server_socket_->Handshake(handshake_callback.callback())); | |
| 1030 | |
| 1031 ASSERT_EQ(net::OK, server_ret); | |
| 1032 | |
| 1033 // Set low-level auth challenge expectations. | |
| 1034 CastMessage challenge = CreateAuthChallenge(); | |
| 1035 std::string challenge_str; | |
| 1036 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 1037 | |
| 1038 int challenge_buffer_length = challenge_str.size(); | |
| 1039 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 1040 new net::IOBuffer(challenge_buffer_length)); | |
| 1041 int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, | |
| 1042 server_socket_.get()); | |
| 1043 | |
| 1044 EXPECT_EQ(challenge_buffer_length, read); | |
| 1045 EXPECT_EQ(challenge_str, | |
| 1046 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
| 1047 | |
| 1048 // Set low-level auth reply expectations. | |
| 1049 CastMessage reply = CreateAuthReply(); | |
| 1050 std::string reply_str; | |
| 1051 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 1052 | |
| 1053 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 1054 new net::StringIOBuffer(reply_str)); | |
| 1055 int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), | |
| 1056 server_socket_.get()); | |
| 1057 | |
| 1058 EXPECT_EQ(reply_buffer->size(), written); | |
| 1059 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 1060 RunPendingTasks(); | |
| 1061 | |
| 1062 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1063 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1064 } | |
| 1065 | |
| 1066 // Sends message data through an actual non-mocked CastTransport object and | |
| 1067 // non-mocked SSLClientSocket, testing the components in integration. | |
| 1068 TEST_F(CastSocketTest, TestMessageEndToEndWithRealSSL) { | |
| 1069 CreateCastSocketSecure(); | |
| 1070 CreateFakeSockets(); | |
| 1071 socket_->SetFakeSocket(fake_client_socket_.get()); | |
|
Wez
2016/07/01 01:27:56
Is it necessary for the test to retain ownership o
btolsch
2016/07/01 03:21:08
Done (passed ownership to |socket_|).
| |
| 1072 | |
| 1073 socket_->Connect(std::move(delegate_), | |
| 1074 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 1075 base::Unretained(&handler_))); | |
| 1076 | |
| 1077 net::TestCompletionCallback handshake_callback; | |
| 1078 int server_ret = handshake_callback.GetResult( | |
| 1079 server_socket_->Handshake(handshake_callback.callback())); | |
| 1080 | |
| 1081 ASSERT_EQ(net::OK, server_ret); | |
| 1082 | |
| 1083 // Set low-level auth challenge expectations. | |
| 1084 CastMessage challenge = CreateAuthChallenge(); | |
| 1085 std::string challenge_str; | |
| 1086 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 1087 | |
| 1088 int challenge_buffer_length = challenge_str.size(); | |
| 1089 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 1090 new net::IOBuffer(challenge_buffer_length)); | |
| 1091 | |
| 1092 int read = ReadExactLength(challenge_buffer.get(), challenge_buffer_length, | |
| 1093 server_socket_.get()); | |
| 1094 | |
| 1095 EXPECT_EQ(challenge_buffer_length, read); | |
| 1096 EXPECT_EQ(challenge_str, | |
| 1097 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
| 1098 | |
| 1099 // Set low-level auth reply expectations. | |
| 1100 CastMessage reply = CreateAuthReply(); | |
| 1101 std::string reply_str; | |
| 1102 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 1103 | |
| 1104 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 1105 new net::StringIOBuffer(reply_str)); | |
| 1106 int written = WriteExactLength(reply_buffer.get(), reply_buffer->size(), | |
| 1107 server_socket_.get()); | |
| 1108 | |
| 1109 EXPECT_EQ(reply_buffer->size(), written); | |
| 1110 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 1111 RunPendingTasks(); | |
| 1112 | |
| 1113 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1114 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1115 | |
| 1116 // Send a test message through the ssl socket. | |
| 1117 CastMessage test_message = CreateTestMessage(); | |
| 1118 std::string test_message_str; | |
| 1119 EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str)); | |
| 1120 | |
| 1121 int test_message_length = test_message_str.size(); | |
| 1122 scoped_refptr<net::IOBuffer> test_message_buffer( | |
| 1123 new net::IOBuffer(test_message_length)); | |
| 1124 | |
| 1125 EXPECT_CALL(handler_, OnWriteComplete(net::OK)); | |
| 1126 socket_->transport()->SendMessage( | |
| 1127 test_message, base::Bind(&CompleteHandler::OnWriteComplete, | |
| 1128 base::Unretained(&handler_))); | |
| 1129 RunPendingTasks(); | |
| 1130 | |
| 1131 read = ReadExactLength(test_message_buffer.get(), test_message_length, | |
| 1132 server_socket_.get()); | |
| 1133 | |
| 1134 EXPECT_EQ(test_message_length, read); | |
| 1135 EXPECT_EQ(test_message_str, | |
| 1136 std::string(test_message_buffer->data(), test_message_length)); | |
| 1137 | |
| 1138 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1139 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1140 } | |
| 1141 | |
| 806 // Sends message data through an actual non-mocked CastTransport object, | 1142 // Sends message data through an actual non-mocked CastTransport object, |
| 807 // testing the two components in integration. | 1143 // testing the two components in integration. |
| 808 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { | 1144 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { |
| 809 CreateCastSocketSecure(); | 1145 CreateCastSocketSecure(); |
| 810 socket_->SetupTcpConnect(net::ASYNC, net::OK); | 1146 socket_->SetupTcpConnect(net::ASYNC, net::OK); |
| 811 socket_->SetupSslConnect(net::ASYNC, net::OK); | 1147 socket_->SetupSslConnect(net::ASYNC, net::OK); |
| 812 | 1148 |
| 813 // Set low-level auth challenge expectations. | 1149 // Set low-level auth challenge expectations. |
| 814 CastMessage challenge = CreateAuthChallenge(); | 1150 CastMessage challenge = CreateAuthChallenge(); |
| 815 std::string challenge_str; | 1151 std::string challenge_str; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 904 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); | 1240 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); |
| 905 EXPECT_FALSE(socket_->audio_only()); | 1241 EXPECT_FALSE(socket_->audio_only()); |
| 906 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); | 1242 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); |
| 907 EXPECT_FALSE(socket_->audio_only()); | 1243 EXPECT_FALSE(socket_->audio_only()); |
| 908 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); | 1244 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); |
| 909 EXPECT_TRUE(socket_->audio_only()); | 1245 EXPECT_TRUE(socket_->audio_only()); |
| 910 } | 1246 } |
| 911 } // namespace cast_channel | 1247 } // namespace cast_channel |
| 912 } // namespace api | 1248 } // namespace api |
| 913 } // namespace extensions | 1249 } // namespace extensions |
| OLD | NEW |