1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard // 5*3f982cf4SFabien Sanglard // The testing message pipe is intended to be used for integrating 6*3f982cf4SFabien Sanglard // sender and receiver sessions (or other consumers of MessagePort). 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #ifndef CAST_STREAMING_TESTING_MESSAGE_PIPE_H_ 9*3f982cf4SFabien Sanglard #define CAST_STREAMING_TESTING_MESSAGE_PIPE_H_ 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include <string> 12*3f982cf4SFabien Sanglard #include <utility> 13*3f982cf4SFabien Sanglard #include <vector> 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard #include "cast/common/public/message_port.h" 16*3f982cf4SFabien Sanglard #include "cast/streaming/message_fields.h" 17*3f982cf4SFabien Sanglard #include "gmock/gmock.h" 18*3f982cf4SFabien Sanglard #include "gtest/gtest.h" 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard namespace openscreen { 21*3f982cf4SFabien Sanglard namespace cast { 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard class MessagePipeEnd : public MessagePort { 24*3f982cf4SFabien Sanglard public: MessagePipeEnd(std::string destination_id)25*3f982cf4SFabien Sanglard explicit MessagePipeEnd(std::string destination_id) 26*3f982cf4SFabien Sanglard : destination_id_(destination_id) {} 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard ~MessagePipeEnd() override = default; 29*3f982cf4SFabien Sanglard SetClient(MessagePort::Client * client,std::string client_sender_id)30*3f982cf4SFabien Sanglard void SetClient(MessagePort::Client* client, 31*3f982cf4SFabien Sanglard std::string client_sender_id) override { 32*3f982cf4SFabien Sanglard sender_id_ = std::move(client_sender_id); 33*3f982cf4SFabien Sanglard client_ = client; 34*3f982cf4SFabien Sanglard } 35*3f982cf4SFabien Sanglard SetOtherEnd(MessagePipeEnd * other_end)36*3f982cf4SFabien Sanglard void SetOtherEnd(MessagePipeEnd* other_end) { 37*3f982cf4SFabien Sanglard ASSERT_FALSE(other_end_); 38*3f982cf4SFabien Sanglard other_end_ = other_end; 39*3f982cf4SFabien Sanglard } 40*3f982cf4SFabien Sanglard ResetClient()41*3f982cf4SFabien Sanglard void ResetClient() override { client_ = nullptr; } 42*3f982cf4SFabien Sanglard ReceiveMessage(const std::string & namespace_,const std::string & message)43*3f982cf4SFabien Sanglard void ReceiveMessage(const std::string& namespace_, 44*3f982cf4SFabien Sanglard const std::string& message) { 45*3f982cf4SFabien Sanglard ASSERT_NE(client_, nullptr); 46*3f982cf4SFabien Sanglard client_->OnMessage(destination_id_, namespace_, message); 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard PostMessage(const std::string & sender_id,const std::string & message_namespace,const std::string & message)49*3f982cf4SFabien Sanglard void PostMessage(const std::string& sender_id, 50*3f982cf4SFabien Sanglard const std::string& message_namespace, 51*3f982cf4SFabien Sanglard const std::string& message) override { 52*3f982cf4SFabien Sanglard ASSERT_NE(other_end_, nullptr); 53*3f982cf4SFabien Sanglard other_end_->ReceiveMessage(message_namespace, message); 54*3f982cf4SFabien Sanglard } 55*3f982cf4SFabien Sanglard 56*3f982cf4SFabien Sanglard private: 57*3f982cf4SFabien Sanglard std::string sender_id_; 58*3f982cf4SFabien Sanglard std::string destination_id_; 59*3f982cf4SFabien Sanglard MessagePort::Client* client_ = nullptr; 60*3f982cf4SFabien Sanglard MessagePipeEnd* other_end_ = nullptr; 61*3f982cf4SFabien Sanglard }; 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard class MessagePipe { 64*3f982cf4SFabien Sanglard public: MessagePipe(std::string left_id,std::string right_id)65*3f982cf4SFabien Sanglard explicit MessagePipe(std::string left_id, std::string right_id) 66*3f982cf4SFabien Sanglard : left_id_(std::move(right_id)), 67*3f982cf4SFabien Sanglard right_id_(std::move(left_id)), 68*3f982cf4SFabien Sanglard left_(left_id_), 69*3f982cf4SFabien Sanglard right_(right_id_) { 70*3f982cf4SFabien Sanglard left_.SetOtherEnd(&right_); 71*3f982cf4SFabien Sanglard right_.SetOtherEnd(&left_); 72*3f982cf4SFabien Sanglard } 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglard // Access the ends of the pipe, which can be used as a standard 75*3f982cf4SFabien Sanglard // message port. left()76*3f982cf4SFabien Sanglard MessagePipeEnd* left() { return &left_; } right()77*3f982cf4SFabien Sanglard MessagePipeEnd* right() { return &right_; } 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard private: 80*3f982cf4SFabien Sanglard std::string left_id_; 81*3f982cf4SFabien Sanglard std::string right_id_; 82*3f982cf4SFabien Sanglard MessagePipeEnd left_; 83*3f982cf4SFabien Sanglard MessagePipeEnd right_; 84*3f982cf4SFabien Sanglard }; 85*3f982cf4SFabien Sanglard 86*3f982cf4SFabien Sanglard } // namespace cast 87*3f982cf4SFabien Sanglard } // namespace openscreen 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard #endif // CAST_STREAMING_TESTING_MESSAGE_PIPE_H_ 90