| 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/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ptr_util.h" |
| 13 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
| 14 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 15 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
| 16 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/sys_byteorder.h" | 18 #include "base/sys_byteorder.h" |
| 18 #include "base/test/simple_test_clock.h" | 19 #include "base/test/simple_test_clock.h" |
| 19 #include "base/timer/mock_timer.h" | 20 #include "base/timer/mock_timer.h" |
| 20 #include "extensions/browser/api/cast_channel/cast_auth_util.h" | 21 #include "extensions/browser/api/cast_channel/cast_auth_util.h" |
| 21 #include "extensions/browser/api/cast_channel/cast_framer.h" | 22 #include "extensions/browser/api/cast_channel/cast_framer.h" |
| 22 #include "extensions/browser/api/cast_channel/cast_message_util.h" | 23 #include "extensions/browser/api/cast_channel/cast_message_util.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); | 162 MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state)); |
| 162 MOCK_METHOD1(OnWriteComplete, void(int result)); | 163 MOCK_METHOD1(OnWriteComplete, void(int result)); |
| 163 MOCK_METHOD1(OnReadComplete, void(int result)); | 164 MOCK_METHOD1(OnReadComplete, void(int result)); |
| 164 | 165 |
| 165 private: | 166 private: |
| 166 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 167 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
| 167 }; | 168 }; |
| 168 | 169 |
| 169 class TestCastSocket : public CastSocketImpl { | 170 class TestCastSocket : public CastSocketImpl { |
| 170 public: | 171 public: |
| 171 static scoped_ptr<TestCastSocket> Create( | 172 static std::unique_ptr<TestCastSocket> Create( |
| 172 Logger* logger, | 173 Logger* logger, |
| 173 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { | 174 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { |
| 174 return scoped_ptr<TestCastSocket>( | 175 return std::unique_ptr<TestCastSocket>( |
| 175 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, | 176 new TestCastSocket(CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL, |
| 176 kDistantTimeoutMillis, logger, device_capabilities)); | 177 kDistantTimeoutMillis, logger, device_capabilities)); |
| 177 } | 178 } |
| 178 | 179 |
| 179 static scoped_ptr<TestCastSocket> CreateSecure( | 180 static std::unique_ptr<TestCastSocket> CreateSecure( |
| 180 Logger* logger, | 181 Logger* logger, |
| 181 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { | 182 uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) { |
| 182 return scoped_ptr<TestCastSocket>(new TestCastSocket( | 183 return std::unique_ptr<TestCastSocket>(new TestCastSocket( |
| 183 CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL_VERIFIED, | 184 CreateIPEndPointForTest(), CHANNEL_AUTH_TYPE_SSL_VERIFIED, |
| 184 kDistantTimeoutMillis, logger, device_capabilities)); | 185 kDistantTimeoutMillis, logger, device_capabilities)); |
| 185 } | 186 } |
| 186 | 187 |
| 187 explicit TestCastSocket(const net::IPEndPoint& ip_endpoint, | 188 explicit TestCastSocket(const net::IPEndPoint& ip_endpoint, |
| 188 ChannelAuthType channel_auth, | 189 ChannelAuthType channel_auth, |
| 189 int64_t timeout_ms, | 190 int64_t timeout_ms, |
| 190 Logger* logger, | 191 Logger* logger, |
| 191 uint64_t device_capabilities) | 192 uint64_t device_capabilities) |
| 192 : CastSocketImpl("some_extension_id", | 193 : CastSocketImpl("some_extension_id", |
| 193 ip_endpoint, | 194 ip_endpoint, |
| 194 channel_auth, | 195 channel_auth, |
| 195 &capturing_net_log_, | 196 &capturing_net_log_, |
| 196 base::TimeDelta::FromMilliseconds(timeout_ms), | 197 base::TimeDelta::FromMilliseconds(timeout_ms), |
| 197 false, | 198 false, |
| 198 logger, | 199 logger, |
| 199 device_capabilities), | 200 device_capabilities), |
| 200 ip_(ip_endpoint), | 201 ip_(ip_endpoint), |
| 201 extract_cert_result_(true), | 202 extract_cert_result_(true), |
| 202 verify_challenge_result_(true), | 203 verify_challenge_result_(true), |
| 203 verify_challenge_disallow_(false), | 204 verify_challenge_disallow_(false), |
| 204 tcp_unresponsive_(false), | 205 tcp_unresponsive_(false), |
| 205 mock_timer_(new base::MockTimer(false, false)), | 206 mock_timer_(new base::MockTimer(false, false)), |
| 206 mock_transport_(nullptr) {} | 207 mock_transport_(nullptr) {} |
| 207 | 208 |
| 208 ~TestCastSocket() override {} | 209 ~TestCastSocket() override {} |
| 209 | 210 |
| 210 void SetupMockTransport() { | 211 void SetupMockTransport() { |
| 211 mock_transport_ = new MockCastTransport; | 212 mock_transport_ = new MockCastTransport; |
| 212 SetTransportForTesting(make_scoped_ptr(mock_transport_)); | 213 SetTransportForTesting(base::WrapUnique(mock_transport_)); |
| 213 } | 214 } |
| 214 | 215 |
| 215 // Socket connection helpers. | 216 // Socket connection helpers. |
| 216 void SetupTcpConnect(net::IoMode mode, int result) { | 217 void SetupTcpConnect(net::IoMode mode, int result) { |
| 217 tcp_connect_data_.reset(new net::MockConnect(mode, result)); | 218 tcp_connect_data_.reset(new net::MockConnect(mode, result)); |
| 218 } | 219 } |
| 219 void SetupSslConnect(net::IoMode mode, int result) { | 220 void SetupSslConnect(net::IoMode mode, int result) { |
| 220 ssl_connect_data_.reset(new net::MockConnect(mode, result)); | 221 ssl_connect_data_.reset(new net::MockConnect(mode, result)); |
| 221 } | 222 } |
| 222 | 223 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 } | 268 } |
| 268 | 269 |
| 269 void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; } | 270 void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; } |
| 270 | 271 |
| 271 MockCastTransport* GetMockTransport() { | 272 MockCastTransport* GetMockTransport() { |
| 272 CHECK(mock_transport_); | 273 CHECK(mock_transport_); |
| 273 return mock_transport_; | 274 return mock_transport_; |
| 274 } | 275 } |
| 275 | 276 |
| 276 private: | 277 private: |
| 277 scoped_ptr<net::TCPClientSocket> CreateTcpSocket() override { | 278 std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override { |
| 278 if (tcp_unresponsive_) { | 279 if (tcp_unresponsive_) { |
| 279 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); | 280 return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true)); |
| 280 } else { | 281 } else { |
| 281 net::MockConnect* connect_data = tcp_connect_data_.get(); | 282 net::MockConnect* connect_data = tcp_connect_data_.get(); |
| 282 connect_data->peer_addr = ip_; | 283 connect_data->peer_addr = ip_; |
| 283 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data)); | 284 return std::unique_ptr<net::TCPClientSocket>( |
| 285 new MockTCPSocket(*connect_data)); |
| 284 } | 286 } |
| 285 } | 287 } |
| 286 | 288 |
| 287 scoped_ptr<net::SSLClientSocket> CreateSslSocket( | 289 std::unique_ptr<net::SSLClientSocket> CreateSslSocket( |
| 288 scoped_ptr<net::StreamSocket> socket) override { | 290 std::unique_ptr<net::StreamSocket> socket) override { |
| 289 net::MockConnect* connect_data = ssl_connect_data_.get(); | 291 net::MockConnect* connect_data = ssl_connect_data_.get(); |
| 290 connect_data->peer_addr = ip_; | 292 connect_data->peer_addr = ip_; |
| 291 | 293 |
| 292 ssl_data_.reset(new net::StaticSocketDataProvider( | 294 ssl_data_.reset(new net::StaticSocketDataProvider( |
| 293 reads_.data(), reads_.size(), writes_.data(), writes_.size())); | 295 reads_.data(), reads_.size(), writes_.data(), writes_.size())); |
| 294 ssl_data_->set_connect_data(*connect_data); | 296 ssl_data_->set_connect_data(*connect_data); |
| 295 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! | 297 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! |
| 296 return scoped_ptr<net::SSLClientSocket>( | 298 return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket( |
| 297 new net::MockTCPClientSocket( | 299 net::AddressList(), &capturing_net_log_, ssl_data_.get())); |
| 298 net::AddressList(), &capturing_net_log_, ssl_data_.get())); | |
| 299 } | 300 } |
| 300 | 301 |
| 301 scoped_refptr<net::X509Certificate> ExtractPeerCert() override { | 302 scoped_refptr<net::X509Certificate> ExtractPeerCert() override { |
| 302 return extract_cert_result_ ? make_scoped_refptr<net::X509Certificate>( | 303 return extract_cert_result_ ? make_scoped_refptr<net::X509Certificate>( |
| 303 new net::X509Certificate( | 304 new net::X509Certificate( |
| 304 "", "", base::Time(), base::Time())) | 305 "", "", base::Time(), base::Time())) |
| 305 : nullptr; | 306 : nullptr; |
| 306 } | 307 } |
| 307 | 308 |
| 308 bool VerifyChallengeReply() override { | 309 bool VerifyChallengeReply() override { |
| 309 EXPECT_FALSE(verify_challenge_disallow_); | 310 EXPECT_FALSE(verify_challenge_disallow_); |
| 310 return verify_challenge_result_; | 311 return verify_challenge_result_; |
| 311 } | 312 } |
| 312 | 313 |
| 313 base::Timer* GetTimer() override { return mock_timer_.get(); } | 314 base::Timer* GetTimer() override { return mock_timer_.get(); } |
| 314 | 315 |
| 315 net::TestNetLog capturing_net_log_; | 316 net::TestNetLog capturing_net_log_; |
| 316 net::IPEndPoint ip_; | 317 net::IPEndPoint ip_; |
| 317 // Simulated connect data | 318 // Simulated connect data |
| 318 scoped_ptr<net::MockConnect> tcp_connect_data_; | 319 std::unique_ptr<net::MockConnect> tcp_connect_data_; |
| 319 scoped_ptr<net::MockConnect> ssl_connect_data_; | 320 std::unique_ptr<net::MockConnect> ssl_connect_data_; |
| 320 // Simulated read / write data | 321 // Simulated read / write data |
| 321 std::vector<net::MockWrite> writes_; | 322 std::vector<net::MockWrite> writes_; |
| 322 std::vector<net::MockRead> reads_; | 323 std::vector<net::MockRead> reads_; |
| 323 scoped_ptr<net::SocketDataProvider> ssl_data_; | 324 std::unique_ptr<net::SocketDataProvider> ssl_data_; |
| 324 // Simulated result of peer cert extraction. | 325 // Simulated result of peer cert extraction. |
| 325 bool extract_cert_result_; | 326 bool extract_cert_result_; |
| 326 // Simulated result of verifying challenge reply. | 327 // Simulated result of verifying challenge reply. |
| 327 bool verify_challenge_result_; | 328 bool verify_challenge_result_; |
| 328 bool verify_challenge_disallow_; | 329 bool verify_challenge_disallow_; |
| 329 // If true, makes TCP connection process stall. For timeout testing. | 330 // If true, makes TCP connection process stall. For timeout testing. |
| 330 bool tcp_unresponsive_; | 331 bool tcp_unresponsive_; |
| 331 scoped_ptr<base::MockTimer> mock_timer_; | 332 std::unique_ptr<base::MockTimer> mock_timer_; |
| 332 MockCastTransport* mock_transport_; | 333 MockCastTransport* mock_transport_; |
| 333 | 334 |
| 334 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); | 335 DISALLOW_COPY_AND_ASSIGN(TestCastSocket); |
| 335 }; | 336 }; |
| 336 | 337 |
| 337 class CastSocketTest : public testing::Test { | 338 class CastSocketTest : public testing::Test { |
| 338 public: | 339 public: |
| 339 CastSocketTest() | 340 CastSocketTest() |
| 340 : logger_( | 341 : logger_( |
| 341 new Logger(make_scoped_ptr<base::Clock>(new base::SimpleTestClock), | 342 new Logger(base::WrapUnique<base::Clock>(new base::SimpleTestClock), |
| 342 base::Time())), | 343 base::Time())), |
| 343 delegate_(new MockDelegate) {} | 344 delegate_(new MockDelegate) {} |
| 344 ~CastSocketTest() override {} | 345 ~CastSocketTest() override {} |
| 345 | 346 |
| 346 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } | 347 void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); } |
| 347 | 348 |
| 348 void TearDown() override { | 349 void TearDown() override { |
| 349 if (socket_.get()) { | 350 if (socket_.get()) { |
| 350 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 351 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 351 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 352 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 378 | 379 |
| 379 protected: | 380 protected: |
| 380 // Runs all pending tasks in the message loop. | 381 // Runs all pending tasks in the message loop. |
| 381 void RunPendingTasks() { | 382 void RunPendingTasks() { |
| 382 base::RunLoop run_loop; | 383 base::RunLoop run_loop; |
| 383 run_loop.RunUntilIdle(); | 384 run_loop.RunUntilIdle(); |
| 384 } | 385 } |
| 385 | 386 |
| 386 base::MessageLoop message_loop_; | 387 base::MessageLoop message_loop_; |
| 387 Logger* logger_; | 388 Logger* logger_; |
| 388 scoped_ptr<TestCastSocket> socket_; | 389 std::unique_ptr<TestCastSocket> socket_; |
| 389 CompleteHandler handler_; | 390 CompleteHandler handler_; |
| 390 scoped_ptr<MockDelegate> delegate_; | 391 std::unique_ptr<MockDelegate> delegate_; |
| 391 | 392 |
| 392 private: | 393 private: |
| 393 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); | 394 DISALLOW_COPY_AND_ASSIGN(CastSocketTest); |
| 394 }; | 395 }; |
| 395 | 396 |
| 396 // Tests connecting and closing the socket. | 397 // Tests connecting and closing the socket. |
| 397 TEST_F(CastSocketTest, TestConnectAndClose) { | 398 TEST_F(CastSocketTest, TestConnectAndClose) { |
| 398 CreateCastSocket(); | 399 CreateCastSocket(); |
| 399 socket_->SetupMockTransport(); | 400 socket_->SetupMockTransport(); |
| 400 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); | 401 socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK); |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); | 886 logger_, cast_channel::CastDeviceCapability::VIDEO_OUT); |
| 886 EXPECT_FALSE(socket_->audio_only()); | 887 EXPECT_FALSE(socket_->audio_only()); |
| 887 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); | 888 EXPECT_TRUE(socket_->TestVerifyChannelPolicyNone()); |
| 888 EXPECT_FALSE(socket_->audio_only()); | 889 EXPECT_FALSE(socket_->audio_only()); |
| 889 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); | 890 EXPECT_FALSE(socket_->TestVerifyChannelPolicyAudioOnly()); |
| 890 EXPECT_TRUE(socket_->audio_only()); | 891 EXPECT_TRUE(socket_->audio_only()); |
| 891 } | 892 } |
| 892 } // namespace cast_channel | 893 } // namespace cast_channel |
| 893 } // namespace api | 894 } // namespace api |
| 894 } // namespace extensions | 895 } // namespace extensions |
| OLD | NEW |