| Index: extensions/browser/api/cast_channel/cast_socket_unittest.cc
|
| diff --git a/extensions/browser/api/cast_channel/cast_socket_unittest.cc b/extensions/browser/api/cast_channel/cast_socket_unittest.cc
|
| deleted file mode 100644
|
| index bbd47674826a99dd24f0d33787ed300dfb7a6bf1..0000000000000000000000000000000000000000
|
| --- a/extensions/browser/api/cast_channel/cast_socket_unittest.cc
|
| +++ /dev/null
|
| @@ -1,794 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "extensions/browser/api/cast_channel/cast_socket.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/location.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/sys_byteorder.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "base/timer/mock_timer.h"
|
| -#include "extensions/browser/api/cast_channel/cast_auth_util.h"
|
| -#include "extensions/browser/api/cast_channel/cast_framer.h"
|
| -#include "extensions/browser/api/cast_channel/cast_message_util.h"
|
| -#include "extensions/browser/api/cast_channel/cast_test_util.h"
|
| -#include "extensions/browser/api/cast_channel/cast_transport.h"
|
| -#include "extensions/browser/api/cast_channel/logger.h"
|
| -#include "extensions/common/api/cast_channel/cast_channel.pb.h"
|
| -#include "extensions/common/api/cast_channel/logging.pb.h"
|
| -#include "net/base/address_list.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/log/test_net_log.h"
|
| -#include "net/socket/socket_test_util.h"
|
| -#include "net/socket/ssl_client_socket.h"
|
| -#include "net/socket/tcp_client_socket.h"
|
| -#include "net/ssl/ssl_info.h"
|
| -#include "net/test/cert_test_util.h"
|
| -#include "net/test/test_data_directory.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -const int64_t kDistantTimeoutMillis = 100000; // 100 seconds (never hit).
|
| -
|
| -using ::cast_channel::ChannelError;
|
| -using ::cast_channel::ChannelAuthType;
|
| -using ::cast_channel::ReadyState;
|
| -using ::testing::_;
|
| -using ::testing::A;
|
| -using ::testing::DoAll;
|
| -using ::testing::Invoke;
|
| -using ::testing::InvokeArgument;
|
| -using ::testing::NotNull;
|
| -using ::testing::Return;
|
| -using ::testing::SaveArg;
|
| -
|
| -namespace extensions {
|
| -namespace api {
|
| -namespace cast_channel {
|
| -const char kAuthNamespace[] = "urn:x-cast:com.google.cast.tp.deviceauth";
|
| -
|
| -// Returns an auth challenge message inline.
|
| -CastMessage CreateAuthChallenge() {
|
| - CastMessage output;
|
| - CreateAuthChallengeMessage(&output, AuthContext::Create());
|
| - return output;
|
| -}
|
| -
|
| -// Returns an auth challenge response message inline.
|
| -CastMessage CreateAuthReply() {
|
| - CastMessage output;
|
| - output.set_protocol_version(CastMessage::CASTV2_1_0);
|
| - output.set_source_id("sender-0");
|
| - output.set_destination_id("receiver-0");
|
| - output.set_payload_type(CastMessage::BINARY);
|
| - output.set_payload_binary("abcd");
|
| - output.set_namespace_(kAuthNamespace);
|
| - return output;
|
| -}
|
| -
|
| -CastMessage CreateTestMessage() {
|
| - CastMessage test_message;
|
| - test_message.set_protocol_version(CastMessage::CASTV2_1_0);
|
| - test_message.set_namespace_("ns");
|
| - test_message.set_source_id("source");
|
| - test_message.set_destination_id("dest");
|
| - test_message.set_payload_type(CastMessage::STRING);
|
| - test_message.set_payload_utf8("payload");
|
| - return test_message;
|
| -}
|
| -
|
| -class MockTCPSocket : public net::TCPClientSocket {
|
| - public:
|
| - explicit MockTCPSocket(const net::MockConnect& connect_data)
|
| - : TCPClientSocket(net::AddressList(),
|
| - nullptr,
|
| - nullptr,
|
| - net::NetLogSource()),
|
| - connect_data_(connect_data),
|
| - do_nothing_(false) {}
|
| -
|
| - explicit MockTCPSocket(bool do_nothing)
|
| - : TCPClientSocket(net::AddressList(),
|
| - nullptr,
|
| - nullptr,
|
| - net::NetLogSource()) {
|
| - CHECK(do_nothing);
|
| - do_nothing_ = do_nothing;
|
| - }
|
| -
|
| - virtual int Connect(const net::CompletionCallback& callback) {
|
| - if (do_nothing_) {
|
| - // Stall the I/O event loop.
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - if (connect_data_.mode == net::ASYNC) {
|
| - CHECK_NE(connect_data_.result, net::ERR_IO_PENDING);
|
| - base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE, base::Bind(callback, connect_data_.result));
|
| - return net::ERR_IO_PENDING;
|
| - } else {
|
| - return connect_data_.result;
|
| - }
|
| - }
|
| -
|
| - virtual bool SetKeepAlive(bool enable, int delay) {
|
| - // Always return true in tests
|
| - return true;
|
| - }
|
| -
|
| - virtual bool SetNoDelay(bool no_delay) {
|
| - // Always return true in tests
|
| - return true;
|
| - }
|
| -
|
| - MOCK_METHOD3(Read,
|
| - int(net::IOBuffer*, int, const net::CompletionCallback&));
|
| - MOCK_METHOD3(Write,
|
| - int(net::IOBuffer*, int, const net::CompletionCallback&));
|
| -
|
| - virtual void Disconnect() {
|
| - // Do nothing in tests
|
| - }
|
| -
|
| - private:
|
| - net::MockConnect connect_data_;
|
| - bool do_nothing_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockTCPSocket);
|
| -};
|
| -
|
| -class MockDelegate : public CastTransport::Delegate {
|
| - public:
|
| - MockDelegate() {}
|
| - virtual ~MockDelegate() {}
|
| - MOCK_METHOD1(OnError, void(ChannelError error_state));
|
| - MOCK_METHOD1(OnMessage, void(const CastMessage& message));
|
| - MOCK_METHOD0(Start, void());
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(MockDelegate);
|
| -};
|
| -
|
| -class CompleteHandler {
|
| - public:
|
| - CompleteHandler() {}
|
| - MOCK_METHOD1(OnCloseComplete, void(int result));
|
| - MOCK_METHOD1(OnConnectComplete, void(ChannelError error_state));
|
| - MOCK_METHOD1(OnWriteComplete, void(int result));
|
| - MOCK_METHOD1(OnReadComplete, void(int result));
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
|
| -};
|
| -
|
| -class TestCastSocket : public CastSocketImpl {
|
| - public:
|
| - static std::unique_ptr<TestCastSocket> CreateSecure(
|
| - Logger* logger,
|
| - uint64_t device_capabilities = cast_channel::CastDeviceCapability::NONE) {
|
| - return std::unique_ptr<TestCastSocket>(new TestCastSocket(
|
| - CreateIPEndPointForTest(), ChannelAuthType::SSL_VERIFIED,
|
| - kDistantTimeoutMillis, logger, device_capabilities));
|
| - }
|
| -
|
| - TestCastSocket(const net::IPEndPoint& ip_endpoint,
|
| - ChannelAuthType channel_auth,
|
| - int64_t timeout_ms,
|
| - Logger* logger,
|
| - uint64_t device_capabilities)
|
| - : TestCastSocket(ip_endpoint,
|
| - channel_auth,
|
| - timeout_ms,
|
| - logger,
|
| - new net::TestNetLog(),
|
| - device_capabilities) {}
|
| -
|
| - TestCastSocket(const net::IPEndPoint& ip_endpoint,
|
| - ChannelAuthType channel_auth,
|
| - int64_t timeout_ms,
|
| - Logger* logger,
|
| - net::TestNetLog* capturing_net_log,
|
| - uint64_t device_capabilities)
|
| - : CastSocketImpl("some_extension_id",
|
| - ip_endpoint,
|
| - channel_auth,
|
| - capturing_net_log,
|
| - base::TimeDelta::FromMilliseconds(timeout_ms),
|
| - false,
|
| - logger,
|
| - device_capabilities,
|
| - AuthContext::Create()),
|
| - capturing_net_log_(capturing_net_log),
|
| - ip_(ip_endpoint),
|
| - extract_cert_result_(true),
|
| - verify_challenge_result_(true),
|
| - verify_challenge_disallow_(false),
|
| - tcp_unresponsive_(false),
|
| - mock_timer_(new base::MockTimer(false, false)),
|
| - mock_transport_(nullptr) {}
|
| -
|
| - ~TestCastSocket() override {}
|
| -
|
| - void SetupMockTransport() {
|
| - mock_transport_ = new MockCastTransport;
|
| - SetTransportForTesting(base::WrapUnique(mock_transport_));
|
| - }
|
| -
|
| - // Socket connection helpers.
|
| - void SetupTcpConnect(net::IoMode mode, int result) {
|
| - tcp_connect_data_.reset(new net::MockConnect(mode, result));
|
| - }
|
| - void SetupSslConnect(net::IoMode mode, int result) {
|
| - ssl_connect_data_.reset(new net::MockConnect(mode, result));
|
| - }
|
| -
|
| - // Socket I/O helpers.
|
| - void AddWriteResult(const net::MockWrite& write) {
|
| - writes_.push_back(write);
|
| - }
|
| - void AddWriteResult(net::IoMode mode, int result) {
|
| - AddWriteResult(net::MockWrite(mode, result));
|
| - }
|
| - void AddWriteResultForData(net::IoMode mode, const std::string& msg) {
|
| - AddWriteResult(mode, msg.size());
|
| - }
|
| - void AddReadResult(const net::MockRead& read) {
|
| - reads_.push_back(read);
|
| - }
|
| - void AddReadResult(net::IoMode mode, int result) {
|
| - AddReadResult(net::MockRead(mode, result));
|
| - }
|
| - void AddReadResultForData(net::IoMode mode, const std::string& data) {
|
| - AddReadResult(net::MockRead(mode, data.c_str(), data.size()));
|
| - }
|
| -
|
| - // Helpers for modifying other connection-related behaviors.
|
| - void SetupTcpConnectUnresponsive() { tcp_unresponsive_ = true; }
|
| -
|
| - void SetExtractCertResult(bool value) {
|
| - extract_cert_result_ = value;
|
| - }
|
| -
|
| - void SetVerifyChallengeResult(bool value) {
|
| - verify_challenge_result_ = value;
|
| - }
|
| -
|
| - void TriggerTimeout() {
|
| - mock_timer_->Fire();
|
| - }
|
| -
|
| - bool TestVerifyChannelPolicyNone() {
|
| - AuthResult authResult;
|
| - return VerifyChannelPolicy(authResult);
|
| - }
|
| -
|
| - bool TestVerifyChannelPolicyAudioOnly() {
|
| - AuthResult authResult;
|
| - authResult.channel_policies |= AuthResult::POLICY_AUDIO_ONLY;
|
| - return VerifyChannelPolicy(authResult);
|
| - }
|
| -
|
| - void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; }
|
| -
|
| - MockCastTransport* GetMockTransport() {
|
| - CHECK(mock_transport_);
|
| - return mock_transport_;
|
| - }
|
| -
|
| - private:
|
| - std::unique_ptr<net::TCPClientSocket> CreateTcpSocket() override {
|
| - if (tcp_unresponsive_) {
|
| - return std::unique_ptr<net::TCPClientSocket>(new MockTCPSocket(true));
|
| - } else {
|
| - net::MockConnect* connect_data = tcp_connect_data_.get();
|
| - connect_data->peer_addr = ip_;
|
| - return std::unique_ptr<net::TCPClientSocket>(
|
| - new MockTCPSocket(*connect_data));
|
| - }
|
| - }
|
| -
|
| - std::unique_ptr<net::SSLClientSocket> CreateSslSocket(
|
| - std::unique_ptr<net::StreamSocket> socket) override {
|
| - net::MockConnect* connect_data = ssl_connect_data_.get();
|
| - connect_data->peer_addr = ip_;
|
| -
|
| - ssl_data_.reset(new net::StaticSocketDataProvider(
|
| - reads_.data(), reads_.size(), writes_.data(), writes_.size()));
|
| - ssl_data_->set_connect_data(*connect_data);
|
| - // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !!
|
| - return std::unique_ptr<net::SSLClientSocket>(new net::MockTCPClientSocket(
|
| - net::AddressList(), capturing_net_log_.get(), ssl_data_.get()));
|
| - }
|
| -
|
| - scoped_refptr<net::X509Certificate> ExtractPeerCert() override {
|
| - return extract_cert_result_
|
| - ? net::ImportCertFromFile(net::GetTestCertsDirectory(),
|
| - "ok_cert.pem")
|
| - : nullptr;
|
| - }
|
| -
|
| - bool VerifyChallengeReply() override {
|
| - EXPECT_FALSE(verify_challenge_disallow_);
|
| - return verify_challenge_result_;
|
| - }
|
| -
|
| - base::Timer* GetTimer() override { return mock_timer_.get(); }
|
| -
|
| - std::unique_ptr<net::TestNetLog> capturing_net_log_;
|
| - net::IPEndPoint ip_;
|
| - // Simulated connect data
|
| - std::unique_ptr<net::MockConnect> tcp_connect_data_;
|
| - std::unique_ptr<net::MockConnect> ssl_connect_data_;
|
| - // Simulated read / write data
|
| - std::vector<net::MockWrite> writes_;
|
| - std::vector<net::MockRead> reads_;
|
| - std::unique_ptr<net::SocketDataProvider> ssl_data_;
|
| - // Simulated result of peer cert extraction.
|
| - bool extract_cert_result_;
|
| - // Simulated result of verifying challenge reply.
|
| - bool verify_challenge_result_;
|
| - bool verify_challenge_disallow_;
|
| - // If true, makes TCP connection process stall. For timeout testing.
|
| - bool tcp_unresponsive_;
|
| - std::unique_ptr<base::MockTimer> mock_timer_;
|
| - MockCastTransport* mock_transport_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestCastSocket);
|
| -};
|
| -
|
| -class CastSocketTest : public testing::Test {
|
| - public:
|
| - CastSocketTest() : logger_(new Logger()), delegate_(new MockDelegate) {}
|
| - ~CastSocketTest() override {}
|
| -
|
| - void SetUp() override { EXPECT_CALL(*delegate_, OnMessage(_)).Times(0); }
|
| -
|
| - void TearDown() override {
|
| - if (socket_.get()) {
|
| - EXPECT_CALL(handler_, OnCloseComplete(net::OK));
|
| - socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
|
| - base::Unretained(&handler_)));
|
| - }
|
| - }
|
| -
|
| - void CreateCastSocketSecure() {
|
| - socket_ = TestCastSocket::CreateSecure(logger_);
|
| - }
|
| -
|
| - void HandleAuthHandshake() {
|
| - socket_->SetupMockTransport();
|
| - CastMessage challenge_proto = CreateAuthChallenge();
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(challenge_proto), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::OK));
|
| - EXPECT_CALL(*socket_->GetMockTransport(), Start());
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::NONE));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - socket_->GetMockTransport()->current_delegate()->OnMessage(
|
| - CreateAuthReply());
|
| - RunPendingTasks();
|
| - }
|
| -
|
| - protected:
|
| - // Runs all pending tasks in the message loop.
|
| - void RunPendingTasks() {
|
| - base::RunLoop run_loop;
|
| - run_loop.RunUntilIdle();
|
| - }
|
| -
|
| - base::MessageLoop message_loop_;
|
| - Logger* logger_;
|
| - std::unique_ptr<TestCastSocket> socket_;
|
| - CompleteHandler handler_;
|
| - std::unique_ptr<MockDelegate> delegate_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(CastSocketTest);
|
| -};
|
| -
|
| -// Tests that the following connection flow works:
|
| -// - TCP connection succeeds (async)
|
| -// - SSL connection succeeds (async)
|
| -// - Cert is extracted successfully
|
| -// - Challenge request is sent (async)
|
| -// - Challenge response is received (async)
|
| -// - Credentials are verified successfuly
|
| -TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnect(net::ASYNC, net::OK);
|
| - socket_->SetupSslConnect(net::ASYNC, net::OK);
|
| -
|
| - HandleAuthHandshake();
|
| -
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -}
|
| -
|
| -// Tests that the following connection flow works:
|
| -// - TCP connection succeeds (sync)
|
| -// - SSL connection succeeds (sync)
|
| -// - Cert is extracted successfully
|
| -// - Challenge request is sent (sync)
|
| -// - Challenge response is received (sync)
|
| -// - Credentials are verified successfuly
|
| -TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK);
|
| -
|
| - HandleAuthHandshake();
|
| -
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -}
|
| -
|
| -// Test that an AuthMessage with a mangled namespace triggers cancelation
|
| -// of the connection event loop.
|
| -TEST_F(CastSocketTest, TestConnectAuthMessageCorrupted) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupMockTransport();
|
| -
|
| - socket_->SetupTcpConnect(net::ASYNC, net::OK);
|
| - socket_->SetupSslConnect(net::ASYNC, net::OK);
|
| -
|
| - CastMessage challenge_proto = CreateAuthChallenge();
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(challenge_proto), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::OK));
|
| - EXPECT_CALL(*socket_->GetMockTransport(), Start());
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::TRANSPORT_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - CastMessage mangled_auth_reply = CreateAuthReply();
|
| - mangled_auth_reply.set_namespace_("BOGUS_NAMESPACE");
|
| -
|
| - socket_->GetMockTransport()->current_delegate()->OnMessage(
|
| - mangled_auth_reply);
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::TRANSPORT_ERROR, socket_->error_state());
|
| -
|
| - // Verifies that the CastSocket's resources were torn down during channel
|
| - // close. (see http://crbug.com/504078)
|
| - EXPECT_EQ(nullptr, socket_->transport());
|
| -}
|
| -
|
| -// Test connection error - TCP connect fails (async)
|
| -TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::ASYNC, net::ERR_FAILED);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - TCP connect fails (sync)
|
| -TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::ERR_FAILED);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - timeout
|
| -TEST_F(CastSocketTest, TestConnectTcpTimeoutError) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnectUnresponsive();
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_TIMEOUT));
|
| - EXPECT_CALL(*delegate_, OnError(ChannelError::CONNECT_TIMEOUT));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CONNECTING, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| - socket_->TriggerTimeout();
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_TIMEOUT, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - TCP socket returns timeout
|
| -TEST_F(CastSocketTest, TestConnectTcpSocketTimeoutError) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::ERR_CONNECTION_TIMED_OUT);
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_TIMEOUT));
|
| - EXPECT_CALL(*delegate_, OnError(ChannelError::CONNECT_TIMEOUT));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_TIMEOUT, socket_->error_state());
|
| - EXPECT_EQ(net::ERR_CONNECTION_TIMED_OUT,
|
| - logger_->GetLastErrors(socket_->id()).net_return_value);
|
| -}
|
| -
|
| -// Test connection error - SSL connect fails (async)
|
| -TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::ERR_FAILED);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::AUTHENTICATION_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::AUTHENTICATION_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - SSL connect fails (sync)
|
| -TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::ERR_FAILED);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::AUTHENTICATION_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::AUTHENTICATION_ERROR, socket_->error_state());
|
| - EXPECT_EQ(net::ERR_FAILED,
|
| - logger_->GetLastErrors(socket_->id()).net_return_value);
|
| -}
|
| -
|
| -// Test connection error - SSL connect times out (sync)
|
| -TEST_F(CastSocketTest, TestConnectSslConnectTimeoutSync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::ERR_CONNECTION_TIMED_OUT);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_TIMEOUT));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_TIMEOUT, socket_->error_state());
|
| - EXPECT_EQ(net::ERR_CONNECTION_TIMED_OUT,
|
| - logger_->GetLastErrors(socket_->id()).net_return_value);
|
| -}
|
| -
|
| -// Test connection error - SSL connect times out (async)
|
| -TEST_F(CastSocketTest, TestConnectSslConnectTimeoutAsync) {
|
| - CreateCastSocketSecure();
|
| -
|
| - socket_->SetupTcpConnect(net::ASYNC, net::OK);
|
| - socket_->SetupSslConnect(net::ASYNC, net::ERR_CONNECTION_TIMED_OUT);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CONNECT_TIMEOUT));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CONNECT_TIMEOUT, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - challenge send fails
|
| -TEST_F(CastSocketTest, TestConnectChallengeSendError) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupMockTransport();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK);
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(CreateAuthChallenge()), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::ERR_CONNECTION_RESET));
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CAST_SOCKET_ERROR));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CAST_SOCKET_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -// Test connection error - connection is destroyed after the challenge is
|
| -// sent, with the async result still lurking in the task queue.
|
| -TEST_F(CastSocketTest, TestConnectDestroyedAfterChallengeSent) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupMockTransport();
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK);
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(CreateAuthChallenge()), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::ERR_CONNECTION_RESET));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - socket_.reset();
|
| - RunPendingTasks();
|
| -}
|
| -
|
| -// Test connection error - challenge reply receive fails
|
| -TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupMockTransport();
|
| -
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK);
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(CreateAuthChallenge()), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::OK));
|
| - socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_FAILED);
|
| - EXPECT_CALL(*delegate_, OnError(ChannelError::CAST_SOCKET_ERROR));
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::CAST_SOCKET_ERROR));
|
| - EXPECT_CALL(*socket_->GetMockTransport(), Start());
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - socket_->GetMockTransport()->current_delegate()->OnError(
|
| - ChannelError::CAST_SOCKET_ERROR);
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::CAST_SOCKET_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupMockTransport();
|
| - socket_->SetupTcpConnect(net::ASYNC, net::OK);
|
| - socket_->SetupSslConnect(net::ASYNC, net::OK);
|
| - socket_->SetVerifyChallengeResult(false);
|
| -
|
| - EXPECT_CALL(*delegate_, OnError(ChannelError::AUTHENTICATION_ERROR));
|
| - CastMessage challenge_proto = CreateAuthChallenge();
|
| - EXPECT_CALL(*socket_->GetMockTransport(),
|
| - SendMessage(EqualsProto(challenge_proto), _))
|
| - .WillOnce(PostCompletionCallbackTask<1>(net::OK));
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::AUTHENTICATION_ERROR));
|
| - EXPECT_CALL(*socket_->GetMockTransport(), Start());
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - socket_->GetMockTransport()->current_delegate()->OnMessage(CreateAuthReply());
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::CLOSED, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::AUTHENTICATION_ERROR, socket_->error_state());
|
| -}
|
| -
|
| -// Sends message data through an actual non-mocked CastTransport object,
|
| -// testing the two components in integration.
|
| -TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportAsync) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnect(net::ASYNC, net::OK);
|
| - socket_->SetupSslConnect(net::ASYNC, net::OK);
|
| -
|
| - // Set low-level auth challenge expectations.
|
| - CastMessage challenge = CreateAuthChallenge();
|
| - std::string challenge_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str));
|
| - socket_->AddWriteResultForData(net::ASYNC, challenge_str);
|
| -
|
| - // Set low-level auth reply expectations.
|
| - CastMessage reply = CreateAuthReply();
|
| - std::string reply_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str));
|
| - socket_->AddReadResultForData(net::ASYNC, reply_str);
|
| - socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
|
| -
|
| - CastMessage test_message = CreateTestMessage();
|
| - std::string test_message_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str));
|
| - socket_->AddWriteResultForData(net::ASYNC, test_message_str);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::NONE));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -
|
| - // Send the test message through a real transport object.
|
| - EXPECT_CALL(handler_, OnWriteComplete(net::OK));
|
| - socket_->transport()->SendMessage(
|
| - test_message, base::Bind(&CompleteHandler::OnWriteComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -}
|
| -
|
| -// Same as TestConnectEndToEndWithRealTransportAsync, except synchronous.
|
| -TEST_F(CastSocketTest, TestConnectEndToEndWithRealTransportSync) {
|
| - CreateCastSocketSecure();
|
| - socket_->SetupTcpConnect(net::SYNCHRONOUS, net::OK);
|
| - socket_->SetupSslConnect(net::SYNCHRONOUS, net::OK);
|
| -
|
| - // Set low-level auth challenge expectations.
|
| - CastMessage challenge = CreateAuthChallenge();
|
| - std::string challenge_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(challenge, &challenge_str));
|
| - socket_->AddWriteResultForData(net::SYNCHRONOUS, challenge_str);
|
| -
|
| - // Set low-level auth reply expectations.
|
| - CastMessage reply = CreateAuthReply();
|
| - std::string reply_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(reply, &reply_str));
|
| - socket_->AddReadResultForData(net::SYNCHRONOUS, reply_str);
|
| - socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
|
| -
|
| - CastMessage test_message = CreateTestMessage();
|
| - std::string test_message_str;
|
| - EXPECT_TRUE(MessageFramer::Serialize(test_message, &test_message_str));
|
| - socket_->AddWriteResultForData(net::SYNCHRONOUS, test_message_str);
|
| -
|
| - EXPECT_CALL(handler_, OnConnectComplete(ChannelError::NONE));
|
| - socket_->Connect(std::move(delegate_),
|
| - base::Bind(&CompleteHandler::OnConnectComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -
|
| - // Send the test message through a real transport object.
|
| - EXPECT_CALL(handler_, OnWriteComplete(net::OK));
|
| - socket_->transport()->SendMessage(
|
| - test_message, base::Bind(&CompleteHandler::OnWriteComplete,
|
| - base::Unretained(&handler_)));
|
| - RunPendingTasks();
|
| -
|
| - EXPECT_EQ(ReadyState::OPEN, socket_->ready_state());
|
| - EXPECT_EQ(ChannelError::NONE, socket_->error_state());
|
| -}
|
| -
|
| -} // namespace cast_channel
|
| -} // namespace api
|
| -} // namespace extensions
|
|
|