// Copyright 2019 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. #ifndef CAST_COMMON_CHANNEL_TESTING_FAKE_CAST_SOCKET_H_ #define CAST_COMMON_CHANNEL_TESTING_FAKE_CAST_SOCKET_H_ #include #include "cast/common/channel/proto/cast_channel.pb.h" #include "cast/common/public/cast_socket.h" #include "gmock/gmock.h" #include "platform/test/mock_tls_connection.h" namespace openscreen { namespace cast { class MockCastSocketClient final : public CastSocket::Client { public: ~MockCastSocketClient() override = default; MOCK_METHOD(void, OnError, (CastSocket * socket, Error error), (override)); MOCK_METHOD(void, OnMessage, (CastSocket * socket, ::cast::channel::CastMessage message), (override)); }; struct FakeCastSocket { FakeCastSocket() : FakeCastSocket({{10, 0, 1, 7}, 1234}, {{10, 0, 1, 9}, 4321}) {} FakeCastSocket(const IPEndpoint& local_endpoint, const IPEndpoint& remote_endpoint) : local_endpoint(local_endpoint), remote_endpoint(remote_endpoint), moved_connection(std::make_unique(local_endpoint, remote_endpoint)), connection(moved_connection.get()), socket(std::move(moved_connection), &mock_client) {} IPEndpoint local_endpoint; IPEndpoint remote_endpoint; std::unique_ptr moved_connection; MockTlsConnection* connection; MockCastSocketClient mock_client; CastSocket socket; }; // Two FakeCastSockets that are piped together via their MockTlsConnection // read/write methods. Calling SendMessage on |socket| will result in an // OnMessage callback on |mock_peer_client| and vice versa for |peer_socket| and // |mock_client|. struct FakeCastSocketPair { FakeCastSocketPair() : FakeCastSocketPair({{10, 0, 1, 7}, 1234}, {{10, 0, 1, 9}, 4321}) {} FakeCastSocketPair(const IPEndpoint& local_endpoint, const IPEndpoint& remote_endpoint) : local_endpoint(local_endpoint), remote_endpoint(remote_endpoint) { using ::testing::_; using ::testing::Invoke; auto moved_connection = std::make_unique<::testing::NiceMock>( local_endpoint, remote_endpoint); connection = moved_connection.get(); socket = std::make_unique(std::move(moved_connection), &mock_client); auto moved_peer = std::make_unique<::testing::NiceMock>( remote_endpoint, local_endpoint); peer_connection = moved_peer.get(); peer_socket = std::make_unique(std::move(moved_peer), &mock_peer_client); ON_CALL(*connection, Send(_, _)) .WillByDefault(Invoke([this](const void* data, size_t len) { peer_connection->OnRead(std::vector( reinterpret_cast(data), reinterpret_cast(data) + len)); return true; })); ON_CALL(*peer_connection, Send(_, _)) .WillByDefault(Invoke([this](const void* data, size_t len) { connection->OnRead(std::vector( reinterpret_cast(data), reinterpret_cast(data) + len)); return true; })); } ~FakeCastSocketPair() = default; IPEndpoint local_endpoint; IPEndpoint remote_endpoint; ::testing::NiceMock* connection; MockCastSocketClient mock_client; std::unique_ptr socket; ::testing::NiceMock* peer_connection; MockCastSocketClient mock_peer_client; std::unique_ptr peer_socket; }; } // namespace cast } // namespace openscreen #endif // CAST_COMMON_CHANNEL_TESTING_FAKE_CAST_SOCKET_H_