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" |
| 33 #include "net/log/test_net_log.h" | 36 #include "net/log/test_net_log.h" |
| 34 #include "net/socket/socket_test_util.h" | 37 #include "net/socket/socket_test_util.h" |
| 35 #include "net/socket/ssl_client_socket.h" | 38 #include "net/socket/ssl_client_socket.h" |
| 39 #include "net/socket/ssl_server_socket.h" | |
| 36 #include "net/socket/tcp_client_socket.h" | 40 #include "net/socket/tcp_client_socket.h" |
| 37 #include "net/ssl/ssl_info.h" | 41 #include "net/ssl/ssl_info.h" |
| 42 #include "net/ssl/ssl_server_config.h" | |
| 38 #include "net/test/cert_test_util.h" | 43 #include "net/test/cert_test_util.h" |
| 39 #include "net/test/test_data_directory.h" | 44 #include "net/test/test_data_directory.h" |
| 40 #include "testing/gmock/include/gmock/gmock.h" | 45 #include "testing/gmock/include/gmock/gmock.h" |
| 41 #include "testing/gtest/include/gtest/gtest.h" | 46 #include "testing/gtest/include/gtest/gtest.h" |
| 42 | 47 |
| 43 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). | 48 const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit). |
| 44 | 49 |
| 45 using ::testing::_; | 50 using ::testing::_; |
| 46 using ::testing::A; | 51 using ::testing::A; |
| 47 using ::testing::DoAll; | 52 using ::testing::DoAll; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 CompleteHandler() {} | 169 CompleteHandler() {} |
| 165 MOCK_METHOD1(OnCloseComplete, void(int result)); | 170 MOCK_METHOD1(OnCloseComplete, void(int result)); |
| 166 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); | 171 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); |
| 167 MOCK_METHOD1(OnWriteComplete, void(int result)); | 172 MOCK_METHOD1(OnWriteComplete, void(int result)); |
| 168 MOCK_METHOD1(OnReadComplete, void(int result)); | 173 MOCK_METHOD1(OnReadComplete, void(int result)); |
| 169 | 174 |
| 170 private: | 175 private: |
| 171 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 176 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
| 172 }; | 177 }; |
| 173 | 178 |
| 179 class FakeTCPClientSocket : public net::TCPClientSocket { | |
| 180 public: | |
| 181 FakeTCPClientSocket(net::FakeSocket* socket) | |
| 182 : net::TCPClientSocket(net::AddressList(), | |
| 183 nullptr, | |
| 184 nullptr, | |
| 185 net::NetLog::Source()), | |
| 186 socket_(socket) { | |
| 187 DCHECK(socket_); | |
| 188 } | |
| 189 | |
| 190 int Read(net::IOBuffer* buf, | |
| 191 int buf_len, | |
| 192 const net::CompletionCallback& callback) override { | |
| 193 return socket_->Read(buf, buf_len, callback); | |
| 194 } | |
| 195 | |
| 196 int Write(net::IOBuffer* buf, | |
| 197 int buf_len, | |
| 198 const net::CompletionCallback& callback) override { | |
| 199 return socket_->Write(buf, buf_len, callback); | |
| 200 } | |
| 201 | |
| 202 int SetReceiveBufferSize(int32_t size) override { | |
| 203 return socket_->SetReceiveBufferSize(size); | |
| 204 } | |
| 205 | |
| 206 int SetSendBufferSize(int32_t size) override { | |
| 207 return socket_->SetSendBufferSize(size); | |
| 208 } | |
| 209 | |
| 210 int Connect(const net::CompletionCallback& callback) override { | |
| 211 return socket_->Connect(callback); | |
| 212 } | |
| 213 | |
| 214 void Disconnect() override { return socket_->Disconnect(); } | |
| 215 | |
| 216 bool IsConnected() const override { return socket_->IsConnected(); } | |
| 217 | |
| 218 bool IsConnectedAndIdle() const override { | |
| 219 return socket_->IsConnectedAndIdle(); | |
| 220 } | |
| 221 | |
| 222 int GetPeerAddress(net::IPEndPoint* address) const override { | |
| 223 return socket_->GetPeerAddress(address); | |
| 224 } | |
| 225 | |
| 226 int GetLocalAddress(net::IPEndPoint* address) const override { | |
| 227 return socket_->GetLocalAddress(address); | |
| 228 } | |
| 229 | |
| 230 const net::BoundNetLog& NetLog() const override { return socket_->NetLog(); } | |
| 231 | |
| 232 void SetSubresourceSpeculation() override { | |
| 233 socket_->SetSubresourceSpeculation(); | |
| 234 } | |
| 235 | |
| 236 void SetOmniboxSpeculation() override { socket_->SetOmniboxSpeculation(); } | |
| 237 | |
| 238 bool WasEverUsed() const override { return socket_->WasEverUsed(); } | |
| 239 | |
| 240 bool WasNpnNegotiated() const override { return socket_->WasNpnNegotiated(); } | |
| 241 | |
| 242 net::NextProto GetNegotiatedProtocol() const override { | |
| 243 return socket_->GetNegotiatedProtocol(); | |
| 244 } | |
| 245 | |
| 246 bool GetSSLInfo(net::SSLInfo* ssl_info) override { | |
| 247 return socket_->GetSSLInfo(ssl_info); | |
| 248 } | |
| 249 | |
| 250 void GetConnectionAttempts(net::ConnectionAttempts* out) const override { | |
| 251 socket_->GetConnectionAttempts(out); | |
| 252 } | |
| 253 | |
| 254 void ClearConnectionAttempts() override { | |
| 255 socket_->ClearConnectionAttempts(); | |
| 256 } | |
| 257 | |
| 258 void AddConnectionAttempts(const net::ConnectionAttempts& attempts) override { | |
| 259 socket_->AddConnectionAttempts(attempts); | |
| 260 } | |
| 261 | |
| 262 int64_t GetTotalReceivedBytes() const override { | |
| 263 return socket_->GetTotalReceivedBytes(); | |
| 264 } | |
| 265 | |
| 266 private: | |
| 267 net::FakeSocket* socket_; | |
| 268 }; | |
| 269 | |
| 174 class TestCastSocket : public CastSocketImpl { | 270 class TestCastSocket : public CastSocketImpl { |
| 175 public: | 271 public: |
| 176 static std::unique_ptr<TestCastSocket> Create( | 272 static std::unique_ptr<TestCastSocket> Create( |
| 177 Logger* logger, | 273 Logger* logger, |
| 178 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { | 274 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { |
| 179 return std::unique_ptr<TestCastSocket>( | 275 return std::unique_ptr<TestCastSocket>( |
| 180 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, | 276 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, |
| 181 kDistantTimeoutMillis, logger, device_capabilities)); | 277 kDistantTimeoutMillis, logger, device_capabilities)); |
| 182 } | 278 } |
| 183 | 279 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 false, | 311 false, |
| 216 logger, | 312 logger, |
| 217 device_capabilities), | 313 device_capabilities), |
| 218 capturing_net_log_(capturing_net_log), | 314 capturing_net_log_(capturing_net_log), |
| 219 ip_(ip_endpoint), | 315 ip_(ip_endpoint), |
| 220 extract_cert_result_(true), | 316 extract_cert_result_(true), |
| 221 verify_challenge_result_(true), | 317 verify_challenge_result_(true), |
| 222 verify_challenge_disallow_(false), | 318 verify_challenge_disallow_(false), |
| 223 tcp_unresponsive_(false), | 319 tcp_unresponsive_(false), |
| 224 mock_timer_(new base::MockTimer(false, false)), | 320 mock_timer_(new base::MockTimer(false, false)), |
| 225 mock_transport_(nullptr) {} | 321 mock_transport_(nullptr), |
| 322 fake_socket_(nullptr) {} | |
|
Ryan Sleevi
2016/06/24 21:44:51
Need more documentation throughout this file. It's
btolsch
2016/06/25 00:19:28
Done.
| |
| 226 | 323 |
| 227 ~TestCastSocket() override {} | 324 ~TestCastSocket() override {} |
| 228 | 325 |
| 229 void SetupMockTransport() { | 326 void SetupMockTransport() { |
| 230 mock_transport_ = new MockCastTransport; | 327 mock_transport_ = new MockCastTransport; |
| 231 SetTransportForTesting(base::WrapUnique(mock_transport_)); | 328 SetTransportForTesting(base::WrapUnique(mock_transport_)); |
| 232 } | 329 } |
| 233 | 330 |
| 331 void SetFakeSocket(net::FakeSocket* fake_socket) { | |
| 332 fake_socket_ = fake_socket; | |
| 333 } | |
| 334 | |
| 234 // Socket connection helpers. | 335 // Socket connection helpers. |
| 235 void SetupTcpConnect(net::IoMode mode, int result) { | 336 void SetupTcpConnect(net::IoMode mode, int result) { |
| 236 tcp_connect_data_.reset(new net::MockConnect(mode, result)); | 337 tcp_connect_data_.reset(new net::MockConnect(mode, result)); |
| 237 } | 338 } |
| 238 void SetupSslConnect(net::IoMode mode, int result) { | 339 void SetupSslConnect(net::IoMode mode, int result) { |
| 239 ssl_connect_data_.reset(new net::MockConnect(mode, result)); | 340 ssl_connect_data_.reset(new net::MockConnect(mode, result)); |
| 240 } | 341 } |
| 241 | 342 |
| 242 // Socket I/O helpers. | 343 // Socket I/O helpers. |
| 243 void AddWriteResult(const net::MockWrite& write) { | 344 void AddWriteResult(const net::MockWrite& write) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 289 | 390 |
| 290 MockCastTransport* GetMockTransport() { | 391 MockCastTransport* GetMockTransport() { |
| 291 CHECK(mock_transport_); | 392 CHECK(mock_transport_); |
| 292 return mock_transport_; | 393 return mock_transport_; |
| 293 } | 394 } |
| 294 | 395 |
| 295 private: | 396 private: |
| 296 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { | 397 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { |
| 297 if (tcp_unresponsive_) { | 398 if (tcp_unresponsive_) { |
| 298 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); | 399 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); |
| 400 } else if (fake_socket_) { | |
| 401 return std::unique_ptr<net::TCPClientSocket>( | |
| 402 new FakeTCPClientSocket(fake_socket_)); | |
| 299 } else { | 403 } else { |
| 300 net::MockConnect* connect_data = tcp_connect_data_.get(); | 404 net::MockConnect* connect_data = tcp_connect_data_.get(); |
| 301 connect_data->peer_addr = ip_; | 405 connect_data->peer_addr = ip_; |
| 302 return std::unique_ptr<net::TCPClientSocket>( | 406 return std::unique_ptr<net::TCPClientSocket>( |
| 303 new MockTCPSocket(*connect_data)); | 407 new MockTCPSocket(*connect_data)); |
| 304 } | 408 } |
| 305 } | 409 } |
| 306 | 410 |
| 307 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( | 411 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( |
| 308 std::unique_ptr<net::StreamSocket> socket) override { | 412 std::unique_ptr<net::StreamSocket> socket) override { |
| 413 if (fake_socket_) { | |
| 414 return CastSocketImpl::CreateSslSocket(std::move(socket)); | |
| 415 } | |
| 309 net::MockConnect* connect_data = ssl_connect_data_.get(); | 416 net::MockConnect* connect_data = ssl_connect_data_.get(); |
| 310 connect_data->peer_addr = ip_; | 417 connect_data->peer_addr = ip_; |
| 311 | 418 |
| 312 ssl_data_.reset(new net::StaticSocketDataProvider( | 419 ssl_data_.reset(new net::StaticSocketDataProvider( |
| 313 reads_.data(), reads_.size(), writes_.data(), writes_.size())); | 420 reads_.data(), reads_.size(), writes_.data(), writes_.size())); |
| 314 ssl_data_->set_connect_data(*connect_data); | 421 ssl_data_->set_connect_data(*connect_data); |
| 315 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! | 422 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! |
| 316 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( | 423 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( |
| 317 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); | 424 net::AddressList(), capturing_net_log_.get(), ssl_data_.get())); |
| 318 } | 425 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 343 // Simulated result of peer cert extraction. | 450 // Simulated result of peer cert extraction. |
| 344 bool extract_cert_result_; | 451 bool extract_cert_result_; |
| 345 // Simulated result of verifying challenge reply. | 452 // Simulated result of verifying challenge reply. |
| 346 bool verify_challenge_result_; | 453 bool verify_challenge_result_; |
| 347 bool verify_challenge_disallow_; | 454 bool verify_challenge_disallow_; |
| 348 // If true, makes TCP connection process stall. For timeout testing. | 455 // If true, makes TCP connection process stall. For timeout testing. |
| 349 bool tcp_unresponsive_; | 456 bool tcp_unresponsive_; |
| 350 std::unique_ptr<base::MockTimer> mock_timer_; | 457 std::unique_ptr<base::MockTimer> mock_timer_; |
| 351 MockCastTransport* mock_transport_; | 458 MockCastTransport* mock_transport_; |
| 352 | 459 |
| 460 net::FakeSocket* fake_socket_; | |
| 461 | |
| 353 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); | 462 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); |
| 354 }; | 463 }; |
| 355 | 464 |
| 356 class CastSocketTest : public testing::Test { | 465 class CastSocketTest : public testing::Test { |
| 357 public: | 466 public: |
| 358 CastSocketTest() | 467 CastSocketTest() |
| 359 : logger_( | 468 : logger_( |
| 360 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), | 469 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), |
| 361 base::Time())), | 470 base::Time())), |
| 362 delegate_(new MockDelegate) {} | 471 delegate_(new MockDelegate) {} |
| 363 ~CastSocketTest() override {} | 472 ~CastSocketTest() override {} |
| 364 | 473 |
| 365 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } | 474 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } |
| 366 | 475 |
| 367 void TearDown() override { | 476 void TearDown() override { |
| 368 if (socket_.get()) { | 477 if (socket_.get()) { |
| 369 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 478 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 370 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 479 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 371 base::Unretained(&handler_))); | 480 base::Unretained(&handler_))); |
| 372 } | 481 } |
| 373 } | 482 } |
| 374 | 483 |
| 375 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } | 484 void CreateCastSocket() { socket_ = TestCastSocket::Create(logger_); } |
| 376 | 485 |
| 377 void CreateCastSocketSecure() { | 486 void CreateCastSocketSecure() { |
| 378 socket_ = TestCastSocket::CreateSecure(logger_); | 487 socket_ = TestCastSocket::CreateSecure(logger_); |
| 379 } | 488 } |
| 380 | 489 |
| 490 void CreateFakeSockets() { | |
| 491 channel_1_.reset(new net::FakeDataChannel()); | |
| 492 channel_2_.reset(new net::FakeDataChannel()); | |
| 493 server_cert_ = net::ImportCertFromFile(net::GetTestCertsDirectory(), | |
| 494 "unittest.selfsigned.der"); | |
|
Ryan Sleevi
2016/06/24 21:44:51
I have no idea why we've got this cert. I've added
btolsch
2016/06/25 00:19:28
Done. This, among other things, was taken from SSL
| |
| 495 ASSERT_TRUE(server_cert_); | |
| 496 server_private_key_ = ReadTestKey("unittest.key.bin"); | |
| 497 ASSERT_TRUE(server_private_key_); | |
| 498 server_context_ = CreateSSLServerContext( | |
| 499 server_cert_.get(), *server_private_key_, server_ssl_config_); | |
| 500 | |
| 501 fake_client_socket_.reset( | |
| 502 new net::FakeSocket(channel_1_.get(), channel_2_.get())); | |
| 503 std::unique_ptr<net::StreamSocket> server_socket( | |
| 504 new net::FakeSocket(channel_2_.get(), channel_1_.get())); | |
| 505 | |
| 506 server_socket_ = | |
| 507 server_context_->CreateSSLServerSocket(std::move(server_socket)); | |
| 508 ASSERT_TRUE(server_socket_); | |
| 509 } | |
| 510 | |
| 511 std::unique_ptr<crypto::RSAPrivateKey> ReadTestKey( | |
| 512 const base::StringPiece& name) { | |
| 513 base::FilePath certs_dir(net::GetTestCertsDirectory()); | |
| 514 base::FilePath key_path = certs_dir.AppendASCII(name); | |
| 515 std::string key_string; | |
| 516 if (!base::ReadFileToString(key_path, &key_string)) | |
| 517 return nullptr; | |
| 518 std::vector<uint8_t> key_vector( | |
| 519 reinterpret_cast<const uint8_t*>(key_string.data()), | |
| 520 reinterpret_cast<const uint8_t*>(key_string.data() + | |
| 521 key_string.length())); | |
| 522 std::unique_ptr<crypto::RSAPrivateKey> key( | |
| 523 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); | |
| 524 return key; | |
| 525 } | |
| 526 | |
| 381 void HandleAuthHandshake() { | 527 void HandleAuthHandshake() { |
| 382 socket_->SetupMockTransport(); | 528 socket_->SetupMockTransport(); |
| 383 CastMessage challenge_proto = CreateAuthChallenge(); | 529 CastMessage challenge_proto = CreateAuthChallenge(); |
| 384 EXPECT_CALL(*socket_->GetMockTransport(), | 530 EXPECT_CALL(*socket_->GetMockTransport(), |
| 385 SendMessage(EqualsProto(challenge_proto), _)) | 531 SendMessage(EqualsProto(challenge_proto), _)) |
| 386 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); | 532 .WillOnce(PostCompletionCallbackTask<1>(net::OK)); |
| 387 EXPECT_CALL(*socket_->GetMockTransport(), Start()); | 533 EXPECT_CALL(*socket_->GetMockTransport(), Start()); |
| 388 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | 534 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); |
| 389 socket_->Connect(std::move(delegate_), | 535 socket_->Connect(std::move(delegate_), |
| 390 base::Bind(&CompleteHandler::OnConnectComplete, | 536 base::Bind(&CompleteHandler::OnConnectComplete, |
| 391 base::Unretained(&handler_))); | 537 base::Unretained(&handler_))); |
| 392 RunPendingTasks(); | 538 RunPendingTasks(); |
| 393 socket_->GetMockTransport()->current_delegate()->OnMessage( | 539 socket_->GetMockTransport()->current_delegate()->OnMessage( |
| 394 CreateAuthReply()); | 540 CreateAuthReply()); |
| 395 RunPendingTasks(); | 541 RunPendingTasks(); |
| 396 } | 542 } |
| 397 | 543 |
| 398 protected: | 544 protected: |
| 399 // Runs all pending tasks in the message loop. | 545 // Runs all pending tasks in the message loop. |
| 400 void RunPendingTasks() { | 546 void RunPendingTasks() { |
| 401 base::RunLoop run_loop; | 547 base::RunLoop run_loop; |
| 402 run_loop.RunUntilIdle(); | 548 run_loop.RunUntilIdle(); |
| 403 } | 549 } |
| 404 | 550 |
| 405 base::MessageLoop message_loop_; | 551 content::TestBrowserThreadBundle thread_bundle_{ |
| 552 content::TestBrowserThreadBundle::IO_MAINLOOP}; | |
| 406 Logger* logger_; | 553 Logger* logger_; |
| 407 std::unique_ptr<TestCastSocket> socket_; | 554 std::unique_ptr<TestCastSocket> socket_; |
| 408 CompleteHandler handler_; | 555 CompleteHandler handler_; |
| 409 std::unique_ptr<MockDelegate> delegate_; | 556 std::unique_ptr<MockDelegate> delegate_; |
| 410 | 557 |
| 558 std::unique_ptr<net::FakeDataChannel> channel_1_; | |
| 559 std::unique_ptr<net::FakeDataChannel> channel_2_; | |
| 560 std::unique_ptr<net::FakeSocket> fake_client_socket_; | |
| 561 std::unique_ptr<net::SSLServerSocket> server_socket_; | |
| 562 std::unique_ptr<net::SSLServerContext> server_context_; | |
| 563 std::unique_ptr<crypto::RSAPrivateKey> server_private_key_; | |
| 564 scoped_refptr<net::X509Certificate> server_cert_; | |
| 565 net::SSLServerConfig server_ssl_config_; | |
| 566 | |
| 411 private: | 567 private: |
| 412 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); | 568 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); |
| 413 }; | 569 }; |
| 414 | 570 |
| 415 // Tests connecting and closing the socket. | 571 // Tests connecting and closing the socket. |
| 416 TEST_F(CastSocketTest, TestConnectAndClose) { | 572 TEST_F(CastSocketTest, TestConnectAndClose) { |
| 417 CreateCastSocket(); | 573 CreateCastSocket(); |
| 418 socket_->SetupMockTransport(); | 574 socket_->SetupMockTransport(); |
| 419 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); | 575 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); |
| 420 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); | 576 socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK); |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 base::Unretained(&handler_))); | 952 base::Unretained(&handler_))); |
| 797 RunPendingTasks(); | 953 RunPendingTasks(); |
| 798 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); | 954 socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply()); |
| 799 RunPendingTasks(); | 955 RunPendingTasks(); |
| 800 | 956 |
| 801 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 957 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 802 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, | 958 EXPECT_EQ(cast_channel::CHANNEL_ERROR_AUTHENTICATION_ERROR, |
| 803 socket_->error_state()); | 959 socket_->error_state()); |
| 804 } | 960 } |
| 805 | 961 |
| 962 // Tests connecting through an actual non-mocked CastTransport object and | |
| 963 // non-mocked SSLClientSocket, testing the components in integration. | |
| 964 TEST_F(CastSocketTest, TestConnectEndToEndWithRealSSL) { | |
| 965 CreateCastSocketSecure(); | |
| 966 CreateFakeSockets(); | |
| 967 socket_->SetFakeSocket(fake_client_socket_.get()); | |
| 968 | |
| 969 net::TestCompletionCallback handshake_callback; | |
| 970 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | |
| 971 | |
| 972 socket_->Connect(std::move(delegate_), | |
| 973 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 974 base::Unretained(&handler_))); | |
|
Ryan Sleevi
2016/06/24 21:44:51
BUG?: You should be checking/storing the result co
btolsch
2016/06/25 00:19:28
This is CastSocket::Connect and it returns void.
| |
| 975 server_ret = handshake_callback.GetResult(server_ret); | |
|
Ryan Sleevi
2016/06/24 21:44:51
DESIGN: server_ret = handshake_callback.GetResult(
btolsch
2016/06/25 00:19:28
Done.
| |
| 976 | |
| 977 ASSERT_EQ(net::OK, server_ret); | |
| 978 | |
| 979 // Set low-level auth challenge expectations. | |
| 980 CastMessage challenge = CreateAuthChallenge(); | |
| 981 std::string challenge_str; | |
| 982 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 983 | |
| 984 int challenge_buffer_length = challenge_str.size(); | |
| 985 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 986 new net::IOBuffer(challenge_buffer_length)); | |
| 987 net::TestCompletionCallback read_callback; | |
| 988 int read_result = | |
| 989 server_socket_->Read(challenge_buffer.get(), challenge_buffer_length, | |
| 990 read_callback.callback()); | |
| 991 | |
| 992 EXPECT_TRUE(read_result > 0 || read_result == net::ERR_IO_PENDING); | |
| 993 read_result = read_callback.GetResult(read_result); | |
| 994 EXPECT_GT(read_result, 0); | |
|
Ryan Sleevi
2016/06/24 21:44:51
DESIGN: Replace 992-994 with
read_result = read_c
btolsch
2016/06/25 00:19:28
Done.
| |
| 995 | |
| 996 EXPECT_EQ(challenge_str, | |
| 997 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
|
Ryan Sleevi
2016/06/24 21:44:51
BUG: Note |read_result| may be <= challenge_buffer
btolsch
2016/06/25 00:19:28
Done.
| |
| 998 | |
| 999 // Set low-level auth reply expectations. | |
| 1000 CastMessage reply = CreateAuthReply(); | |
| 1001 std::string reply_str; | |
| 1002 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 1003 | |
| 1004 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 1005 new net::StringIOBuffer(reply_str)); | |
| 1006 net::TestCompletionCallback write_callback; | |
| 1007 int write_result = server_socket_->Write( | |
| 1008 reply_buffer.get(), reply_buffer->size(), write_callback.callback()); | |
|
Ryan Sleevi
2016/06/24 21:44:51
Same remarks about write & write sizes
btolsch
2016/06/25 00:19:28
Done.
| |
| 1009 | |
| 1010 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 1011 EXPECT_TRUE(write_result > 0 || write_result == net::ERR_IO_PENDING); | |
| 1012 write_result = write_callback.GetResult(write_result); | |
|
Ryan Sleevi
2016/06/24 21:44:51
Same remarks about coalescing the GetResult()
btolsch
2016/06/25 00:19:28
Done.
| |
| 1013 EXPECT_GT(write_result, 0); | |
| 1014 RunPendingTasks(); | |
| 1015 | |
| 1016 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1017 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1018 } | |
| 1019 | |
| 1020 // Sends message data through an actual non-mocked CastTransport object and | |
| 1021 // non-mocked SSLClientSocket, testing the components in integration. | |
| 1022 TEST_F(CastSocketTest, TestMessageEndToEndWithRealSSL) { | |
| 1023 CreateCastSocketSecure(); | |
| 1024 CreateFakeSockets(); | |
| 1025 socket_->SetFakeSocket(fake_client_socket_.get()); | |
| 1026 | |
| 1027 net::TestCompletionCallback handshake_callback; | |
| 1028 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | |
| 1029 | |
| 1030 socket_->Connect(std::move(delegate_), | |
| 1031 base::Bind(&CompleteHandler::OnConnectComplete, | |
| 1032 base::Unretained(&handler_))); | |
| 1033 server_ret = handshake_callback.GetResult(server_ret); | |
| 1034 | |
| 1035 ASSERT_EQ(net::OK, server_ret); | |
| 1036 | |
| 1037 // Set low-level auth challenge expectations. | |
| 1038 CastMessage challenge = CreateAuthChallenge(); | |
| 1039 std::string challenge_str; | |
| 1040 EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str)); | |
| 1041 | |
| 1042 int challenge_buffer_length = challenge_str.size(); | |
| 1043 scoped_refptr<net::IOBuffer> challenge_buffer( | |
| 1044 new net::IOBuffer(challenge_buffer_length)); | |
| 1045 net::TestCompletionCallback read_callback; | |
| 1046 int read_result = | |
| 1047 server_socket_->Read(challenge_buffer.get(), challenge_buffer_length, | |
| 1048 read_callback.callback()); | |
| 1049 | |
| 1050 EXPECT_TRUE(read_result > 0 || read_result == net::ERR_IO_PENDING); | |
| 1051 read_result = read_callback.GetResult(read_result); | |
| 1052 EXPECT_GT(read_result, 0); | |
| 1053 | |
| 1054 EXPECT_EQ(challenge_str, | |
| 1055 std::string(challenge_buffer->data(), challenge_buffer_length)); | |
| 1056 | |
| 1057 // Set low-level auth reply expectations. | |
| 1058 CastMessage reply = CreateAuthReply(); | |
| 1059 std::string reply_str; | |
| 1060 EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str)); | |
| 1061 | |
| 1062 scoped_refptr<net::StringIOBuffer> reply_buffer( | |
| 1063 new net::StringIOBuffer(reply_str)); | |
| 1064 net::TestCompletionCallback write_callback; | |
| 1065 int write_result = server_socket_->Write( | |
| 1066 reply_buffer.get(), reply_buffer->size(), write_callback.callback()); | |
| 1067 | |
| 1068 EXPECT_CALL(handler_, OnConnectComplete(CHANNEL_ERROR_NONE)); | |
| 1069 EXPECT_TRUE(write_result > 0 || write_result == net::ERR_IO_PENDING); | |
| 1070 write_result = write_callback.GetResult(write_result); | |
| 1071 EXPECT_GT(write_result, 0); | |
| 1072 RunPendingTasks(); | |
| 1073 | |
| 1074 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1075 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1076 | |
| 1077 // Send a test message through the ssl socket. | |
| 1078 CastMessage test_message = CreateTestMessage(); | |
| 1079 std::string test_message_str; | |
| 1080 EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str)); | |
| 1081 | |
| 1082 int test_message_length = test_message_str.size(); | |
| 1083 scoped_refptr<net::IOBuffer> test_message_buffer( | |
| 1084 new net::IOBuffer(test_message_length)); | |
| 1085 | |
| 1086 EXPECT_CALL(handler_, OnWriteComplete(net::OK)); | |
| 1087 socket_->transport()->SendMessage( | |
| 1088 test_message, base::Bind(&CompleteHandler::OnWriteComplete, | |
| 1089 base::Unretained(&handler_))); | |
| 1090 RunPendingTasks(); | |
| 1091 | |
| 1092 net::TestCompletionCallback test_message_callback; | |
| 1093 read_result = | |
| 1094 server_socket_->Read(test_message_buffer.get(), test_message_length, | |
| 1095 test_message_callback.callback()); | |
| 1096 | |
| 1097 EXPECT_TRUE(read_result > 0 || read_result == net::ERR_IO_PENDING); | |
| 1098 read_result = read_callback.GetResult(read_result); | |
| 1099 EXPECT_GT(read_result, 0); | |
| 1100 | |
| 1101 EXPECT_EQ(test_message_str, | |
| 1102 std::string(test_message_buffer->data(), test_message_length)); | |
| 1103 | |
| 1104 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 1105 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 1106 } | |
| 1107 | |
| 806 // Sends message data through an actual non-mocked CastTransport object, | 1108 // Sends message data through an actual non-mocked CastTransport object, |
| 807 // testing the two components in integration. | 1109 // testing the two components in integration. |
| 808 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { | 1110 TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) { |
| 809 CreateCastSocketSecure(); | 1111 CreateCastSocketSecure(); |
| 810 socket_->SetupTcpConnect(net::ASYNC, net::OK); | 1112 socket_->SetupTcpConnect(net::ASYNC, net::OK); |
| 811 socket_->SetupSslConnect(net::ASYNC, net::OK); | 1113 socket_->SetupSslConnect(net::ASYNC, net::OK); |
| 812 | 1114 |
| 813 // Set low-level auth challenge expectations. | 1115 // Set low-level auth challenge expectations. |
| 814 CastMessage challenge = CreateAuthChallenge(); | 1116 CastMessage challenge = CreateAuthChallenge(); |
| 815 std::string challenge_str; | 1117 std::string challenge_str; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 904 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); | 1206 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); |
| 905 EXPECT_FALSE(socket_->audio_only()); | 1207 EXPECT_FALSE(socket_->audio_only()); |
| 906 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); | 1208 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); |
| 907 EXPECT_FALSE(socket_->audio_only()); | 1209 EXPECT_FALSE(socket_->audio_only()); |
| 908 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); | 1210 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); |
| 909 EXPECT_TRUE(socket_->audio_only()); | 1211 EXPECT_TRUE(socket_->audio_only()); |
| 910 } | 1212 } |
| 911 } // namespace cast_channel | 1213 } // namespace cast_channel |
| 912 } // namespace api | 1214 } // namespace api |
| 913 } // namespace extensions | 1215 } // namespace extensions |
| OLD | NEW |